Skip to content

Commit bcc30f4

Browse files
authored
[CIR] Fix load alignment (#1640)
This adds an explicit alignment to load instructions where needed in order to make CIR load alignment consistent with classic codegen. As with aligned stores, I have updated tests that were failing with wildcard checks for cir.load, except where alignment was being specifically checked. Where tests failed because of changed alignment, I verified that the new alignment matches what is produced by classic codegen. The new test for proper alignment behavior is align-load.c.
1 parent 99c6b4b commit bcc30f4

File tree

129 files changed

+957
-881
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

129 files changed

+957
-881
lines changed

clang/lib/CIR/CodeGen/CIRGenBuilder.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -856,10 +856,13 @@ class CIRGenBuilderTy : public cir::CIRBaseBuilderTy {
856856
addr = addr.withPointer(
857857
createPtrBitcast(addr.getPointer(), addr.getElementType()));
858858

859+
mlir::IntegerAttr align;
860+
uint64_t alignment = addr.getAlignment().getQuantity();
861+
if (alignment)
862+
align = getI64IntegerAttr(alignment);
859863
return create<cir::LoadOp>(
860864
loc, addr.getElementType(), addr.getPointer(), /*isDeref=*/false,
861-
/*is_volatile=*/isVolatile, /*is_nontemporal=*/isNontemporal,
862-
/*alignment=*/mlir::IntegerAttr{},
865+
/*is_volatile=*/isVolatile, /*is_nontemporal=*/isNontemporal, align,
863866
/*mem_order=*/cir::MemOrderAttr{}, /*tbaa=*/cir::TBAAAttr{});
864867
}
865868

clang/lib/CIR/CodeGen/CIRGenExpr.cpp

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2946,16 +2946,9 @@ mlir::Value CIRGenFunction::emitLoadOfScalar(Address addr, bool isVolatile,
29462946
llvm_unreachable("NYI");
29472947
}
29482948

2949-
// TODO(cir): modernize this with addr.withElementType(convertTypeForLoadStore
2950-
auto Ptr = addr.getPointer();
2951-
if (mlir::isa<cir::VoidType>(eltTy)) {
2952-
eltTy = cir::IntType::get(&getMLIRContext(), 8, true);
2953-
auto ElemPtrTy = cir::PointerType::get(eltTy);
2954-
Ptr = builder.create<cir::CastOp>(loc, ElemPtrTy, cir::CastKind::bitcast,
2955-
Ptr);
2956-
}
2957-
auto loadOp =
2958-
builder.CIRBaseBuilderTy::createLoad(loc, Ptr, isVolatile, isNontemporal);
2949+
if (mlir::isa<cir::VoidType>(eltTy))
2950+
addr = addr.withElementType(builder, builder.getUIntNTy(8));
2951+
auto loadOp = builder.createLoad(loc, addr, isVolatile, isNontemporal);
29592952

29602953
CGM.decorateOperationWithTBAA(loadOp, tbaaInfo);
29612954

clang/test/CIR/CallConvLowering/AArch64/aarch64-cc-structs.c

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ typedef struct {
3030
// CHECK: cir.func {{.*@ret_lt_64}}() -> !u16i
3131
// CHECK: %[[#V0:]] = cir.alloca !rec_LT_64, !cir.ptr<!rec_LT_64>, ["__retval"]
3232
// CHECK: %[[#V1:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_LT_64>), !cir.ptr<!u16i>
33-
// CHECK: %[[#V2:]] = cir.load %[[#V1]] : !cir.ptr<!u16i>, !u16i
33+
// CHECK: %[[#V2:]] = cir.load{{.*}} %[[#V1]] : !cir.ptr<!u16i>, !u16i
3434
// CHECK: cir.return %[[#V2]] : !u16i
3535
LT_64 ret_lt_64() {
3636
LT_64 x;
@@ -40,7 +40,7 @@ LT_64 ret_lt_64() {
4040
// CHECK: cir.func {{.*@ret_eq_64}}() -> !u64i
4141
// CHECK: %[[#V0:]] = cir.alloca !rec_EQ_64, !cir.ptr<!rec_EQ_64>, ["__retval"]
4242
// CHECK: %[[#V1:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_EQ_64>), !cir.ptr<!u64i>
43-
// CHECK: %[[#V2:]] = cir.load %[[#V1]] : !cir.ptr<!u64i>, !u64i
43+
// CHECK: %[[#V2:]] = cir.load{{.*}} %[[#V1]] : !cir.ptr<!u64i>, !u64i
4444
// CHECK: cir.return %[[#V2]] : !u64i
4545
EQ_64 ret_eq_64() {
4646
EQ_64 x;
@@ -50,7 +50,7 @@ EQ_64 ret_eq_64() {
5050
// CHECK: cir.func {{.*@ret_lt_128}}() -> !cir.array<!u64i x 2>
5151
// CHECK: %[[#V0:]] = cir.alloca !rec_LT_128, !cir.ptr<!rec_LT_128>, ["__retval"]
5252
// CHECK: %[[#V1:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_LT_128>), !cir.ptr<!cir.array<!u64i x 2>>
53-
// CHECK: %[[#V2:]] = cir.load %[[#V1]] : !cir.ptr<!cir.array<!u64i x 2>>, !cir.array<!u64i x 2>
53+
// CHECK: %[[#V2:]] = cir.load{{.*}} %[[#V1]] : !cir.ptr<!cir.array<!u64i x 2>>, !cir.array<!u64i x 2>
5454
// CHECK: cir.return %[[#V2]] : !cir.array<!u64i x 2>
5555
LT_128 ret_lt_128() {
5656
LT_128 x;
@@ -60,7 +60,7 @@ LT_128 ret_lt_128() {
6060
// CHECK: cir.func {{.*@ret_eq_128}}() -> !cir.array<!u64i x 2>
6161
// CHECK: %[[#V0:]] = cir.alloca !rec_EQ_128, !cir.ptr<!rec_EQ_128>, ["__retval"]
6262
// CHECK: %[[#V1:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_EQ_128>), !cir.ptr<!cir.array<!u64i x 2>>
63-
// CHECK: %[[#V2:]] = cir.load %[[#V1]] : !cir.ptr<!cir.array<!u64i x 2>>, !cir.array<!u64i x 2>
63+
// CHECK: %[[#V2:]] = cir.load{{.*}} %[[#V1]] : !cir.ptr<!cir.array<!u64i x 2>>, !cir.array<!u64i x 2>
6464
// CHECK: cir.return %[[#V2]] : !cir.array<!u64i x 2>
6565
EQ_128 ret_eq_128() {
6666
EQ_128 x;
@@ -87,7 +87,7 @@ typedef struct {
8787
// CHECK: %[[#V3:]] = cir.cast(bitcast, %[[#V1]] : !cir.ptr<!cir.array<!u64i x 2>>), !cir.ptr<!void>
8888
// CHECK: %[[#V4:]] = cir.const #cir.int<12> : !u64i
8989
// CHECK: cir.libc.memcpy %[[#V4]] bytes from %[[#V2]] to %[[#V3]] : !u64i, !cir.ptr<!void> -> !cir.ptr<!void>
90-
// CHECK: %[[#V5:]] = cir.load %[[#V1]] : !cir.ptr<!cir.array<!u64i x 2>>, !cir.array<!u64i x 2>
90+
// CHECK: %[[#V5:]] = cir.load{{.*}} %[[#V1]] : !cir.ptr<!cir.array<!u64i x 2>>, !cir.array<!u64i x 2>
9191
// CHECK: cir.return %[[#V5]] : !cir.array<!u64i x 2>
9292

9393
// LLVM: [2 x i64] @retS()
@@ -145,7 +145,7 @@ void pass_eq_128(EQ_128 s) {}
145145
// CHECK: cir.func @pass_gt_128(%arg0: !cir.ptr<!rec_GT_128>
146146
// CHECK: %[[#V0:]] = cir.alloca !cir.ptr<!rec_GT_128>, !cir.ptr<!cir.ptr<!rec_GT_128>>, [""] {alignment = 8 : i64}
147147
// CHECK: cir.store{{.*}} %arg0, %[[#V0]] : !cir.ptr<!rec_GT_128>, !cir.ptr<!cir.ptr<!rec_GT_128>>
148-
// CHECK: %[[#V1:]] = cir.load %[[#V0]] : !cir.ptr<!cir.ptr<!rec_GT_128>>, !cir.ptr<!rec_GT_128>
148+
// CHECK: %[[#V1:]] = cir.load{{.*}} %[[#V0]] : !cir.ptr<!cir.ptr<!rec_GT_128>>, !cir.ptr<!rec_GT_128>
149149

150150
// LLVM: void @pass_gt_128(ptr %0)
151151
// LLVM: %[[#V1:]] = alloca ptr, i64 1, align 8
@@ -156,7 +156,7 @@ void pass_gt_128(GT_128 s) {}
156156
// CHECK: cir.func @get_gt_128(%arg0: !cir.ptr<!rec_GT_128> {{.*}}, %arg1: !cir.ptr<!rec_GT_128>
157157
// CHECK: %[[#V0:]] = cir.alloca !cir.ptr<!rec_GT_128>, !cir.ptr<!cir.ptr<!rec_GT_128>>, [""] {alignment = 8 : i64}
158158
// CHECK: cir.store{{.*}} %arg1, %[[#V0]] : !cir.ptr<!rec_GT_128>, !cir.ptr<!cir.ptr<!rec_GT_128>>
159-
// CHECK: %[[#V1:]] = cir.load %[[#V0]] : !cir.ptr<!cir.ptr<!rec_GT_128>>, !cir.ptr<!rec_GT_128>
159+
// CHECK: %[[#V1:]] = cir.load{{.*}} %[[#V0]] : !cir.ptr<!cir.ptr<!rec_GT_128>>, !cir.ptr<!rec_GT_128>
160160
// CHECK: cir.copy %[[#V1]] to %arg0 : !cir.ptr<!rec_GT_128>
161161
// CHECK: cir.return
162162

@@ -172,7 +172,7 @@ GT_128 get_gt_128(GT_128 s) {
172172

173173
// CHECK: cir.func no_proto @call_and_get_gt_128(%arg0: !cir.ptr<!rec_GT_128>
174174
// CHECK: %[[#V0:]] = cir.alloca !rec_GT_128, !cir.ptr<!rec_GT_128>, ["tmp"] {alignment = 8 : i64}
175-
// CHECK: %[[#V1:]] = cir.load %arg0 : !cir.ptr<!rec_GT_128>, !rec_GT_128
175+
// CHECK: %[[#V1:]] = cir.load{{.*}} %arg0 : !cir.ptr<!rec_GT_128>, !rec_GT_128
176176
// CHECK: %[[#V2:]] = cir.alloca !rec_GT_128, !cir.ptr<!rec_GT_128>, [""] {alignment = 8 : i64}
177177
// CHECK: %[[#V3:]] = cir.alloca !rec_GT_128, !cir.ptr<!rec_GT_128>, ["tmp"] {alignment = 8 : i64}
178178
// CHECK: %[[#V4:]] = cir.cast(bitcast, %arg0 : !cir.ptr<!rec_GT_128>), !cir.ptr<!void>
@@ -213,12 +213,12 @@ void passS(S s) {}
213213
// CHECK: @callS()
214214
// CHECK: %[[#V0:]] = cir.alloca !rec_S, !cir.ptr<!rec_S>, ["s"] {alignment = 4 : i64}
215215
// CHECK: %[[#V1:]] = cir.alloca !cir.array<!u64i x 2>, !cir.ptr<!cir.array<!u64i x 2>>, ["tmp"] {alignment = 8 : i64}
216-
// CHECK: %[[#V2:]] = cir.load %[[#V0]] : !cir.ptr<!rec_S>, !rec_S
216+
// CHECK: %[[#V2:]] = cir.load{{.*}} %[[#V0]] : !cir.ptr<!rec_S>, !rec_S
217217
// CHECK: %[[#V3:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_S>), !cir.ptr<!void>
218218
// CHECK: %[[#V4:]] = cir.cast(bitcast, %[[#V1]] : !cir.ptr<!cir.array<!u64i x 2>>), !cir.ptr<!void>
219219
// CHECK: %[[#V5:]] = cir.const #cir.int<12> : !u64i
220220
// CHECK: cir.libc.memcpy %[[#V5]] bytes from %[[#V3]] to %[[#V4]] : !u64i, !cir.ptr<!void> -> !cir.ptr<!void>
221-
// CHECK: %[[#V6:]] = cir.load %[[#V1]] : !cir.ptr<!cir.array<!u64i x 2>>, !cir.array<!u64i x 2>
221+
// CHECK: %[[#V6:]] = cir.load{{.*}} %[[#V1]] : !cir.ptr<!cir.array<!u64i x 2>>, !cir.array<!u64i x 2>
222222
// CHECK: cir.call @passS(%[[#V6]]) : (!cir.array<!u64i x 2>) -> ()
223223
// CHECK: cir.return
224224

@@ -243,13 +243,13 @@ typedef struct {
243243

244244
// CHECK: cir.func {{.*@ret_s_pad}}() -> !u48i
245245
// CHECK: %[[#V0:]] = cir.alloca !rec_S_PAD, !cir.ptr<!rec_S_PAD>, ["__retval"] {alignment = 2 : i64}
246-
// CHECK: %[[#V1:]] = cir.load %[[#V0]] : !cir.ptr<!rec_S_PAD>, !rec_S_PAD
246+
// CHECK: %[[#V1:]] = cir.load{{.*}} %[[#V0]] : !cir.ptr<!rec_S_PAD>, !rec_S_PAD
247247
// CHECK: %[[#V2:]] = cir.alloca !u48i, !cir.ptr<!u48i>, [""] {alignment = 2 : i64}
248248
// CHECK: %[[#V3:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_S_PAD>)
249249
// CHECK: %[[#V4:]] = cir.cast(bitcast, %[[#V2:]] : !cir.ptr<!u48i>), !cir.ptr<!void>
250250
// CHECK: %[[#V5:]] = cir.const #cir.int<6> : !u64i
251251
// CHECK: cir.libc.memcpy %[[#V5]] bytes from %[[#V3]] to %[[#V4]] : !u64i, !cir.ptr<!void>
252-
// CHECK: %[[#V6:]] = cir.load %[[#V2]] : !cir.ptr<!u48i>
252+
// CHECK: %[[#V6:]] = cir.load{{.*}} %[[#V2]] : !cir.ptr<!u48i>
253253
// CHECK: cir.return %[[#V6]]
254254

255255
// LLVM: i48 @ret_s_pad()
@@ -271,7 +271,7 @@ typedef struct {
271271
// CHECK: cir.func @pass_cat(%arg0: !cir.ptr<!rec_CAT>
272272
// CHECK: %[[#V0:]] = cir.alloca !cir.ptr<!rec_CAT>, !cir.ptr<!cir.ptr<!rec_CAT>>, [""] {alignment = 8 : i64}
273273
// CHECK: cir.store{{.*}} %arg0, %[[#V0]] : !cir.ptr<!rec_CAT>, !cir.ptr<!cir.ptr<!rec_CAT>>
274-
// CHECK: %[[#V1:]] = cir.load %[[#V0]] : !cir.ptr<!cir.ptr<!rec_CAT>>, !cir.ptr<!rec_CAT>
274+
// CHECK: %[[#V1:]] = cir.load{{.*}} %[[#V0]] : !cir.ptr<!cir.ptr<!rec_CAT>>, !cir.ptr<!rec_CAT>
275275
// CHECK: cir.return
276276

277277
// LLVM: void @pass_cat(ptr %[[#V0:]])
@@ -307,16 +307,16 @@ void pass_nested_u(NESTED_U a) {}
307307
// CHECK: cir.func no_proto @call_nested_u()
308308
// CHECK: %[[#V0:]] = cir.alloca !rec_NESTED_U, !cir.ptr<!rec_NESTED_U>
309309
// CHECK: %[[#V1:]] = cir.alloca !u64i, !cir.ptr<!u64i>, ["tmp"]
310-
// CHECK: %[[#V2:]] = cir.load %[[#V0]] : !cir.ptr<!rec_NESTED_U>, !rec_NESTED_U
310+
// CHECK: %[[#V2:]] = cir.load{{.*}} %[[#V0]] : !cir.ptr<!rec_NESTED_U>, !rec_NESTED_U
311311
// CHECK: %[[#V3:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_NESTED_U>), !cir.ptr<!rec_anon2E0>
312-
// CHECK: %[[#V4:]] = cir.load %[[#V3]] : !cir.ptr<!rec_anon2E0>, !rec_anon2E0
312+
// CHECK: %[[#V4:]] = cir.load{{.*}} %[[#V3]] : !cir.ptr<!rec_anon2E0>, !rec_anon2E0
313313
// CHECK: %[[#V5:]] = cir.cast(bitcast, %[[#V3]] : !cir.ptr<!rec_anon2E0>), !cir.ptr<!rec_anon2E1>
314-
// CHECK: %[[#V6:]] = cir.load %[[#V5]] : !cir.ptr<!rec_anon2E1>, !rec_anon2E1
314+
// CHECK: %[[#V6:]] = cir.load{{.*}} %[[#V5]] : !cir.ptr<!rec_anon2E1>, !rec_anon2E1
315315
// CHECK: %[[#V7:]] = cir.cast(bitcast, %[[#V5]] : !cir.ptr<!rec_anon2E1>), !cir.ptr<!void>
316316
// CHECK: %[[#V8:]] = cir.cast(bitcast, %[[#V1]] : !cir.ptr<!u64i>), !cir.ptr<!void>
317317
// CHECK: %[[#V9:]] = cir.const #cir.int<2> : !u64i
318318
// CHECK: cir.libc.memcpy %[[#V9]] bytes from %[[#V7]] to %[[#V8]] : !u64i, !cir.ptr<!void> -> !cir.ptr<!void>
319-
// CHECK: %[[#V10:]] = cir.load %[[#V1]] : !cir.ptr<!u64i>, !u64i
319+
// CHECK: %[[#V10:]] = cir.load{{.*}} %[[#V1]] : !cir.ptr<!u64i>, !u64i
320320
// CHECK: cir.call @pass_nested_u(%[[#V10]]) : (!u64i) -> ()
321321

322322
// LLVM: void @call_nested_u()
@@ -402,7 +402,7 @@ void qux(void) {
402402
// CHECK: %[[#V4:]] = cir.cast(array_to_ptrdecay, %[[#V2]] : !cir.ptr<!cir.array<!rec_PackedS2 x 3>>), !cir.ptr<!rec_PackedS2>
403403
// CHECK: %[[#V5:]] = cir.ptr_stride(%[[#V4]] : !cir.ptr<!rec_PackedS2>, %[[#V3]] : !s32i), !cir.ptr<!rec_PackedS2>
404404
// CHECK: cir.store{{.*}} %[[#V5]], %[[#V0]] : !cir.ptr<!rec_PackedS2>, !cir.ptr<!cir.ptr<!rec_PackedS2>>
405-
// CHECK: %[[#V6:]] = cir.load deref %[[#V0]] : !cir.ptr<!cir.ptr<!rec_PackedS2>>, !cir.ptr<!rec_PackedS2>
405+
// CHECK: %[[#V6:]] = cir.load deref{{.*}} %[[#V0]] : !cir.ptr<!cir.ptr<!rec_PackedS2>>, !cir.ptr<!rec_PackedS2>
406406
// CHECK: %[[#V7:]] = cir.cast(bitcast, %[[#V6]] : !cir.ptr<!rec_PackedS2>), !cir.ptr<!void>
407407
// CHECK: %[[#V8:]] = cir.const #cir.int<6> : !u64i
408408
// CHECK: cir.libc.memcpy %[[#V8]] bytes from %[[#V7]]

clang/test/CIR/CallConvLowering/x86_64/basic.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ S1 s1(S1 arg) {
109109

110110
/// Cast argument and result of the function call to the expected types.
111111
// CHECK: %[[#V9:]] = cir.cast(bitcast, %[[#V3]] : !cir.ptr<!rec_S1>), !cir.ptr<!u64i>
112-
// CHECK: %[[#V10:]] = cir.load %[[#V9]] : !cir.ptr<!u64i>, !u64i
112+
// CHECK: %[[#V10:]] = cir.load{{.*}} %[[#V9]] : !cir.ptr<!u64i>, !u64i
113113
// CHECK: %[[#V11:]] = cir.call @_Z2s12S1(%[[#V10]]) : (!u64i) -> !u64i
114114
// CHECK: %[[#V12:]] = cir.cast(bitcast, %[[#V4]] : !cir.ptr<!rec_S1>), !cir.ptr<!u64i>
115115
// CHECK: cir.store{{.*}} %[[#V11]], %[[#V12]] : !u64i, !cir.ptr<!u64i>
@@ -122,7 +122,7 @@ S1 s1(S1 arg) {
122122
// CHECK: %[[#V16:]] = cir.const #cir.int<2> : !s32i
123123
// CHECK: cir.store{{.*}} %[[#V16]], %[[#V15]] : !s32i, !cir.ptr<!s32i>
124124
// CHECK: %[[#V17:]] = cir.cast(bitcast, %[[#V2]] : !cir.ptr<!rec_S1>), !cir.ptr<!u64i>
125-
// CHECK: %[[#V18:]] = cir.load %[[#V17]] : !cir.ptr<!u64i>, !u64i
125+
// CHECK: %[[#V18:]] = cir.load{{.*}} %[[#V17]] : !cir.ptr<!u64i>, !u64i
126126
// CHECK: cir.return %[[#V18]] : !u64i
127127
return {1, 2};
128128
}
@@ -170,7 +170,7 @@ S2 s2(S2 arg) {
170170
// COM: Flattening of the struct.
171171
// COM: { i32, i32, i32 } -> { i64, i32 }.
172172

173-
// CHECK: %[[#F20:]] = cir.load %[[#F8]] : !cir.ptr<!rec_S2>, !rec_S2
173+
// CHECK: %[[#F20:]] = cir.load{{.*}} %[[#F8]] : !cir.ptr<!rec_S2>, !rec_S2
174174
// CHECK: cir.store{{.*}} %[[#F20]], %[[#F11]] : !rec_S2, !cir.ptr<!rec_S2>
175175
// CHECK: %[[#F21:]] = cir.cast(bitcast, %[[#F11]] : !cir.ptr<!rec_S2>), !cir.ptr<!void>
176176
// CHECK: %[[#F22:]] = cir.cast(bitcast, %[[#F10]] : !cir.ptr<!rec_anon_struct>), !cir.ptr<!void>
@@ -181,9 +181,9 @@ S2 s2(S2 arg) {
181181
// COM: Retrieve the two values in { i64, i32 }.
182182

183183
// CHECK: %[[#F24:]] = cir.get_member %[[#F10]][0] {name = ""} : !cir.ptr<!rec_anon_struct> -> !cir.ptr<!u64i>
184-
// CHECK: %[[#F25:]] = cir.load %[[#F24]] : !cir.ptr<!u64i>, !u64i
184+
// CHECK: %[[#F25:]] = cir.load{{.*}} %[[#F24]] : !cir.ptr<!u64i>, !u64i
185185
// CHECK: %[[#F26:]] = cir.get_member %[[#F10]][1] {name = ""} : !cir.ptr<!rec_anon_struct> -> !cir.ptr<!s32i>
186-
// CHECK: %[[#F27:]] = cir.load %[[#F26]] : !cir.ptr<!s32i>, !s32i
186+
// CHECK: %[[#F27:]] = cir.load{{.*}} %[[#F26]] : !cir.ptr<!s32i>, !s32i
187187
// CHECK: %[[#F28:]] = cir.call @_Z2s22S2(%[[#F25]], %[[#F27]]) : (!u64i, !s32i) -> !rec_anon_struct
188188
// CHECK: cir.store{{.*}} %[[#F28]], %[[#F12]] : !rec_anon_struct, !cir.ptr<!rec_anon_struct>
189189

@@ -201,7 +201,7 @@ S2 s2(S2 arg) {
201201
// CHECK: %[[#F40:]] = cir.cast(bitcast, %[[#F13]] : !cir.ptr<!rec_anon_struct>), !cir.ptr<!void>
202202
// CHECK: %[[#F41:]] = cir.const #cir.int<12> : !u64i
203203
// cir.libc.memcpy %[[#F41]] bytes from %[[#F39]] to %[[#F40]]
204-
// CHECK: %[[#F42:]] = cir.load %[[#F13]] : !cir.ptr<!rec_anon_struct>, !rec_anon_struct
204+
// CHECK: %[[#F42:]] = cir.load{{.*}} %[[#F13]] : !cir.ptr<!rec_anon_struct>, !rec_anon_struct
205205
// cir.return %[[#F42]] : !rec_anon_struct
206206
s2({ 1, 2, 3 });
207207
return { 1, 2, 3 };

clang/test/CIR/CallConvLowering/x86_64/fptrs.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ void bar() {
2626
// CHECK: %[[#V3:]] = cir.get_global @foo : !cir.ptr<!cir.func<(!s32i) -> !s32i>>
2727
// CHECK: %[[#V4:]] = cir.cast(bitcast, %[[#V3]] : !cir.ptr<!cir.func<(!s32i) -> !s32i>>), !cir.ptr<!cir.func<(!rec_S) -> !s32i>>
2828
// CHECK: cir.store{{.*}} %[[#V4]], %[[#V2]] : !cir.ptr<!cir.func<(!rec_S) -> !s32i>>, !cir.ptr<!cir.ptr<!cir.func<(!rec_S) -> !s32i>>>
29-
// CHECK: %[[#V5:]] = cir.load %[[#V2]] : !cir.ptr<!cir.ptr<!cir.func<(!rec_S) -> !s32i>>>, !cir.ptr<!cir.func<(!rec_S) -> !s32i>>
29+
// CHECK: %[[#V5:]] = cir.load{{.*}} %[[#V2]] : !cir.ptr<!cir.ptr<!cir.func<(!rec_S) -> !s32i>>>, !cir.ptr<!cir.func<(!rec_S) -> !s32i>>
3030
// CHECK: %[[#V6:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_S>), !cir.ptr<!s32i>
31-
// CHECK: %[[#V7:]] = cir.load %[[#V6]] : !cir.ptr<!s32i>, !s32i
31+
// CHECK: %[[#V7:]] = cir.load{{.*}} %[[#V6]] : !cir.ptr<!s32i>, !s32i
3232
// CHECK: %[[#V8:]] = cir.cast(bitcast, %[[#V5]] : !cir.ptr<!cir.func<(!rec_S) -> !s32i>>), !cir.ptr<!cir.func<(!s32i) -> !s32i>>
3333
// CHECK: %[[#V9:]] = cir.call %[[#V8]](%[[#V7]]) : (!cir.ptr<!cir.func<(!s32i) -> !s32i>>, !s32i) -> !s32i
3434

clang/test/CIR/CallConvLowering/x86_64/int128.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ __int128 test1(__int128 a, __int128 b) {
3535
// LLVM-NEXT: %[[#RET_SLOT:]] = alloca i128, i64 1, align 16
3636

3737
return a + b;
38-
// CHECK: %[[#A:]] = cir.load %[[#SLOT_A]] : !cir.ptr<!s128i>, !s128i
39-
// CHECK-NEXT: %[[#B:]] = cir.load %[[#SLOT_B]] : !cir.ptr<!s128i>, !s128i
38+
// CHECK: %[[#A:]] = cir.load{{.*}} %[[#SLOT_A]] : !cir.ptr<!s128i>, !s128i
39+
// CHECK-NEXT: %[[#B:]] = cir.load{{.*}} %[[#SLOT_B]] : !cir.ptr<!s128i>, !s128i
4040
// CHECK-NEXT: %[[#SUM:]] = cir.binop(add, %[[#A]], %[[#B]]) nsw : !s128i
4141
// CHECK-NEXT: cir.store %[[#SUM]], %[[#SLOT_RET]] : !s128i, !cir.ptr<!s128i>
4242

@@ -46,7 +46,7 @@ __int128 test1(__int128 a, __int128 b) {
4646
// LLVM-NEXT: store i128 %[[#SUM]], ptr %[[#RET_SLOT]], align 16
4747

4848
// CHECK: %[[#SLOT_RET2:]] = cir.cast(bitcast, %[[#SLOT_RET]] : !cir.ptr<!s128i>), !cir.ptr<![[I128_STRUCT]]>
49-
// CHECK-NEXT: %[[#RET:]] = cir.load %[[#SLOT_RET2]] : !cir.ptr<![[I128_STRUCT]]>, ![[I128_STRUCT]]
49+
// CHECK-NEXT: %[[#RET:]] = cir.load{{.*}} %[[#SLOT_RET2]] : !cir.ptr<![[I128_STRUCT]]>, ![[I128_STRUCT]]
5050
// CHECK-NEXT: cir.return %[[#RET]] : ![[I128_STRUCT]]
5151

5252
// LLVM: %[[#RET:]] = load { i64, i64 }, ptr %[[#RET_SLOT]], align 8

clang/test/CIR/CodeGen/AArch64/neon-arith.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,16 @@ float32_t test_vrndns_f32(float32_t a) {
2222
}
2323
// CIR: cir.func internal private @vrndns_f32(%arg0: !cir.float {{.*}}) -> !cir.float
2424
// CIR: cir.store %arg0, [[ARG_SAVE:%.*]] : !cir.float, !cir.ptr<!cir.float>
25-
// CIR: [[INTRIN_ARG:%.*]] = cir.load [[ARG_SAVE]] : !cir.ptr<!cir.float>, !cir.float
25+
// CIR: [[INTRIN_ARG:%.*]] = cir.load{{.*}} [[ARG_SAVE]] : !cir.ptr<!cir.float>, !cir.float
2626
// CIR: {{%.*}} = cir.roundeven [[INTRIN_ARG]] : !cir.float
2727
// CIR: cir.return {{%.*}} : !cir.float
2828

2929
// CIR-LABEL: test_vrndns_f32
3030
// CIR: cir.store %arg0, [[ARG_SAVE0:%.*]] : !cir.float, !cir.ptr<!cir.float>
31-
// CIR: [[FUNC_ARG:%.*]] = cir.load [[ARG_SAVE]] : !cir.ptr<!cir.float>, !cir.float
31+
// CIR: [[FUNC_ARG:%.*]] = cir.load{{.*}} [[ARG_SAVE]] : !cir.ptr<!cir.float>, !cir.float
3232
// CIR: [[FUNC_RES:%.*]] = cir.call @vrndns_f32([[FUNC_ARG]]) : (!cir.float) -> !cir.float
3333
// CIR: cir.store [[FUNC_RES]], [[RET_P:%.*]] : !cir.float, !cir.ptr<!cir.float>
34-
// CIR: [[RET_VAL:%.*]] = cir.load [[RET_P]] : !cir.ptr<!cir.float>, !cir.float
34+
// CIR: [[RET_VAL:%.*]] = cir.load{{.*}} [[RET_P]] : !cir.ptr<!cir.float>, !cir.float
3535
// CIR: cir.return [[RET_VAL]] : !cir.float loc
3636

3737
// LLVM: {{.*}}test_vrndns_f32(float{{.*}}[[ARG:%.*]])
@@ -44,18 +44,18 @@ float32x2_t test_vrnda_f32(float32x2_t a) {
4444

4545
// CIR: cir.func internal private @vrnda_f32(%arg0: !cir.vector<!cir.float x 2>
4646
// CIR: cir.store %arg0, [[ARG_SAVE:%.*]] : !cir.vector<!cir.float x 2>, !cir.ptr<!cir.vector<!cir.float x 2>>
47-
// CIR: [[INTRIN_ARG:%.*]] = cir.load [[ARG_SAVE]] : !cir.ptr<!cir.vector<!cir.float x 2>>, !cir.vector<!cir.float x 2>
47+
// CIR: [[INTRIN_ARG:%.*]] = cir.load{{.*}} [[ARG_SAVE]] : !cir.ptr<!cir.vector<!cir.float x 2>>, !cir.vector<!cir.float x 2>
4848
// CIR: [[INTRIN_ARG_CAST:%.*]] = cir.cast(bitcast, [[INTRIN_ARG]] : !cir.vector<!cir.float x 2>), !cir.vector<!s8i x 8>
4949
// CIR: [[INTRIN_ARG_BACK:%.*]] = cir.cast(bitcast, [[INTRIN_ARG_CAST]] : !cir.vector<!s8i x 8>), !cir.vector<!cir.float x 2>
5050
// CIR: {{%.*}} = cir.round [[INTRIN_ARG_BACK]] : !cir.vector<!cir.float x 2>
5151
// CIR: cir.return {{%.*}} : !cir.vector<!cir.float x 2>
5252

5353
// CIR-LABEL: test_vrnda_f32
5454
// CIR: cir.store %arg0, [[ARG_SAVE0:%.*]] : !cir.vector<!cir.float x 2>, !cir.ptr<!cir.vector<!cir.float x 2>>
55-
// CIR: [[FUNC_ARG:%.*]] = cir.load [[ARG_SAVE]] : !cir.ptr<!cir.vector<!cir.float x 2>>, !cir.vector<!cir.float x 2>
55+
// CIR: [[FUNC_ARG:%.*]] = cir.load{{.*}} [[ARG_SAVE]] : !cir.ptr<!cir.vector<!cir.float x 2>>, !cir.vector<!cir.float x 2>
5656
// CIR: [[FUNC_RES:%.*]] = cir.call @vrnda_f32([[FUNC_ARG]]) : (!cir.vector<!cir.float x 2>) -> !cir.vector<!cir.float x 2>
5757
// CIR: cir.store [[FUNC_RES]], [[RET_P:%.*]] : !cir.vector<!cir.float x 2>, !cir.ptr<!cir.vector<!cir.float x 2>>
58-
// CIR: [[RET_VAL:%.*]] = cir.load [[RET_P]] : !cir.ptr<!cir.vector<!cir.float x 2>>, !cir.vector<!cir.float x 2>
58+
// CIR: [[RET_VAL:%.*]] = cir.load{{.*}} [[RET_P]] : !cir.ptr<!cir.vector<!cir.float x 2>>, !cir.vector<!cir.float x 2>
5959
// CIR: cir.return [[RET_VAL]] : !cir.vector<!cir.float x 2>
6060

6161
// LLVM: {{.*}}test_vrnda_f32(<2 x float>{{.*}}[[ARG:%.*]])
@@ -68,7 +68,7 @@ float32x4_t test_vrndaq_f32(float32x4_t a) {
6868

6969
// CIR: cir.func internal private @vrndaq_f32(%arg0: !cir.vector<!cir.float x 4>
7070
// CIR: cir.store %arg0, [[ARG_SAVE:%.*]] : !cir.vector<!cir.float x 4>, !cir.ptr<!cir.vector<!cir.float x 4>>
71-
// CIR: [[INTRIN_ARG:%.*]] = cir.load [[ARG_SAVE]] : !cir.ptr<!cir.vector<!cir.float x 4>>, !cir.vector<!cir.float x 4>
71+
// CIR: [[INTRIN_ARG:%.*]] = cir.load{{.*}} [[ARG_SAVE]] : !cir.ptr<!cir.vector<!cir.float x 4>>, !cir.vector<!cir.float x 4>
7272
// CIR: [[INTRIN_ARG_CAST:%.*]] = cir.cast(bitcast, [[INTRIN_ARG]] : !cir.vector<!cir.float x 4>), !cir.vector<!s8i x 16>
7373
// CIR: [[INTRIN_ARG_BACK:%.*]] = cir.cast(bitcast, [[INTRIN_ARG_CAST]] : !cir.vector<!s8i x 16>), !cir.vector<!cir.float x 4>
7474
// CIR: {{%.*}} = cir.round [[INTRIN_ARG_BACK]] : !cir.vector<!cir.float x 4>

0 commit comments

Comments
 (0)