[KeyInstr][Clang] Store-like builtin atoms

This commit is contained in:
Orlando Cazalet-Hyams 2025-04-04 14:36:43 +01:00
parent 6741ef34bd
commit 5408901bc6
2 changed files with 65 additions and 10 deletions

View File

@ -4100,7 +4100,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
Value *SizeVal = EmitScalarExpr(E->getArg(1));
EmitNonNullArgCheck(Dest, E->getArg(0)->getType(),
E->getArg(0)->getExprLoc(), FD, 0);
Builder.CreateMemSet(Dest, Builder.getInt8(0), SizeVal, false);
auto *I = Builder.CreateMemSet(Dest, Builder.getInt8(0), SizeVal, false);
addInstToNewSourceAtom(I, nullptr);
return RValue::get(nullptr);
}
@ -4115,7 +4116,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
EmitNonNullArgCheck(RValue::get(Dest.emitRawPointer(*this)),
E->getArg(1)->getType(), E->getArg(1)->getExprLoc(), FD,
0);
Builder.CreateMemMove(Dest, Src, SizeVal, false);
auto *I = Builder.CreateMemMove(Dest, Src, SizeVal, false);
addInstToNewSourceAtom(I, nullptr);
return RValue::get(nullptr);
}
@ -4128,7 +4130,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
Value *SizeVal = EmitScalarExpr(E->getArg(2));
EmitArgCheck(TCK_Store, Dest, E->getArg(0), 0);
EmitArgCheck(TCK_Load, Src, E->getArg(1), 1);
Builder.CreateMemCpy(Dest, Src, SizeVal, false);
auto *I = Builder.CreateMemCpy(Dest, Src, SizeVal, false);
addInstToNewSourceAtom(I, nullptr);
if (BuiltinID == Builtin::BImempcpy ||
BuiltinID == Builtin::BI__builtin_mempcpy)
return RValue::get(Builder.CreateInBoundsGEP(
@ -4144,7 +4147,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
E->getArg(2)->EvaluateKnownConstInt(getContext()).getZExtValue();
EmitArgCheck(TCK_Store, Dest, E->getArg(0), 0);
EmitArgCheck(TCK_Load, Src, E->getArg(1), 1);
Builder.CreateMemCpyInline(Dest, Src, Size);
auto *I = Builder.CreateMemCpyInline(Dest, Src, Size);
addInstToNewSourceAtom(I, nullptr);
return RValue::get(nullptr);
}
@ -4165,7 +4169,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
Address Dest = EmitPointerWithAlignment(E->getArg(0));
Address Src = EmitPointerWithAlignment(E->getArg(1));
Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size);
Builder.CreateMemCpy(Dest, Src, SizeVal, false);
auto *I = Builder.CreateMemCpy(Dest, Src, SizeVal, false);
addInstToNewSourceAtom(I, nullptr);
return RValue::get(Dest, *this);
}
@ -4191,7 +4196,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
Address Dest = EmitPointerWithAlignment(E->getArg(0));
Address Src = EmitPointerWithAlignment(E->getArg(1));
Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size);
Builder.CreateMemMove(Dest, Src, SizeVal, false);
auto *I = Builder.CreateMemMove(Dest, Src, SizeVal, false);
addInstToNewSourceAtom(I, nullptr);
return RValue::get(Dest, *this);
}
@ -4202,7 +4208,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
Value *SizeVal = EmitScalarExpr(E->getArg(2));
EmitArgCheck(TCK_Store, Dest, E->getArg(0), 0);
EmitArgCheck(TCK_Load, Src, E->getArg(1), 1);
Builder.CreateMemMove(Dest, Src, SizeVal, false);
auto *I = Builder.CreateMemMove(Dest, Src, SizeVal, false);
addInstToNewSourceAtom(I, nullptr);
return RValue::get(Dest, *this);
}
case Builtin::BImemset:
@ -4213,7 +4220,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
Value *SizeVal = EmitScalarExpr(E->getArg(2));
EmitNonNullArgCheck(Dest, E->getArg(0)->getType(),
E->getArg(0)->getExprLoc(), FD, 0);
Builder.CreateMemSet(Dest, ByteVal, SizeVal, false);
auto *I = Builder.CreateMemSet(Dest, ByteVal, SizeVal, false);
addInstToNewSourceAtom(I, nullptr);
return RValue::get(Dest, *this);
}
case Builtin::BI__builtin_memset_inline: {
@ -4225,7 +4233,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
EmitNonNullArgCheck(RValue::get(Dest.emitRawPointer(*this)),
E->getArg(0)->getType(), E->getArg(0)->getExprLoc(), FD,
0);
Builder.CreateMemSetInline(Dest, ByteVal, Size);
auto *I = Builder.CreateMemSetInline(Dest, ByteVal, Size);
addInstToNewSourceAtom(I, nullptr);
return RValue::get(nullptr);
}
case Builtin::BI__builtin___memset_chk: {
@ -4242,7 +4251,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
Value *ByteVal = Builder.CreateTrunc(EmitScalarExpr(E->getArg(1)),
Builder.getInt8Ty());
Value *SizeVal = llvm::ConstantInt::get(Builder.getContext(), Size);
Builder.CreateMemSet(Dest, ByteVal, SizeVal, false);
auto *I = Builder.CreateMemSet(Dest, ByteVal, SizeVal, false);
addInstToNewSourceAtom(I, nullptr);
return RValue::get(Dest, *this);
}
case Builtin::BI__builtin_wmemchr: {

View File

@ -8,6 +8,7 @@
typedef float m2x2 __attribute__((matrix_type(2, 2)));
m2x2 mat;
float f4[4];
float f8[8];
void fun() {
// CHECK: %a = alloca ptr, align 8
@ -23,6 +24,39 @@ void fun() {
// CHECK: call void @llvm.matrix.column.major.store.v4f32{{.*}}, !dbg [[G3R1:!.*]]
__builtin_matrix_column_major_store(mat, f4, sizeof(float) * 2);
// CHECK: call void @llvm.memset{{.*}}, !dbg [[G4R1:!.*]]
__builtin_bzero(f4, sizeof(float) * 2);
// CHECK: call void @llvm.memmove{{.*}}, !dbg [[G5R1:!.*]]
__builtin_bcopy(f4, f8, sizeof(float) * 4);
// CHECK: call void @llvm.memcpy{{.*}}, !dbg [[G6R1:!.*]]
__builtin_memcpy(f4, f8, sizeof(float) * 4);
// CHECK: call void @llvm.memcpy{{.*}}, !dbg [[G7R1:!.*]]
__builtin_mempcpy(f4, f8, sizeof(float) * 4);
// CHECK: call void @llvm.memcpy{{.*}}, !dbg [[G8R1:!.*]]
__builtin_memcpy_inline(f4, f8, sizeof(float) * 4);
// CHECK: call void @llvm.memcpy{{.*}}, !dbg [[G9R1:!.*]]
__builtin___memcpy_chk(f4, f8, sizeof(float) * 4, -1);
// CHECK: call void @llvm.memmove{{.*}}, !dbg [[G10R1:!.*]]
__builtin___memmove_chk(f4, f8, sizeof(float) * 4, -1);
// CHECK: call void @llvm.memmove{{.*}}, !dbg [[G11R1:!.*]]
__builtin_memmove(f4, f8, sizeof(float) * 4);
// CHECK: call void @llvm.memset{{.*}}, !dbg [[G12R1:!.*]]
__builtin_memset(f4, 0, sizeof(float) * 4);
// CHECK: call void @llvm.memset{{.*}}, !dbg [[G13R1:!.*]]
__builtin_memset_inline(f4, 0, sizeof(float) * 4);
// CHECK: call void @llvm.memset{{.*}}, !dbg [[G14R1:!.*]]
__builtin___memset_chk(f4, 0, sizeof(float), -1);
}
// CHECK: [[G1R2]] = !DILocation({{.*}}, atomGroup: 1, atomRank: 2)
@ -30,3 +64,14 @@ void fun() {
// CHECK: [[G2R2]] = !DILocation({{.*}}, atomGroup: 2, atomRank: 2)
// CHECK: [[G2R1]] = !DILocation({{.*}}, atomGroup: 2, atomRank: 1)
// CHECK: [[G3R1]] = !DILocation({{.*}}, atomGroup: 3, atomRank: 1)
// CHECK: [[G4R1]] = !DILocation({{.*}}, atomGroup: 4, atomRank: 1)
// CHECK: [[G5R1]] = !DILocation({{.*}}, atomGroup: 5, atomRank: 1)
// CHECK: [[G6R1]] = !DILocation({{.*}}, atomGroup: 6, atomRank: 1)
// CHECK: [[G7R1]] = !DILocation({{.*}}, atomGroup: 7, atomRank: 1)
// CHECK: [[G8R1]] = !DILocation({{.*}}, atomGroup: 8, atomRank: 1)
// CHECK: [[G9R1]] = !DILocation({{.*}}, atomGroup: 9, atomRank: 1)
// CHECK: [[G10R1]] = !DILocation({{.*}}, atomGroup: 10, atomRank: 1)
// CHECK: [[G11R1]] = !DILocation({{.*}}, atomGroup: 11, atomRank: 1)
// CHECK: [[G12R1]] = !DILocation({{.*}}, atomGroup: 12, atomRank: 1)
// CHECK: [[G13R1]] = !DILocation({{.*}}, atomGroup: 13, atomRank: 1)
// CHECK: [[G14R1]] = !DILocation({{.*}}, atomGroup: 14, atomRank: 1)