Skip to content

Commit 12d24e0

Browse files
authored
[CodeGen] Simplify codegen for array initialization (#93956)
This makes codegen for array initialization simpler in two ways: 1. Drop the zero-index GEP at the start, which is no longer needed with opaque pointers. 2. Emit GEPs directly to the correct element, instead of having a long chain of +1 GEPs. This is more canonical, and also avoids regressions in unoptimized builds from #93823.
1 parent a6929db commit 12d24e0

File tree

76 files changed

+835
-1132
lines changed

Some content is hidden

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

76 files changed

+835
-1132
lines changed

clang/lib/CodeGen/CGExprAgg.cpp

+9-20
Original file line numberDiff line numberDiff line change
@@ -513,15 +513,6 @@ void AggExprEmitter::EmitArrayInit(Address DestPtr, llvm::ArrayType *AType,
513513

514514
QualType elementType =
515515
CGF.getContext().getAsArrayType(ArrayQTy)->getElementType();
516-
517-
// DestPtr is an array*. Construct an elementType* by drilling
518-
// down a level.
519-
llvm::Value *zero = llvm::ConstantInt::get(CGF.SizeTy, 0);
520-
llvm::Value *indices[] = { zero, zero };
521-
llvm::Value *begin = Builder.CreateInBoundsGEP(DestPtr.getElementType(),
522-
DestPtr.emitRawPointer(CGF),
523-
indices, "arrayinit.begin");
524-
525516
CharUnits elementSize = CGF.getContext().getTypeSizeInChars(elementType);
526517
CharUnits elementAlign =
527518
DestPtr.getAlignment().alignmentOfArrayElement(elementSize);
@@ -562,6 +553,7 @@ void AggExprEmitter::EmitArrayInit(Address DestPtr, llvm::ArrayType *AType,
562553
Address endOfInit = Address::invalid();
563554
CodeGenFunction::CleanupDeactivationScope deactivation(CGF);
564555

556+
llvm::Value *begin = DestPtr.emitRawPointer(CGF);
565557
if (dtorKind) {
566558
CodeGenFunction::AllocaTrackerRAII allocaTracker(CGF);
567559
// In principle we could tell the cleanup where we are more
@@ -585,19 +577,13 @@ void AggExprEmitter::EmitArrayInit(Address DestPtr, llvm::ArrayType *AType,
585577

586578
llvm::Value *one = llvm::ConstantInt::get(CGF.SizeTy, 1);
587579

588-
// The 'current element to initialize'. The invariants on this
589-
// variable are complicated. Essentially, after each iteration of
590-
// the loop, it points to the last initialized element, except
591-
// that it points to the beginning of the array before any
592-
// elements have been initialized.
593-
llvm::Value *element = begin;
594-
595580
// Emit the explicit initializers.
596581
for (uint64_t i = 0; i != NumInitElements; ++i) {
597-
// Advance to the next element.
582+
llvm::Value *element = begin;
598583
if (i > 0) {
599-
element = Builder.CreateInBoundsGEP(
600-
llvmElementType, element, one, "arrayinit.element");
584+
element = Builder.CreateInBoundsGEP(llvmElementType, begin,
585+
llvm::ConstantInt::get(CGF.SizeTy, i),
586+
"arrayinit.element");
601587

602588
// Tell the cleanup that it needs to destroy up to this
603589
// element. TODO: some of these stores can be trivially
@@ -624,9 +610,12 @@ void AggExprEmitter::EmitArrayInit(Address DestPtr, llvm::ArrayType *AType,
624610
// do { *array++ = filler; } while (array != end);
625611

626612
// Advance to the start of the rest of the array.
613+
llvm::Value *element = begin;
627614
if (NumInitElements) {
628615
element = Builder.CreateInBoundsGEP(
629-
llvmElementType, element, one, "arrayinit.start");
616+
llvmElementType, element,
617+
llvm::ConstantInt::get(CGF.SizeTy, NumInitElements),
618+
"arrayinit.start");
630619
if (endOfInit.isValid()) Builder.CreateStore(element, endOfInit);
631620
}
632621

clang/test/CodeGen/paren-list-agg-init.cpp

+18-26
Original file line numberDiff line numberDiff line change
@@ -271,14 +271,13 @@ const int* foo10() {
271271
// CHECK-NEXT: [[ARR_2:%.*]] = alloca [4 x i32], align 16
272272
// CHECK-NEXT: store i32 [[A:%.*]], ptr [[A_ADDR]], align 4
273273
// CHECK-NEXT: store i32 [[B:%.*]], ptr [[B_ADDR]], align 4
274-
// CHECK-NEXT: [[ARRINIT_BEGIN:%.*]] = getelementptr inbounds [4 x i32], ptr [[ARR_2]], i64 0, i64 0
275274
// CHECK-NEXT: [[TMP_0:%.*]] = load i32, ptr [[A_ADDR]], align 4
276-
// CHECK-NEXT: store i32 [[TMP_0]], ptr [[ARRINIT_BEGIN]], align 4
277-
// CHECK-NEXT: [[ARRINIT_ELEM:%.*]] = getelementptr inbounds i32, ptr [[ARRINIT_BEGIN]], i64 1
275+
// CHECK-NEXT: store i32 [[TMP_0]], ptr [[ARR_2]], align 4
276+
// CHECK-NEXT: [[ARRINIT_ELEM:%.*]] = getelementptr inbounds i32, ptr [[ARR_2]], i64 1
278277
// CHECK-NEXT: [[TMP_1:%.*]] = load i32, ptr [[B_ADDR]], align 4
279278
// CHECK-NEXT: store i32 [[TMP_1]], ptr [[ARRINIT_ELEM]], align 4
280-
// CHECK-NEXT: [[ARRINIT_START:%.*]] = getelementptr inbounds i32, ptr [[ARRINIT_ELEM]], i64 1
281-
// CHECK-NEXT: [[ARRINIT_END:%.*]] = getelementptr inbounds i32, ptr [[ARRINIT_BEGIN]], i64 4
279+
// CHECK-NEXT: [[ARRINIT_START:%.*]] = getelementptr inbounds i32, ptr [[ARR_2]], i64 2
280+
// CHECK-NEXT: [[ARRINIT_END:%.*]] = getelementptr inbounds i32, ptr [[ARR_2]], i64 4
282281
// CHECK-NEXT: br label [[ARRINIT_BODY:%.*]]
283282
// CHECK: [[ARRINIT_CUR:%.*]] = phi ptr [ [[ARRINIT_START]], %entry ], [ [[ARRINIT_NEXT:%.*]], [[ARRINIT_BODY]] ]
284283
// CHECK-NEXT: store i32 0, ptr [[ARRINIT_CUR]], align 4
@@ -297,10 +296,9 @@ void foo11(int a, int b) {
297296
// CHECK-NEXT: [[ARR_3:%.*]] = alloca [2 x i32], align 4
298297
// CHECK-NEXT: store i32 [[A:%.*]], ptr [[A_ADDR]], align 4
299298
// CHECK-NEXT: store i32 [[B:%.*]], ptr [[B_ADDR]], align 4
300-
// CHECK-NEXT: [[ARRINIT_BEGIN:%.*]] = getelementptr inbounds [2 x i32], ptr [[ARR_3]], i64 0, i64 0
301299
// CHECK-NEXT: [[TMP_0:%.*]] = load i32, ptr [[A_ADDR]], align 4
302-
// CHECK-NEXT: store i32 [[TMP_0]], ptr [[ARRINIT_BEGIN]], align 4
303-
// CHECK-NEXT: [[ARRINIT_ELEMENT:%.*]] = getelementptr inbounds i32, ptr [[ARRINIT_BEGIN]], i64 1
300+
// CHECK-NEXT: store i32 [[TMP_0]], ptr [[ARR_3]], align 4
301+
// CHECK-NEXT: [[ARRINIT_ELEMENT:%.*]] = getelementptr inbounds i32, ptr [[ARR_3]], i64 1
304302
// CHECK-NEXT: [[TMP_1:%.*]] = load i32, ptr [[B_ADDR]], align 4
305303
// CHECK-NEXT: store i32 [[TMP_1]], ptr [[ARRINIT_ELEMENT]], align 4
306304
// CHECK-NEXT: ret void
@@ -336,8 +334,7 @@ const int* foo15() {
336334
// CHECK-NEXT: entry:
337335
// CHECK-NEXT: [[ARR_6:%.*arr6.*]] = alloca ptr, align 8
338336
// CHECK-NEXT: [[REF_TMP:%.*]] = alloca [1 x i32], align 4
339-
// CHECK-NEXT: [[ARRINIT_BEGIN:%.*]] = getelementptr inbounds [1 x i32], ptr [[REF_TMP]], i64 0, i64 0
340-
// CHECK-NEXT: store i32 3, ptr [[ARRINIT_BEGIN]], align 4
337+
// CHECK-NEXT: store i32 3, ptr [[REF_TMP]], align 4
341338
// CHECK-NEXT: store ptr [[REF_TMP]], ptr [[ARR_6]], align 8
342339
// CHECK-NEXT: ret void
343340
void foo16() {
@@ -348,10 +345,9 @@ void foo16() {
348345
// CHECK-NEXT: entry:
349346
// CHECK-NEXT: [[ARR_7:%.*arr7.*]] = alloca ptr, align 8
350347
// CHECK-NEXT: [[REF_TMP:%.*]] = alloca [2 x i32], align 4
351-
// CHECK-NEXT: [[ARRINIT_BEGIN:%.*]] = getelementptr inbounds [2 x i32], ptr [[REF_TMP]], i64 0, i64 0
352-
// CHECK-NEXT: store i32 4, ptr [[ARRINIT_BEGIN]], align 4
353-
// CHECK-NEXT: [[ARRINIT_START:%.*]] = getelementptr inbounds i32, ptr [[ARRINIT_BEGIN]], i64 1
354-
// CHECK-NEXT: [[ARRINIT_END:%.*]] = getelementptr inbounds i32, ptr [[ARRINIT_BEGIN]], i64 2
348+
// CHECK-NEXT: store i32 4, ptr [[REF_TMP]], align 4
349+
// CHECK-NEXT: [[ARRINIT_START:%.*]] = getelementptr inbounds i32, ptr [[REF_TMP]], i64 1
350+
// CHECK-NEXT: [[ARRINIT_END:%.*]] = getelementptr inbounds i32, ptr [[REF_TMP]], i64 2
355351
// CHECK-NEXT: br label [[ARRINIT_BODY]]
356352
// CHECK: [[ARRINIT_CUR:%.*]] = phi ptr [ [[ARRINIT_START]], %entry ], [ [[ARRINIT_NEXT:%.*]], [[ARRINIT_BODY]] ]
357353
// CHECK-NEXT: store i32 0, ptr [[ARRINIT_CUR]], align 4
@@ -533,14 +529,12 @@ namespace gh68198 {
533529
// CHECK-NEXT: entry
534530
// CHECK-NEXT: [[ARR_10:%.*arr9.*]] = alloca ptr, align 8
535531
// CHECK-NEXT: [[CALL_PTR]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 16)
536-
// CHECK-NEXT: [[ARRAYINIT_BEGIN:%.*]] = getelementptr inbounds [2 x i32], ptr [[CALL]], i64 0, i64 0
537-
// CHECK-NEXT: store i32 1, ptr [[ARRAYINIT_BEGIN]], align 4
538-
// CHECK-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds i32, ptr [[ARRAYINIT_BEGIN]], i64 1
532+
// CHECK-NEXT: store i32 1, ptr [[CALL]], align 4
533+
// CHECK-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds i32, ptr [[CALL]], i64 1
539534
// CHECK-NEXT: store i32 2, ptr [[ARRAYINIT_ELEMENT]], align 4
540535
// CHECK-NEXT: [[ARRAY_EXP_NEXT:%.*]] = getelementptr inbounds [2 x i32], ptr %call, i64 1
541-
// CHECK-NEXT: [[ARRAYINIT_BEGIN1:%.*]] = getelementptr inbounds [2 x i32], ptr [[ARRAY_EXP_NEXT]], i64 0, i64 0
542-
// CHECK-NEXT: store i32 3, ptr [[ARRAYINIT_BEGIN1]], align 4
543-
// CHECK-NEXT: [[ARRAYINIT_ELEMENT2:%.*]] = getelementptr inbounds i32, ptr [[ARRAYINIT_BEGIN1]], i64 1
536+
// CHECK-NEXT: store i32 3, ptr [[ARRAY_EXP_NEXT]], align 4
537+
// CHECK-NEXT: [[ARRAYINIT_ELEMENT2:%.*]] = getelementptr inbounds i32, ptr [[ARRAY_EXP_NEXT]], i64 1
544538
// CHECK-NEXT: store i32 4, ptr [[ARRAYINIT_ELEMENT2]], align 4
545539
// CHECK-NEXT: [[ARRAY_EXP_NEXT3:%.*]] = getelementptr inbounds [2 x i32], ptr [[ARRAY_EXP_NEXT]], i64 1
546540
// CHECK-NEXT: store ptr [[CALL_PTR]], ptr [[ARR_10]], align 8
@@ -553,14 +547,12 @@ namespace gh68198 {
553547
// CHECK-NEXT: entry
554548
// CHECK-NEXT: [[ARR_10:%.*arr10.*]] = alloca ptr, align 8
555549
// CHECK-NEXT: [[CALL_PTR]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 32)
556-
// CHECK-NEXT: [[ARRAYINIT_BEGIN:%.*]] = getelementptr inbounds [2 x i32], ptr [[CALL]], i64 0, i64 0
557-
// CHECK-NEXT: store i32 5, ptr [[ARRAYINIT_BEGIN]], align 4
558-
// CHECK-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds i32, ptr [[ARRAYINIT_BEGIN]], i64 1
550+
// CHECK-NEXT: store i32 5, ptr [[CALL]], align 4
551+
// CHECK-NEXT: [[ARRAYINIT_ELEMENT:%.*]] = getelementptr inbounds i32, ptr [[CALL]], i64 1
559552
// CHECK-NEXT: store i32 6, ptr [[ARRAYINIT_ELEMENT]], align 4
560553
// CHECK-NEXT: [[ARRAY_EXP_NEXT:%.*]] = getelementptr inbounds [2 x i32], ptr %call, i64 1
561-
// CHECK-NEXT: [[ARRAYINIT_BEGIN1:%.*]] = getelementptr inbounds [2 x i32], ptr [[ARRAY_EXP_NEXT]], i64 0, i64 0
562-
// CHECK-NEXT: store i32 7, ptr [[ARRAYINIT_BEGIN1]], align 4
563-
// CHECK-NEXT: [[ARRAYINIT_ELEMENT2:%.*]] = getelementptr inbounds i32, ptr [[ARRAYINIT_BEGIN1]], i64 1
554+
// CHECK-NEXT: store i32 7, ptr [[ARRAY_EXP_NEXT]], align 4
555+
// CHECK-NEXT: [[ARRAYINIT_ELEMENT2:%.*]] = getelementptr inbounds i32, ptr [[ARRAY_EXP_NEXT]], i64 1
564556
// CHECK-NEXT: store i32 8, ptr [[ARRAYINIT_ELEMENT2]], align 4
565557
// CHECK-NEXT: [[ARRAY_EXP_NEXT3:%.*]] = getelementptr inbounds [2 x i32], ptr [[ARRAY_EXP_NEXT]], i64 1
566558
// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[ARRAY_EXP_NEXT3]], i8 0, i64 16, i1 false)

clang/test/CodeGenCXX/control-flow-in-stmt-expr.cpp

+15-17
Original file line numberDiff line numberDiff line change
@@ -158,16 +158,15 @@ void ArrayInit() {
158158
// CHECK-LABEL: define dso_local void @_Z9ArrayInitv()
159159
// CHECK: %arrayinit.endOfInit = alloca ptr, align 8
160160
// CHECK: %cleanup.dest.slot = alloca i32, align 4
161-
// CHECK: %arrayinit.begin = getelementptr inbounds [4 x %struct.Printy], ptr %arr, i64 0, i64 0
162-
// CHECK: store ptr %arrayinit.begin, ptr %arrayinit.endOfInit, align 8
161+
// CHECK: store ptr %arr, ptr %arrayinit.endOfInit, align 8
163162
Printy arr[4] = {
164163
Printy("a"),
165-
// CHECK: call void @_ZN6PrintyC1EPKc(ptr noundef nonnull align 8 dereferenceable(8) %arrayinit.begin, ptr noundef @.str)
166-
// CHECK: [[ARRAYINIT_ELEMENT1:%.+]] = getelementptr inbounds %struct.Printy, ptr %arrayinit.begin, i64 1
164+
// CHECK: call void @_ZN6PrintyC1EPKc(ptr noundef nonnull align 8 dereferenceable(8) %arr, ptr noundef @.str)
165+
// CHECK: [[ARRAYINIT_ELEMENT1:%.+]] = getelementptr inbounds %struct.Printy, ptr %arr, i64 1
167166
// CHECK: store ptr [[ARRAYINIT_ELEMENT1]], ptr %arrayinit.endOfInit, align 8
168167
Printy("b"),
169168
// CHECK: call void @_ZN6PrintyC1EPKc(ptr noundef nonnull align 8 dereferenceable(8) [[ARRAYINIT_ELEMENT1]], ptr noundef @.str.1)
170-
// CHECK: [[ARRAYINIT_ELEMENT2:%.+]] = getelementptr inbounds %struct.Printy, ptr [[ARRAYINIT_ELEMENT1]], i64 1
169+
// CHECK: [[ARRAYINIT_ELEMENT2:%.+]] = getelementptr inbounds %struct.Printy, ptr %arr, i64 2
171170
// CHECK: store ptr [[ARRAYINIT_ELEMENT2]], ptr %arrayinit.endOfInit, align 8
172171
({
173172
// CHECK: br i1 {{.*}}, label %if.then, label %if.end
@@ -180,7 +179,7 @@ void ArrayInit() {
180179
// CHECK: if.end:
181180
Printy("c");
182181
// CHECK-NEXT: call void @_ZN6PrintyC1EPKc
183-
// CHECK-NEXT: %arrayinit.element2 = getelementptr inbounds %struct.Printy, ptr %arrayinit.element1, i64 1
182+
// CHECK-NEXT: %arrayinit.element2 = getelementptr inbounds %struct.Printy, ptr %arr, i64 3
184183
// CHECK-NEXT: store ptr %arrayinit.element2, ptr %arrayinit.endOfInit, align 8
185184
}),
186185
({
@@ -212,14 +211,14 @@ void ArrayInit() {
212211

213212
// CHECK: cleanup:
214213
// CHECK-NEXT: %1 = load ptr, ptr %arrayinit.endOfInit, align 8
215-
// CHECK-NEXT: %arraydestroy.isempty = icmp eq ptr %arrayinit.begin, %1
214+
// CHECK-NEXT: %arraydestroy.isempty = icmp eq ptr %arr, %1
216215
// CHECK-NEXT: br i1 %arraydestroy.isempty, label %[[ARRAY_DESTROY_DONE2:.+]], label %[[ARRAY_DESTROY_BODY2:.+]]
217216

218217
// CHECK: [[ARRAY_DESTROY_BODY2]]:
219218
// CHECK-NEXT: %arraydestroy.elementPast = phi ptr [ %1, %cleanup ], [ %arraydestroy.element, %[[ARRAY_DESTROY_BODY2]] ]
220219
// CHECK-NEXT: %arraydestroy.element = getelementptr inbounds %struct.Printy, ptr %arraydestroy.elementPast, i64 -1
221220
// CHECK-NEXT: call void @_ZN6PrintyD1Ev(ptr noundef nonnull align 8 dereferenceable(8) %arraydestroy.element)
222-
// CHECK-NEXT: %arraydestroy.done = icmp eq ptr %arraydestroy.element, %arrayinit.begin
221+
// CHECK-NEXT: %arraydestroy.done = icmp eq ptr %arraydestroy.element, %arr
223222
// CHECK-NEXT: br i1 %arraydestroy.done, label %[[ARRAY_DESTROY_DONE2]], label %[[ARRAY_DESTROY_BODY2]]
224223

225224
// CHECK: [[ARRAY_DESTROY_DONE2]]:
@@ -238,8 +237,7 @@ void ArraySubobjects() {
238237
// CHECK: call void @_ZN6PrintyC1EPKc
239238
// CHECK: call void @_ZN6PrintyC1EPKc
240239
{Printy("a"),
241-
// CHECK: [[ARRAYINIT_BEGIN:%.+]] = getelementptr inbounds [2 x %struct.Printy]
242-
// CHECK: store ptr [[ARRAYINIT_BEGIN]], ptr %arrayinit.endOfInit, align 8
240+
// CHECK: store ptr %arr2, ptr %arrayinit.endOfInit, align 8
243241
// CHECK: call void @_ZN6PrintyC1EPKc
244242
// CHECK: [[ARRAYINIT_ELEMENT:%.+]] = getelementptr inbounds %struct.Printy
245243
// CHECK: store ptr [[ARRAYINIT_ELEMENT]], ptr %arrayinit.endOfInit, align 8
@@ -248,7 +246,7 @@ void ArraySubobjects() {
248246
return;
249247
// CHECK: if.then:
250248
// CHECK-NEXT: [[V0:%.+]] = load ptr, ptr %arrayinit.endOfInit, align 8
251-
// CHECK-NEXT: %arraydestroy.isempty = icmp eq ptr [[ARRAYINIT_BEGIN]], [[V0]]
249+
// CHECK-NEXT: %arraydestroy.isempty = icmp eq ptr %arr2, [[V0]]
252250
// CHECK-NEXT: br i1 %arraydestroy.isempty, label %[[ARRAY_DESTROY_DONE:.+]], label %[[ARRAY_DESTROY_BODY:.+]]
253251
}
254252
Printy("b");
@@ -268,7 +266,7 @@ void ArraySubobjects() {
268266
// CHECK-NEXT: %arraydestroy.elementPast = phi ptr [ %0, %if.then ], [ %arraydestroy.element, %[[ARRAY_DESTROY_BODY]] ]
269267
// CHECK-NEXT: %arraydestroy.element = getelementptr inbounds %struct.Printy, ptr %arraydestroy.elementPast, i64 -1
270268
// CHECK-NEXT: call void @_ZN6PrintyD1Ev(ptr noundef nonnull align 8 dereferenceable(8) %arraydestroy.element)
271-
// CHECK-NEXT: %arraydestroy.done = icmp eq ptr %arraydestroy.element, [[ARRAYINIT_BEGIN]]
269+
// CHECK-NEXT: %arraydestroy.done = icmp eq ptr %arraydestroy.element, %arr2
272270
// CHECK-NEXT: br i1 %arraydestroy.done, label %[[ARRAY_DESTROY_DONE]], label %[[ARRAY_DESTROY_BODY]]
273271

274272
// CHECK: [[ARRAY_DESTROY_DONE]]
@@ -277,11 +275,11 @@ void ArraySubobjects() {
277275
// CHECK-NEXT: br label %[[ARRAY_DESTROY_BODY2:.+]]
278276

279277
// CHECK: [[ARRAY_DESTROY_BODY2]]:
280-
// CHECK-NEXT: %arraydestroy.elementPast5 = phi ptr [ %1, %[[ARRAY_DESTROY_DONE]] ], [ %arraydestroy.element6, %[[ARRAY_DESTROY_BODY2]] ]
281-
// CHECK-NEXT: %arraydestroy.element6 = getelementptr inbounds %struct.Printy, ptr %arraydestroy.elementPast5, i64 -1
282-
// CHECK-NEXT: call void @_ZN6PrintyD1Ev(ptr noundef nonnull align 8 dereferenceable(8) %arraydestroy.element6)
283-
// CHECK-NEXT: %arraydestroy.done7 = icmp eq ptr %arraydestroy.element6, [[ARRAY_BEGIN]]
284-
// CHECK-NEXT: br i1 %arraydestroy.done7, label %[[ARRAY_DESTROY_DONE2:.+]], label %[[ARRAY_DESTROY_BODY2]]
278+
// CHECK-NEXT: %arraydestroy.elementPast4 = phi ptr [ %1, %[[ARRAY_DESTROY_DONE]] ], [ %arraydestroy.element5, %[[ARRAY_DESTROY_BODY2]] ]
279+
// CHECK-NEXT: %arraydestroy.element5 = getelementptr inbounds %struct.Printy, ptr %arraydestroy.elementPast4, i64 -1
280+
// CHECK-NEXT: call void @_ZN6PrintyD1Ev(ptr noundef nonnull align 8 dereferenceable(8) %arraydestroy.element5)
281+
// CHECK-NEXT: %arraydestroy.done6 = icmp eq ptr %arraydestroy.element5, [[ARRAY_BEGIN]]
282+
// CHECK-NEXT: br i1 %arraydestroy.done6, label %[[ARRAY_DESTROY_DONE2:.+]], label %[[ARRAY_DESTROY_BODY2]]
285283

286284

287285
// CHECK: [[ARRAY_DESTROY_DONE2]]:

clang/test/CodeGenCXX/cxx0x-initializer-references.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,10 @@ namespace reference {
5252
// CHECK-NEXT: store ptr %{{.*}}, ptr %{{.*}}, align
5353
const A &ra1{1, i};
5454

55-
// CHECK-NEXT: getelementptr inbounds [3 x i32], ptr %{{.*}}, i{{32|64}} 0, i{{32|64}} 0
5655
// CHECK-NEXT: store i32 1
5756
// CHECK-NEXT: getelementptr inbounds i32, ptr %{{.*}}, i{{32|64}} 1
5857
// CHECK-NEXT: store i32 2
59-
// CHECK-NEXT: getelementptr inbounds i32, ptr %{{.*}}, i{{32|64}} 1
58+
// CHECK-NEXT: getelementptr inbounds i32, ptr %{{.*}}, i{{32|64}} 2
6059
// CHECK-NEXT: %[[I2:.*]] = load i32, ptr
6160
// CHECK-NEXT: store i32 %[[I2]]
6261
// CHECK-NEXT: store ptr %{{.*}}, ptr %{{.*}}, align

clang/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist-startend.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ void fn1(int i) {
4040
// CHECK-LABEL: define{{.*}} void @_Z3fn1i
4141
// temporary array
4242
// CHECK: [[array:%[^ ]+]] = alloca [3 x i32]
43-
// CHECK: getelementptr inbounds [3 x i32], ptr [[array]], i{{32|64}} 0
44-
// CHECK-NEXT: store i32 1, ptr
43+
// CHECK: store i32 1, ptr
4544
// CHECK-NEXT: getelementptr
4645
// CHECK-NEXT: store
4746
// CHECK-NEXT: getelementptr

clang/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,7 @@ void fn1(int i) {
122122
// X86: [[array:%[^ ]+]] = alloca [3 x i32]
123123
// AMDGCN: [[alloca:%[^ ]+]] = alloca [3 x i32], align 4, addrspace(5)
124124
// AMDGCN: [[array:%[^ ]+]] ={{.*}} addrspacecast ptr addrspace(5) [[alloca]] to ptr
125-
// CHECK: getelementptr inbounds [3 x i32], ptr [[array]], i{{32|64}} 0
126-
// CHECK-NEXT: store i32 1, ptr
125+
// CHECK: store i32 1, ptr
127126
// CHECK-NEXT: getelementptr
128127
// CHECK-NEXT: store
129128
// CHECK-NEXT: getelementptr

0 commit comments

Comments
 (0)