Skip to content

Commit 311a5aa

Browse files
authored
[CIR] Improve aligned store support (#1637)
This change corrects the alignment of store operations and fixes a related problem with calculation of member offsets (we weren't accounting for the alignment of the field whose offset we were calculating. Many tests are affected by this, but most just needed a wildcard match to ignore the explicit alignment which wasn't present before. In cases where I updated a check for a specific alignment value, I compared against classic codegen to verify that we are now producing the same alignment. Two new tests are added align-store.c and alignment.cpp. The second of these partially copies a test of the same name from clang/test/CodeGen. It's testing globals and isn't directly related to the code changes here, but we didn't seem to have a test for this. I put the store alignment tests in a different file because inconsistency between CIR and LLVM IR in placement of globals would have made a combined test difficult to follow. This addresses #1204
1 parent 466e3b2 commit 311a5aa

File tree

121 files changed

+890
-764
lines changed

Some content is hidden

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

121 files changed

+890
-764
lines changed

clang/lib/CIR/CodeGen/CIRGenBuilder.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -891,6 +891,11 @@ class CIRGenBuilderTy : public cir::CIRBaseBuilderTy {
891891
bool isVolatile = false, bool isNontemporal = false,
892892
::mlir::IntegerAttr align = {},
893893
cir::MemOrderAttr order = {}) {
894+
if (!align) {
895+
uint64_t alignment = dst.getAlignment().getQuantity();
896+
if (alignment)
897+
align = getI64IntegerAttr(alignment);
898+
}
894899
return CIRBaseBuilderTy::createStore(loc, val, dst.getPointer(), isVolatile,
895900
isNontemporal, align, order);
896901
}

clang/lib/CIR/Dialect/IR/CIRTypes.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,12 @@ uint64_t RecordType::getElementOffset(const ::mlir::DataLayout &dataLayout,
549549
offset += dataLayout.getTypeSize(ty);
550550
}
551551

552+
// Account for padding, if necessary, for the alignment of the field whose
553+
// offset we are calculating.
554+
const llvm::Align tyAlign = llvm::Align(
555+
getPacked() ? 1 : dataLayout.getTypeABIAlignment(members[idx]));
556+
offset = llvm::alignTo(offset, tyAlign);
557+
552558
return offset;
553559
}
554560

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ S retS() {
104104
// CHECK: %[[#V0:]] = cir.alloca !rec_LT_64, !cir.ptr<!rec_LT_64>
105105
// CHECK: %[[#V1:]] = cir.cast(integral, %arg0 : !u64i), !u16i
106106
// CHECK: %[[#V2:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_LT_64>), !cir.ptr<!u16i>
107-
// CHECK: cir.store %[[#V1]], %[[#V2]] : !u16i, !cir.ptr<!u16i>
107+
// CHECK: cir.store{{.*}} %[[#V1]], %[[#V2]] : !u16i, !cir.ptr<!u16i>
108108

109109
// LLVM: void @pass_lt_64(i64 %0)
110110
// LLVM: %[[#V1:]] = alloca %struct.LT_64, i64 1, align 4
@@ -115,7 +115,7 @@ void pass_lt_64(LT_64 s) {}
115115
// CHECK: cir.func {{.*@pass_eq_64}}(%arg0: !u64i
116116
// CHECK: %[[#V0:]] = cir.alloca !rec_EQ_64, !cir.ptr<!rec_EQ_64>
117117
// CHECK: %[[#V1:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_EQ_64>), !cir.ptr<!u64i>
118-
// CHECK: cir.store %arg0, %[[#V1]] : !u64i, !cir.ptr<!u64i>
118+
// CHECK: cir.store{{.*}} %arg0, %[[#V1]] : !u64i, !cir.ptr<!u64i>
119119

120120
// LLVM: void @pass_eq_64(i64 %0)
121121
// LLVM: %[[#V1:]] = alloca %struct.EQ_64, i64 1, align 4
@@ -125,7 +125,7 @@ void pass_eq_64(EQ_64 s) {}
125125
// CHECK: cir.func {{.*@pass_lt_128}}(%arg0: !cir.array<!u64i x 2>
126126
// CHECK: %[[#V0:]] = cir.alloca !rec_LT_128, !cir.ptr<!rec_LT_128>
127127
// CHECK: %[[#V1:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_LT_128>), !cir.ptr<!cir.array<!u64i x 2>>
128-
// CHECK: cir.store %arg0, %[[#V1]] : !cir.array<!u64i x 2>, !cir.ptr<!cir.array<!u64i x 2>>
128+
// CHECK: cir.store{{.*}} %arg0, %[[#V1]] : !cir.array<!u64i x 2>, !cir.ptr<!cir.array<!u64i x 2>>
129129

130130
// LLVM: void @pass_lt_128([2 x i64] %0)
131131
// LLVM: %[[#V1:]] = alloca %struct.LT_128, i64 1, align 4
@@ -135,7 +135,7 @@ void pass_lt_128(LT_128 s) {}
135135
// CHECK: cir.func {{.*@pass_eq_128}}(%arg0: !cir.array<!u64i x 2>
136136
// CHECK: %[[#V0:]] = cir.alloca !rec_EQ_128, !cir.ptr<!rec_EQ_128>
137137
// CHECK: %[[#V1:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_EQ_128>), !cir.ptr<!cir.array<!u64i x 2>>
138-
// CHECK: cir.store %arg0, %[[#V1]] : !cir.array<!u64i x 2>, !cir.ptr<!cir.array<!u64i x 2>>
138+
// CHECK: cir.store{{.*}} %arg0, %[[#V1]] : !cir.array<!u64i x 2>, !cir.ptr<!cir.array<!u64i x 2>>
139139

140140
// LLVM: void @pass_eq_128([2 x i64] %0)
141141
// LLVM: %[[#V1]] = alloca %struct.EQ_128, i64 1, align 4
@@ -144,7 +144,7 @@ void pass_eq_128(EQ_128 s) {}
144144

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}
147-
// CHECK: cir.store %arg0, %[[#V0]] : !cir.ptr<!rec_GT_128>, !cir.ptr<!cir.ptr<!rec_GT_128>>
147+
// CHECK: cir.store{{.*}} %arg0, %[[#V0]] : !cir.ptr<!rec_GT_128>, !cir.ptr<!cir.ptr<!rec_GT_128>>
148148
// 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)
@@ -155,7 +155,7 @@ void pass_gt_128(GT_128 s) {}
155155

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}
158-
// CHECK: cir.store %arg1, %[[#V0]] : !cir.ptr<!rec_GT_128>, !cir.ptr<!cir.ptr<!rec_GT_128>>
158+
// CHECK: cir.store{{.*}} %arg1, %[[#V0]] : !cir.ptr<!rec_GT_128>, !cir.ptr<!cir.ptr<!rec_GT_128>>
159159
// 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
@@ -197,7 +197,7 @@ GT_128 call_and_get_gt_128() {
197197
// CHECK: cir.func @passS(%arg0: !cir.array<!u64i x 2>
198198
// CHECK: %[[#V0:]] = cir.alloca !rec_S, !cir.ptr<!rec_S>, [""] {alignment = 4 : i64}
199199
// CHECK: %[[#V1:]] = cir.alloca !cir.array<!u64i x 2>, !cir.ptr<!cir.array<!u64i x 2>>, ["tmp"] {alignment = 8 : i64}
200-
// CHECK: cir.store %arg0, %[[#V1]] : !cir.array<!u64i x 2>, !cir.ptr<!cir.array<!u64i x 2>>
200+
// CHECK: cir.store{{.*}} %arg0, %[[#V1]] : !cir.array<!u64i x 2>, !cir.ptr<!cir.array<!u64i x 2>>
201201
// CHECK: %[[#V2:]] = cir.cast(bitcast, %[[#V1]] : !cir.ptr<!cir.array<!u64i x 2>>), !cir.ptr<!void>
202202
// CHECK: %[[#V3:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_S>), !cir.ptr<!void>
203203
// CHECK: %[[#V4:]] = cir.const #cir.int<12> : !u64i
@@ -270,7 +270,7 @@ typedef struct {
270270

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}
273-
// CHECK: cir.store %arg0, %[[#V0]] : !cir.ptr<!rec_CAT>, !cir.ptr<!cir.ptr<!rec_CAT>>
273+
// CHECK: cir.store{{.*}} %arg0, %[[#V0]] : !cir.ptr<!rec_CAT>, !cir.ptr<!cir.ptr<!rec_CAT>>
274274
// CHECK: %[[#V1:]] = cir.load %[[#V0]] : !cir.ptr<!cir.ptr<!rec_CAT>>, !cir.ptr<!rec_CAT>
275275
// CHECK: cir.return
276276

@@ -294,7 +294,7 @@ typedef struct {
294294
// CHECK: %[[#V0:]] = cir.alloca !rec_NESTED_U, !cir.ptr<!rec_NESTED_U>, [""] {alignment = 4 : i64}
295295
// CHECK: %[[#V1:]] = cir.cast(integral, %arg0 : !u64i), !u16i
296296
// CHECK: %[[#V2:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_NESTED_U>
297-
// CHECK: cir.store %[[#V1]], %[[#V2]] : !u16i
297+
// CHECK: cir.store{{.*}} %[[#V1]], %[[#V2]] : !u16i
298298
// CHECK: cir.return
299299

300300
// LLVM: @pass_nested_u(i64 %[[#V0:]]
@@ -359,7 +359,7 @@ void bar(void) {
359359
// CHECK: %[[#V0:]] = cir.alloca !rec_PackedS1, !cir.ptr<!rec_PackedS1>, ["y", init]
360360
// CHECK: %[[#V1:]] = cir.alloca !cir.array<!u64i x 2>, !cir.ptr<!cir.array<!u64i x 2>>, ["tmp"]
361361
// CHECK: %[[#V2:]] = cir.call @foo() : () -> !cir.array<!u64i x 2>
362-
// CHECK: cir.store %[[#V2]], %[[#V1]] : !cir.array<!u64i x 2>, !cir.ptr<!cir.array<!u64i x 2>>
362+
// CHECK: cir.store{{.*}} %[[#V2]], %[[#V1]] : !cir.array<!u64i x 2>, !cir.ptr<!cir.array<!u64i x 2>>
363363
// CHECK: %[[#V3:]] = cir.cast(bitcast, %[[#V1]] : !cir.ptr<!cir.array<!u64i x 2>>), !cir.ptr<!void>
364364
// CHECK: %[[#V4:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_PackedS1>), !cir.ptr<!void>
365365
// CHECK: %[[#V5:]] = cir.const #cir.int<14> : !u64i
@@ -401,7 +401,7 @@ void qux(void) {
401401
// CHECK: %[[#V3:]] = cir.const #cir.int<1> : !s32i
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>
404-
// CHECK: cir.store %[[#V5]], %[[#V0]] : !cir.ptr<!rec_PackedS2>, !cir.ptr<!cir.ptr<!rec_PackedS2>>
404+
// CHECK: cir.store{{.*}} %[[#V5]], %[[#V0]] : !cir.ptr<!rec_PackedS2>, !cir.ptr<!cir.ptr<!rec_PackedS2>>
405405
// 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

clang/test/CIR/CallConvLowering/AArch64/ptr-fields.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ int foo(int x) { return x; }
1414
// CIR: cir.func @passA(%arg0: !u64i
1515
// CIR: %[[#V0:]] = cir.alloca !rec_A, !cir.ptr<!rec_A>, [""] {alignment = 4 : i64}
1616
// CIR: %[[#V1:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_A>), !cir.ptr<!u64i>
17-
// CIR: cir.store %arg0, %[[#V1]] : !u64i, !cir.ptr<!u64i>
17+
// CIR: cir.store{{.*}} %arg0, %[[#V1]] : !u64i, !cir.ptr<!u64i>
1818
// CIR: %[[#V2:]] = cir.get_global @foo : !cir.ptr<!cir.func<(!s32i) -> !s32i>>
1919
// CIR: %[[#V3:]] = cir.get_member %[[#V0]][0] {name = "f"} : !cir.ptr<!rec_A> -> !cir.ptr<!cir.ptr<!cir.func<(!s32i) -> !s32i>>>
20-
// CIR: cir.store %[[#V2]], %[[#V3]] : !cir.ptr<!cir.func<(!s32i) -> !s32i>>, !cir.ptr<!cir.ptr<!cir.func<(!s32i) -> !s32i>>>
20+
// CIR: cir.store{{.*}} %[[#V2]], %[[#V3]] : !cir.ptr<!cir.func<(!s32i) -> !s32i>>, !cir.ptr<!cir.ptr<!cir.func<(!s32i) -> !s32i>>>
2121
// CIR: cir.return
2222

2323
// LLVM: void @passA(i64 %[[#V0:]])
@@ -39,7 +39,7 @@ typedef struct {
3939
// CIR: cir.func @passB(%arg0: !u64i
4040
// CIR: %[[#V0:]] = cir.alloca !rec_S_2, !cir.ptr<!rec_S_2>, [""] {alignment = 4 : i64}
4141
// CIR: %[[#V1:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_S_2>), !cir.ptr<!u64i>
42-
// CIR: cir.store %arg0, %[[#V1]] : !u64i, !cir.ptr<!u64i>
42+
// CIR: cir.store{{.*}} %arg0, %[[#V1]] : !u64i, !cir.ptr<!u64i>
4343
// CIR: cir.return
4444

4545
// LLVM: void @passB(i64 %[[#V0:]])

clang/test/CIR/CallConvLowering/AArch64/struct.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ typedef struct {
1010
// CIR: cir.func @init(%arg0: !u64i
1111
// CIR: %[[#V0:]] = cir.alloca !rec_S, !cir.ptr<!rec_S>, [""] {alignment = 4 : i64}
1212
// CIR: %[[#V1:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_S>), !cir.ptr<!u64i>
13-
// CIR: cir.store %arg0, %[[#V1]] : !u64i, !cir.ptr<!u64i>
13+
// CIR: cir.store{{.*}} %arg0, %[[#V1]] : !u64i, !cir.ptr<!u64i>
1414
// CIR: %[[#V2:]] = cir.alloca !rec_S, !cir.ptr<!rec_S>, ["__retval"] {alignment = 4 : i64}
1515
// CIR: %[[#V3:]] = cir.const #cir.int<1> : !s32i
1616
// CIR: %[[#V4:]] = cir.get_member %[[#V0]][0] {name = "a"} : !cir.ptr<!rec_S> -> !cir.ptr<!s32i>
17-
// CIR: cir.store %[[#V3]], %[[#V4]] : !s32i, !cir.ptr<!s32i>
17+
// CIR: cir.store{{.*}} %[[#V3]], %[[#V4]] : !s32i, !cir.ptr<!s32i>
1818
// CIR: %[[#V5:]] = cir.const #cir.int<2> : !s32i
1919
// CIR: %[[#V6:]] = cir.get_member %[[#V0]][1] {name = "b"} : !cir.ptr<!rec_S> -> !cir.ptr<!s32i>
20-
// CIR: cir.store %[[#V5]], %[[#V6]] : !s32i, !cir.ptr<!s32i>
20+
// CIR: cir.store{{.*}} %[[#V5]], %[[#V6]] : !s32i, !cir.ptr<!s32i>
2121
// CIR: cir.copy %[[#V0]] to %[[#V2]] : !cir.ptr<!rec_S>
2222
// CIR: %[[#V7:]] = cir.cast(bitcast, %[[#V2]] : !cir.ptr<!rec_S>), !cir.ptr<!u64i>
2323
// CIR: %[[#V8:]] = cir.load %[[#V7]] : !cir.ptr<!u64i>, !u64i
@@ -47,7 +47,7 @@ S init(S s) {
4747
// CIR: %[[#V3:]] = cir.load %[[#V2]] : !cir.ptr<!u64i>, !u64i
4848
// CIR: %[[#V4:]] = cir.call @init(%[[#V3]]) : (!u64i) -> !u64i
4949
// CIR: %[[#V5:]] = cir.cast(bitcast, %[[#V1]] : !cir.ptr<!rec_S>), !cir.ptr<!u64i>
50-
// CIR: cir.store %[[#V4]], %[[#V5]] : !u64i, !cir.ptr<!u64i>
50+
// CIR: cir.store{{.*}} %[[#V4]], %[[#V5]] : !u64i, !cir.ptr<!u64i>
5151
// CIR: cir.copy %[[#V1]] to %[[#V0]] : !cir.ptr<!rec_S>
5252
// CIR: cir.return
5353

@@ -66,17 +66,17 @@ void foo1() {
6666
// CIR: cir.func @foo2(%arg0: !u64i
6767
// CIR: %[[#V0:]] = cir.alloca !rec_S, !cir.ptr<!rec_S>, [""] {alignment = 4 : i64}
6868
// CIR: %[[#V1:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_S>), !cir.ptr<!u64i>
69-
// CIR: cir.store %arg0, %[[#V1]] : !u64i, !cir.ptr<!u64i>
69+
// CIR: cir.store{{.*}} %arg0, %[[#V1]] : !u64i, !cir.ptr<!u64i>
7070
// CIR: %[[#V2:]] = cir.alloca !rec_S, !cir.ptr<!rec_S>, ["__retval"] {alignment = 4 : i64}
7171
// CIR: %[[#V3:]] = cir.alloca !rec_S, !cir.ptr<!rec_S>, ["s2"]
7272
// CIR: %[[#V4:]] = cir.alloca !rec_S, !cir.ptr<!rec_S>, ["tmp"] {alignment = 4 : i64}
7373
// CIR: %[[#V5:]] = cir.const #cir.const_record<{#cir.int<1> : !s32i, #cir.int<2> : !s32i}> : !rec_S
74-
// CIR: cir.store %[[#V5]], %[[#V3]] : !rec_S, !cir.ptr<!rec_S>
74+
// CIR: cir.store{{.*}} %[[#V5]], %[[#V3]] : !rec_S, !cir.ptr<!rec_S>
7575
// CIR: %[[#V6:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_S>), !cir.ptr<!u64i>
7676
// CIR: %[[#V7:]] = cir.load %[[#V6]] : !cir.ptr<!u64i>, !u64i
7777
// CIR: %[[#V8:]] = cir.call @foo2(%[[#V7]]) : (!u64i) -> !u64i
7878
// CIR: %[[#V9:]] = cir.cast(bitcast, %[[#V4]] : !cir.ptr<!rec_S>), !cir.ptr<!u64i>
79-
// CIR: cir.store %[[#V8]], %[[#V9]] : !u64i, !cir.ptr<!u64i>
79+
// CIR: cir.store{{.*}} %[[#V8]], %[[#V9]] : !u64i, !cir.ptr<!u64i>
8080
// CIR: cir.copy %[[#V4]] to %[[#V0]] : !cir.ptr<!rec_S>
8181
// CIR: cir.copy %[[#V0]] to %[[#V2]] : !cir.ptr<!rec_S>
8282
// CIR: %[[#V10:]] = cir.cast(bitcast, %[[#V2]] : !cir.ptr<!rec_S>), !cir.ptr<!u64i>
@@ -111,16 +111,16 @@ typedef struct {
111111
// CIR: cir.func @init2(%arg0: !u16i
112112
// CIR: %[[#V0:]] = cir.alloca !rec_S2, !cir.ptr<!rec_S2>, [""] {alignment = 4 : i64}
113113
// CIR: %[[#V1:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_S2>), !cir.ptr<!u16i>
114-
// CIR: cir.store %arg0, %[[#V1]] : !u16i, !cir.ptr<!u16i>
114+
// CIR: cir.store{{.*}} %arg0, %[[#V1]] : !u16i, !cir.ptr<!u16i>
115115
// CIR: %[[#V2:]] = cir.alloca !rec_S2, !cir.ptr<!rec_S2>, ["__retval"] {alignment = 1 : i64}
116116
// CIR: %[[#V3:]] = cir.const #cir.int<1> : !s32i
117117
// CIR: %[[#V4:]] = cir.cast(integral, %[[#V3]] : !s32i), !s8i
118118
// CIR: %[[#V5:]] = cir.get_member %[[#V0]][0] {name = "a"} : !cir.ptr<!rec_S2> -> !cir.ptr<!s8i>
119-
// CIR: cir.store %[[#V4]], %[[#V5]] : !s8i, !cir.ptr<!s8i>
119+
// CIR: cir.store{{.*}} %[[#V4]], %[[#V5]] : !s8i, !cir.ptr<!s8i>
120120
// CIR: %[[#V6:]] = cir.const #cir.int<2> : !s32i
121121
// CIR: %[[#V7:]] = cir.cast(integral, %[[#V6]] : !s32i), !s8i
122122
// CIR: %[[#V8:]] = cir.get_member %[[#V0]][1] {name = "b"} : !cir.ptr<!rec_S2> -> !cir.ptr<!s8i>
123-
// CIR: cir.store %[[#V7]], %[[#V8]] : !s8i, !cir.ptr<!s8i>
123+
// CIR: cir.store{{.*}} %[[#V7]], %[[#V8]] : !s8i, !cir.ptr<!s8i>
124124
// CIR: cir.copy %[[#V0]] to %[[#V2]] : !cir.ptr<!rec_S2>
125125
// CIR: %[[#V9:]] = cir.cast(bitcast, %[[#V2]] : !cir.ptr<!rec_S2>), !cir.ptr<!u16i>
126126
// CIR: %[[#V10:]] = cir.load %[[#V9]] : !cir.ptr<!u16i>, !u16i
@@ -150,7 +150,7 @@ S2 init2(S2 s) {
150150
// CIR: %[[#V3:]] = cir.load %[[#V2]] : !cir.ptr<!u16i>, !u16i
151151
// CIR: %[[#V4:]] = cir.call @init2(%[[#V3]]) : (!u16i) -> !u16i
152152
// CIR: %[[#V5:]] = cir.cast(bitcast, %[[#V1]] : !cir.ptr<!rec_S2>), !cir.ptr<!u16i>
153-
// CIR: cir.store %[[#V4]], %[[#V5]] : !u16i, !cir.ptr<!u16i>
153+
// CIR: cir.store{{.*}} %[[#V4]], %[[#V5]] : !u16i, !cir.ptr<!u16i>
154154
// CIR: cir.copy %[[#V1]] to %[[#V0]] : !cir.ptr<!rec_S2>
155155
// CIR: cir.return
156156

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ struct S1 {
101101
/// Cast arguments to the expected type.
102102
// CHECK: %[[#V0:]] = cir.alloca !rec_S1, !cir.ptr<!rec_S1>, [""] {alignment = 4 : i64}
103103
// CHECK: %[[#V1:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_S1>), !cir.ptr<!u64i>
104-
// CHECK: cir.store %arg0, %[[#V1]] : !u64i, !cir.ptr<!u64i>
104+
// CHECK: cir.store{{.*}} %arg0, %[[#V1]] : !u64i, !cir.ptr<!u64i>
105105
// CHECK: %[[#V2:]] = cir.alloca !rec_S1, !cir.ptr<!rec_S1>, ["__retval"] {alignment = 4 : i64}
106106
// CHECK: %[[#V3:]] = cir.alloca !rec_S1, !cir.ptr<!rec_S1>, ["agg.tmp0"] {alignment = 4 : i64}
107107
// CHECK: %[[#V4:]] = cir.alloca !rec_S1, !cir.ptr<!rec_S1>, ["agg.tmp1"] {alignment = 4 : i64}
@@ -112,15 +112,15 @@ S1 s1(S1 arg) {
112112
// 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>
115-
// CHECK: cir.store %[[#V11]], %[[#V12]] : !u64i, !cir.ptr<!u64i>
115+
// CHECK: cir.store{{.*}} %[[#V11]], %[[#V12]] : !u64i, !cir.ptr<!u64i>
116116
s1({1, 2});
117117

118118
// CHECK: %[[#V13:]] = cir.get_member %[[#V2]][0] {name = "a"} : !cir.ptr<!rec_S1> -> !cir.ptr<!s32i>
119119
// CHECK: %[[#V14:]] = cir.const #cir.int<1> : !s32i
120-
// CHECK: cir.store %[[#V14]], %[[#V13]] : !s32i, !cir.ptr<!s32i>
120+
// CHECK: cir.store{{.*}} %[[#V14]], %[[#V13]] : !s32i, !cir.ptr<!s32i>
121121
// CHECK: %[[#V15:]] = cir.get_member %[[#V2]][1] {name = "b"} : !cir.ptr<!rec_S1> -> !cir.ptr<!s32i>
122122
// CHECK: %[[#V16:]] = cir.const #cir.int<2> : !s32i
123-
// CHECK: cir.store %[[#V16]], %[[#V15]] : !s32i, !cir.ptr<!s32i>
123+
// CHECK: cir.store{{.*}} %[[#V16]], %[[#V15]] : !s32i, !cir.ptr<!s32i>
124124
// CHECK: %[[#V17:]] = cir.cast(bitcast, %[[#V2]] : !cir.ptr<!rec_S1>), !cir.ptr<!u64i>
125125
// CHECK: %[[#V18:]] = cir.load %[[#V17]] : !cir.ptr<!u64i>, !u64i
126126
// CHECK: cir.return %[[#V18]] : !u64i
@@ -139,9 +139,9 @@ struct S2 {
139139
// CHECK: %[[#F0:]] = cir.alloca !rec_S2, !cir.ptr<!rec_S2>
140140
// CHECK: %[[#F1:]] = cir.alloca !rec_anon_struct, !cir.ptr<!rec_anon_struct>
141141
// CHECK: %[[#F2:]] = cir.get_member %[[#F1]][0]{{.*}} : !cir.ptr<!rec_anon_struct> -> !cir.ptr<!u64i>
142-
// CHECK: cir.store %[[ARG0]], %[[#F2]] : !u64i, !cir.ptr<!u64i>
142+
// CHECK: cir.store{{.*}} %[[ARG0]], %[[#F2]] : !u64i, !cir.ptr<!u64i>
143143
// CHECK: %[[#F3:]] = cir.get_member %[[#F1]][1]{{.*}} : !cir.ptr<!rec_anon_struct> -> !cir.ptr<!s32i>
144-
// CHECK: cir.store %[[ARG1]], %[[#F3]] : !s32i, !cir.ptr<!s32i>
144+
// CHECK: cir.store{{.*}} %[[ARG1]], %[[#F3]] : !s32i, !cir.ptr<!s32i>
145145
// CHECK: %[[#F4:]] = cir.cast(bitcast, %[[#F1]] : !cir.ptr<!rec_anon_struct>), !cir.ptr<!void>
146146
// CHECK: %[[#F5:]] = cir.cast(bitcast, %[[#F0]] : !cir.ptr<!rec_S2>), !cir.ptr<!void>
147147
// CHECK: %[[#F6:]] = cir.const #cir.int<12> : !u64i
@@ -159,19 +159,19 @@ S2 s2(S2 arg) {
159159

160160
// CHECK: %[[#F14:]] = cir.get_member %[[#F8]][0] {{.*}} : !cir.ptr<!rec_S2> -> !cir.ptr<!s32i>
161161
// CHECK: %[[#F15:]] = cir.const #cir.int<1> : !s32i
162-
// CHECK: cir.store %[[#F15]], %[[#F14]] : !s32i, !cir.ptr<!s32i>
162+
// CHECK: cir.store{{.*}} %[[#F15]], %[[#F14]] : !s32i, !cir.ptr<!s32i>
163163
// CHECK: %[[#F16:]] = cir.get_member %[[#F8]][1] {{.*}} : !cir.ptr<!rec_S2> -> !cir.ptr<!s32i>
164164
// CHECK: %[[#F17:]] = cir.const #cir.int<2> : !s32i
165-
// CHECK: cir.store %[[#F17]], %[[#F16]] : !s32i, !cir.ptr<!s32i>
165+
// CHECK: cir.store{{.*}} %[[#F17]], %[[#F16]] : !s32i, !cir.ptr<!s32i>
166166
// CHECK: %[[#F18:]] = cir.get_member %[[#F8]][2] {{.*}} : !cir.ptr<!rec_S2> -> !cir.ptr<!s32i>
167167
// CHECK: %[[#F19:]] = cir.const #cir.int<3> : !s32i
168-
// CHECK: cir.store %[[#F19]], %[[#F18]] : !s32i, !cir.ptr<!s32i>
168+
// CHECK: cir.store{{.*}} %[[#F19]], %[[#F18]] : !s32i, !cir.ptr<!s32i>
169169

170170
// COM: Flattening of the struct.
171171
// COM: { i32, i32, i32 } -> { i64, i32 }.
172172

173173
// CHECK: %[[#F20:]] = cir.load %[[#F8]] : !cir.ptr<!rec_S2>, !rec_S2
174-
// CHECK: cir.store %[[#F20]], %[[#F11]] : !rec_S2, !cir.ptr<!rec_S2>
174+
// 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>
177177
// CHECK: %[[#F23:]] = cir.const #cir.int<12> : !u64i
@@ -185,7 +185,7 @@ S2 s2(S2 arg) {
185185
// CHECK: %[[#F26:]] = cir.get_member %[[#F10]][1] {name = ""} : !cir.ptr<!rec_anon_struct> -> !cir.ptr<!s32i>
186186
// CHECK: %[[#F27:]] = cir.load %[[#F26]] : !cir.ptr<!s32i>, !s32i
187187
// CHECK: %[[#F28:]] = cir.call @_Z2s22S2(%[[#F25]], %[[#F27]]) : (!u64i, !s32i) -> !rec_anon_struct
188-
// CHECK: cir.store %[[#F28]], %[[#F12]] : !rec_anon_struct, !cir.ptr<!rec_anon_struct>
188+
// CHECK: cir.store{{.*}} %[[#F28]], %[[#F12]] : !rec_anon_struct, !cir.ptr<!rec_anon_struct>
189189

190190
// CHECK: %[[#F29:]] = cir.cast(bitcast, %[[#F12]] : !cir.ptr<!rec_anon_struct>), !cir.ptr<!void>
191191
// CHECK: %[[#F30:]] = cir.cast(bitcast, %[[#F9]] : !cir.ptr<!rec_S2>), !cir.ptr<!void>

0 commit comments

Comments
 (0)