Skip to content

Commit 713ba6a

Browse files
authored
[CIR][CIRGen][Builtin][Clang] Lowering clang::AArch64::BI__builtin_arm_ldaex (#1293)
Lowering clang::AArch64::BI__builtin_arm_ldaex
1 parent 2267e5d commit 713ba6a

File tree

2 files changed

+50
-9
lines changed

2 files changed

+50
-9
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

+4-6
Original file line numberDiff line numberDiff line change
@@ -2122,12 +2122,10 @@ mlir::Value CIRGenFunction::emitScalarOrConstFoldImmArg(unsigned ICEArguments,
21222122
static mlir::Value emitArmLdrexNon128Intrinsic(unsigned int builtinID,
21232123
const CallExpr *clangCallExpr,
21242124
CIRGenFunction &cgf) {
2125-
StringRef intrinsicName;
2126-
if (builtinID == clang::AArch64::BI__builtin_arm_ldrex) {
2127-
intrinsicName = "aarch64.ldxr";
2128-
} else {
2129-
llvm_unreachable("Unknown builtinID");
2130-
}
2125+
StringRef intrinsicName = builtinID == clang::AArch64::BI__builtin_arm_ldrex
2126+
? "aarch64.ldxr"
2127+
: "aarch64.ldaxr";
2128+
21312129
// Argument
21322130
mlir::Value loadAddr = cgf.emitScalarExpr(clangCallExpr->getArg(0));
21332131
// Get Instrinc call

clang/test/CIR/CodeGen/builtin-arm-ldrex.c clang/test/CIR/CodeGen/builtin-arm-exclusive.c

+46-3
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,18 @@ struct twoFldT {
55
char a, b;
66
};
77
// CIR: !ty_twoFldT = !cir.struct<struct "twoFldT" {!s8i, !s8i}
8+
89
int test_ldrex(char *addr, long long *addr64, float *addrfloat) {
910
// CIR-LABEL: @test_ldrex
1011
int sum = 0;
1112
sum += __builtin_arm_ldrex(addr);
12-
// CIR: [[INTRES0:%.*]] = cir.llvm.intrinsic "aarch64.ldxr" {{%[0-9]+}} : (!cir.ptr<!s8i>) -> !s64i
13-
// CIR: [[CAST0:%.*]] = cir.cast(integral, [[INTRES0]] : !s64i), !s8i
13+
// CIR: [[INTRES0:%.*]] = cir.llvm.intrinsic "aarch64.ldxr" {{%[0-9]+}} : (!cir.ptr<!s8i>) -> !s64i
14+
// CIR: [[CAST0:%.*]] = cir.cast(integral, [[INTRES0]] : !s64i), !s8i
1415
// CIR: [[CAST_I32:%.*]] = cir.cast(integral, [[CAST0]] : !s8i), !s32i
1516

1617
sum += __builtin_arm_ldrex((short *)addr);
1718
// CIR: [[INTRES1:%.*]] = cir.llvm.intrinsic "aarch64.ldxr" {{%[0-9]+}} : (!cir.ptr<!s16i>) -> !s64i
18-
// CIR: [[CAST1:%.*]] = cir.cast(integral, [[INTRES1]] : !s64i), !s16i
19+
// CIR: [[CAST1:%.*]] = cir.cast(integral, [[INTRES1]] : !s64i), !s16i
1920
// CIR: [[CAST_I16:%.*]] = cir.cast(integral, [[CAST1]] : !s16i), !s32i
2021

2122
sum += __builtin_arm_ldrex((int *)addr);
@@ -44,5 +45,47 @@ int test_ldrex(char *addr, long long *addr64, float *addrfloat) {
4445
// sum += __builtin_arm_ldrex((double *)addr);
4546

4647

48+
return sum;
49+
}
50+
51+
int test_ldaex(char *addr, long long *addr64, float *addrfloat) {
52+
// CIR-LABEL: @test_ldaex
53+
int sum = 0;
54+
sum += __builtin_arm_ldaex(addr);
55+
// CIR: [[INTRES0:%.*]] = cir.llvm.intrinsic "aarch64.ldaxr" {{%[0-9]+}} : (!cir.ptr<!s8i>) -> !s64i
56+
// CIR: [[CAST0:%.*]] = cir.cast(integral, [[INTRES0]] : !s64i), !s8i
57+
// CIR: [[CAST_I32:%.*]] = cir.cast(integral, [[CAST0]] : !s8i), !s32i
58+
59+
sum += __builtin_arm_ldaex((short *)addr);
60+
// CIR: [[INTRES1:%.*]] = cir.llvm.intrinsic "aarch64.ldaxr" {{%[0-9]+}} : (!cir.ptr<!s16i>) -> !s64i
61+
// CIR: [[CAST1:%.*]] = cir.cast(integral, [[INTRES1]] : !s64i), !s16i
62+
// CIR: [[CAST_I16:%.*]] = cir.cast(integral, [[CAST1]] : !s16i), !s32i
63+
64+
sum += __builtin_arm_ldaex((int *)addr);
65+
// CIR: [[INTRES2:%.*]] = cir.llvm.intrinsic "aarch64.ldaxr" {{%[0-9]+}} : (!cir.ptr<!s32i>) -> !s64i
66+
// CIR: [[CAST2:%.*]] = cir.cast(integral, [[INTRES2]] : !s64i), !s32i
67+
68+
sum += __builtin_arm_ldaex((long long *)addr);
69+
// CIR: [[INTRES3:%.*]] = cir.llvm.intrinsic "aarch64.ldaxr" {{%[0-9]+}} : (!cir.ptr<!s64i>) -> !s64i
70+
71+
sum += __builtin_arm_ldaex(addr64);
72+
// CIR: [[INTRES4:%.*]] = cir.llvm.intrinsic "aarch64.ldaxr" {{%[0-9]+}} : (!cir.ptr<!s64i>) -> !s64i
73+
74+
75+
sum += *__builtin_arm_ldaex((int **)addr);
76+
// CIR: [[INTRES5:%.*]] = cir.llvm.intrinsic "aarch64.ldaxr" {{%[0-9]+}} : (!cir.ptr<!cir.ptr<!s32i>>) -> !s64i
77+
78+
sum += __builtin_arm_ldaex((struct twoFldT **)addr)->a;
79+
// CIR: [[INTRES6:%.*]] = cir.llvm.intrinsic "aarch64.ldaxr" {{%[0-9]+}} : (!cir.ptr<!cir.ptr<!ty_twoFldT>>) -> !s64i
80+
// CIR: [[CAST3:%.*]] = cir.cast(int_to_ptr, [[INTRES6]] : !s64i), !cir.ptr<!ty_twoFldT>
81+
// CIR: [[MEMBER_A:%.*]] = cir.get_member [[CAST3]][0] {name = "a"} : !cir.ptr<!ty_twoFldT> -> !cir.ptr<!s8i>
82+
83+
84+
// TODO: Uncomment next 2 lines, add tests when floating result type supported
85+
// sum += __builtin_arm_ldaex(addrfloat);
86+
87+
// sum += __builtin_arm_ldaex((double *)addr);
88+
89+
4790
return sum;
4891
}

0 commit comments

Comments
 (0)