Skip to content

Commit 596c50f

Browse files
Rajveer100lanza
authored andcommitted
[CIR][CIRGen] Simplify LLVM IR array initialization for clang CIR (#1280)
Resolves #1266 After change: ```llvm %1 = alloca ptr, i64 1, align 8 store i32 1, ptr @g_arr, align 4 store i32 2, ptr getelementptr (i32, ptr @g_arr, i64 1), align 4 store i32 3, ptr getelementptr (i32, ptr @g_arr, i64 2), align 4 %2 = load i32, ptr @g, align 4 store i32 %2, ptr getelementptr (i32, ptr @g_arr, i64 3), align 4 store ptr getelementptr (i32, ptr getelementptr (i32, ptr @g_arr, i64 3), i64 1), ptr %1, align 8 ```
1 parent 200dbd8 commit 596c50f

File tree

2 files changed

+151
-68
lines changed

2 files changed

+151
-68
lines changed

clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -465,14 +465,14 @@ void AggExprEmitter::emitArrayInit(Address DestPtr, cir::ArrayType AType,
465465

466466
// Emit the explicit initializers.
467467
for (uint64_t i = 0; i != NumInitElements; ++i) {
468-
if (i == 1)
468+
if (i > 0)
469469
one = CGF.getBuilder().getConstInt(
470-
loc, mlir::cast<cir::IntType>(CGF.PtrDiffTy), 1);
470+
loc, mlir::cast<cir::IntType>(CGF.PtrDiffTy), i);
471471

472472
// Advance to the next element.
473473
if (i > 0) {
474474
element = CGF.getBuilder().create<cir::PtrStrideOp>(
475-
loc, cirElementPtrType, element, one);
475+
loc, cirElementPtrType, begin, one);
476476

477477
// Tell the cleanup that it needs to destroy up to this
478478
// element. TODO: some of these stores can be trivially

clang/test/CIR/CodeGen/array-init.c

+148-65
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-cir %s -o - | FileCheck %s
1+
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir
2+
// RUN: FileCheck --check-prefix=CIR --input-file=%t.cir %s
3+
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm -fno-clangir-call-conv-lowering %s -o %t.ll
4+
// RUN: FileCheck --check-prefix=LLVM --input-file=%t.ll %s
25

3-
// CHECK-DAG: cir.global "private" constant cir_private @__const.foo.bar = #cir.const_array<[#cir.fp<9.000000e+00> : !cir.double, #cir.fp<8.000000e+00> : !cir.double, #cir.fp<7.000000e+00> : !cir.double]> : !cir.array<!cir.double x 3>
6+
// CIR-DAG: cir.global "private" constant cir_private @__const.foo.bar = #cir.const_array<[#cir.fp<9.000000e+00> : !cir.double, #cir.fp<8.000000e+00> : !cir.double, #cir.fp<7.000000e+00> : !cir.double]> : !cir.array<!cir.double x 3>
47
typedef struct {
58
int a;
69
long b;
@@ -9,78 +12,158 @@ typedef struct {
912
void buz(int x) {
1013
T arr[] = { {0, x}, {0, 0} };
1114
}
12-
// CHECK: cir.func @buz
13-
// CHECK-NEXT: [[X_ALLOCA:%.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
14-
// CHECK-NEXT: [[ARR:%.*]] = cir.alloca !cir.array<!ty_T x 2>, !cir.ptr<!cir.array<!ty_T x 2>>, ["arr", init] {alignment = 16 : i64}
15-
// CHECK-NEXT: cir.store %arg0, [[X_ALLOCA]] : !s32i, !cir.ptr<!s32i>
16-
// CHECK-NEXT: [[ARR_INIT:%.*]] = cir.const #cir.zero : !cir.array<!ty_T x 2>
17-
// CHECK-NEXT: cir.store [[ARR_INIT]], [[ARR]] : !cir.array<!ty_T x 2>, !cir.ptr<!cir.array<!ty_T x 2>>
18-
// CHECK-NEXT: [[FI_EL:%.*]] = cir.cast(array_to_ptrdecay, [[ARR]] : !cir.ptr<!cir.array<!ty_T x 2>>), !cir.ptr<!ty_T>
19-
// CHECK-NEXT: [[A_STORAGE0:%.*]] = cir.get_member [[FI_EL]][0] {name = "a"} : !cir.ptr<!ty_T> -> !cir.ptr<!s32i>
20-
// CHECK-NEXT: [[B_STORAGE0:%.*]] = cir.get_member [[FI_EL]][1] {name = "b"} : !cir.ptr<!ty_T> -> !cir.ptr<!s64i>
21-
// CHECK-NEXT: [[X_VAL:%.*]] = cir.load [[X_ALLOCA]] : !cir.ptr<!s32i>, !s32i
22-
// CHECK-NEXT: [[X_CASTED:%.*]] = cir.cast(integral, [[X_VAL]] : !s32i), !s64i
23-
// CHECK-NEXT: cir.store [[X_CASTED]], [[B_STORAGE0]] : !s64i, !cir.ptr<!s64i>
24-
// CHECK-NEXT: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
25-
// CHECK-NEXT: [[SE_EL:%.*]] = cir.ptr_stride([[FI_EL]] : !cir.ptr<!ty_T>, [[ONE]] : !s64i), !cir.ptr<!ty_T>
26-
// CHECK-NEXT: [[A_STORAGE1:%.*]] = cir.get_member [[SE_EL]][0] {name = "a"} : !cir.ptr<!ty_T> -> !cir.ptr<!s32i>
27-
// CHECK-NEXT: [[B_STORAGE1:%.*]] = cir.get_member [[SE_EL]][1] {name = "b"} : !cir.ptr<!ty_T> -> !cir.ptr<!s64i>
28-
// CHECK-NEXT: cir.return
15+
// CIR: cir.func @buz
16+
// CIR-NEXT: [[X_ALLOCA:%.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
17+
// CIR-NEXT: [[ARR:%.*]] = cir.alloca !cir.array<!ty_T x 2>, !cir.ptr<!cir.array<!ty_T x 2>>, ["arr", init] {alignment = 16 : i64}
18+
// CIR-NEXT: cir.store %arg0, [[X_ALLOCA]] : !s32i, !cir.ptr<!s32i>
19+
// CIR-NEXT: [[ARR_INIT:%.*]] = cir.const #cir.zero : !cir.array<!ty_T x 2>
20+
// CIR-NEXT: cir.store [[ARR_INIT]], [[ARR]] : !cir.array<!ty_T x 2>, !cir.ptr<!cir.array<!ty_T x 2>>
21+
// CIR-NEXT: [[FI_EL:%.*]] = cir.cast(array_to_ptrdecay, [[ARR]] : !cir.ptr<!cir.array<!ty_T x 2>>), !cir.ptr<!ty_T>
22+
// CIR-NEXT: [[A_STORAGE0:%.*]] = cir.get_member [[FI_EL]][0] {name = "a"} : !cir.ptr<!ty_T> -> !cir.ptr<!s32i>
23+
// CIR-NEXT: [[B_STORAGE0:%.*]] = cir.get_member [[FI_EL]][1] {name = "b"} : !cir.ptr<!ty_T> -> !cir.ptr<!s64i>
24+
// CIR-NEXT: [[X_VAL:%.*]] = cir.load [[X_ALLOCA]] : !cir.ptr<!s32i>, !s32i
25+
// CIR-NEXT: [[X_CASTED:%.*]] = cir.cast(integral, [[X_VAL]] : !s32i), !s64i
26+
// CIR-NEXT: cir.store [[X_CASTED]], [[B_STORAGE0]] : !s64i, !cir.ptr<!s64i>
27+
// CIR-NEXT: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
28+
// CIR-NEXT: [[SE_EL:%.*]] = cir.ptr_stride([[FI_EL]] : !cir.ptr<!ty_T>, [[ONE]] : !s64i), !cir.ptr<!ty_T>
29+
// CIR-NEXT: [[A_STORAGE1:%.*]] = cir.get_member [[SE_EL]][0] {name = "a"} : !cir.ptr<!ty_T> -> !cir.ptr<!s32i>
30+
// CIR-NEXT: [[B_STORAGE1:%.*]] = cir.get_member [[SE_EL]][1] {name = "b"} : !cir.ptr<!ty_T> -> !cir.ptr<!s64i>
31+
// CIR-NEXT: cir.return
2932

3033
void foo() {
3134
double bar[] = {9,8,7};
3235
}
33-
// CHECK-LABEL: @foo
34-
// CHECK: %[[DST:.*]] = cir.alloca !cir.array<!cir.double x 3>, !cir.ptr<!cir.array<!cir.double x 3>>, ["bar"]
35-
// CHECK: %[[SRC:.*]] = cir.get_global @__const.foo.bar : !cir.ptr<!cir.array<!cir.double x 3>>
36-
// CHECK: cir.copy %[[SRC]] to %[[DST]] : !cir.ptr<!cir.array<!cir.double x 3>>
36+
// CIR-LABEL: @foo
37+
// CIR: %[[DST:.*]] = cir.alloca !cir.array<!cir.double x 3>, !cir.ptr<!cir.array<!cir.double x 3>>, ["bar"]
38+
// CIR: %[[SRC:.*]] = cir.get_global @__const.foo.bar : !cir.ptr<!cir.array<!cir.double x 3>>
39+
// CIR: cir.copy %[[SRC]] to %[[DST]] : !cir.ptr<!cir.array<!cir.double x 3>>
3740

3841
void bar(int a, int b, int c) {
3942
int arr[] = {a,b,c};
4043
}
41-
// CHECK: cir.func @bar
42-
// CHECK: [[ARR:%.*]] = cir.alloca !cir.array<!s32i x 3>, !cir.ptr<!cir.array<!s32i x 3>>, ["arr", init] {alignment = 4 : i64}
43-
// CHECK-NEXT: cir.store %arg0, [[A:%.*]] : !s32i, !cir.ptr<!s32i>
44-
// CHECK-NEXT: cir.store %arg1, [[B:%.*]] : !s32i, !cir.ptr<!s32i>
45-
// CHECK-NEXT: cir.store %arg2, [[C:%.*]] : !s32i, !cir.ptr<!s32i>
46-
// CHECK-NEXT: [[FI_EL:%.*]] = cir.cast(array_to_ptrdecay, [[ARR]] : !cir.ptr<!cir.array<!s32i x 3>>), !cir.ptr<!s32i>
47-
// CHECK-NEXT: [[LOAD_A:%.*]] = cir.load [[A]] : !cir.ptr<!s32i>, !s32i
48-
// CHECK-NEXT: cir.store [[LOAD_A]], [[FI_EL]] : !s32i, !cir.ptr<!s32i>
49-
// CHECK-NEXT: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
50-
// CHECK-NEXT: [[SE_EL:%.*]] = cir.ptr_stride(%4 : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
51-
// CHECK-NEXT: [[LOAD_B:%.*]] = cir.load [[B]] : !cir.ptr<!s32i>, !s32i
52-
// CHECK-NEXT: cir.store [[LOAD_B]], [[SE_EL]] : !s32i, !cir.ptr<!s32i>
53-
// CHECK-NEXT: [[TH_EL:%.*]] = cir.ptr_stride(%7 : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
54-
// CHECK-NEXT: [[LOAD_C:%.*]] = cir.load [[C]] : !cir.ptr<!s32i>, !s32i
55-
// CHECK-NEXT: cir.store [[LOAD_C]], [[TH_EL]] : !s32i, !cir.ptr<!s32i>
44+
// CIR: cir.func @bar
45+
// CIR: [[ARR:%.*]] = cir.alloca !cir.array<!s32i x 3>, !cir.ptr<!cir.array<!s32i x 3>>, ["arr", init] {alignment = 4 : i64}
46+
// CIR-NEXT: cir.store %arg0, [[A:%.*]] : !s32i, !cir.ptr<!s32i>
47+
// CIR-NEXT: cir.store %arg1, [[B:%.*]] : !s32i, !cir.ptr<!s32i>
48+
// CIR-NEXT: cir.store %arg2, [[C:%.*]] : !s32i, !cir.ptr<!s32i>
49+
// CIR-NEXT: [[FI_EL:%.*]] = cir.cast(array_to_ptrdecay, [[ARR]] : !cir.ptr<!cir.array<!s32i x 3>>), !cir.ptr<!s32i>
50+
// CIR-NEXT: [[LOAD_A:%.*]] = cir.load [[A]] : !cir.ptr<!s32i>, !s32i
51+
// CIR-NEXT: cir.store [[LOAD_A]], [[FI_EL]] : !s32i, !cir.ptr<!s32i>
52+
// CIR-NEXT: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
53+
// CIR-NEXT: [[SE_EL:%.*]] = cir.ptr_stride(%4 : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
54+
// CIR-NEXT: [[LOAD_B:%.*]] = cir.load [[B]] : !cir.ptr<!s32i>, !s32i
55+
// CIR-NEXT: cir.store [[LOAD_B]], [[SE_EL]] : !s32i, !cir.ptr<!s32i>
56+
// CIR-NEXT: [[TWO:%.*]] = cir.const #cir.int<2> : !s64i
57+
// CIR-NEXT: [[TH_EL:%.*]] = cir.ptr_stride(%4 : !cir.ptr<!s32i>, [[TWO]] : !s64i), !cir.ptr<!s32i>
58+
// CIR-NEXT: [[LOAD_C:%.*]] = cir.load [[C]] : !cir.ptr<!s32i>, !s32i
59+
// CIR-NEXT: cir.store [[LOAD_C]], [[TH_EL]] : !s32i, !cir.ptr<!s32i>
5660

5761
void zero_init(int x) {
5862
int arr[3] = {x};
5963
}
60-
// CHECK: cir.func @zero_init
61-
// CHECK: [[VAR_ALLOC:%.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
62-
// CHECK: %1 = cir.alloca !cir.array<!s32i x 3>, !cir.ptr<!cir.array<!s32i x 3>>, ["arr", init] {alignment = 4 : i64}
63-
// CHECK: [[TEMP:%.*]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["arrayinit.temp", init] {alignment = 8 : i64}
64-
// CHECK: cir.store %arg0, [[VAR_ALLOC]] : !s32i, !cir.ptr<!s32i>
65-
// CHECK: [[BEGIN:%.*]] = cir.cast(array_to_ptrdecay, %1 : !cir.ptr<!cir.array<!s32i x 3>>), !cir.ptr<!s32i>
66-
// CHECK: [[VAR:%.*]] = cir.load [[VAR_ALLOC]] : !cir.ptr<!s32i>, !s32i
67-
// CHECK: cir.store [[VAR]], [[BEGIN]] : !s32i, !cir.ptr<!s32i>
68-
// CHECK: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
69-
// CHECK: [[ZERO_INIT_START:%.*]] = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
70-
// CHECK: cir.store [[ZERO_INIT_START]], [[TEMP]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
71-
// CHECK: [[SIZE:%.*]] = cir.const #cir.int<3> : !s64i
72-
// CHECK: [[END:%.*]] = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[SIZE]] : !s64i), !cir.ptr<!s32i>
73-
// CHECK: cir.do {
74-
// CHECK: [[CUR:%.*]] = cir.load [[TEMP]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
75-
// CHECK: [[FILLER:%.*]] = cir.const #cir.int<0> : !s32i
76-
// CHECK: cir.store [[FILLER]], [[CUR]] : !s32i, !cir.ptr<!s32i>
77-
// CHECK: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
78-
// CHECK: [[NEXT:%.*]] = cir.ptr_stride([[CUR]] : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
79-
// CHECK: cir.store [[NEXT]], [[TEMP]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
80-
// CHECK: cir.yield
81-
// CHECK: } while {
82-
// CHECK: [[CUR:%.*]] = cir.load [[TEMP]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
83-
// CHECK: [[CMP:%.*]] = cir.cmp(ne, [[CUR]], [[END]]) : !cir.ptr<!s32i>, !cir.bool
84-
// CHECK: cir.condition([[CMP]])
85-
// CHECK: }
86-
// CHECK: cir.return
64+
// CIR: cir.func @zero_init
65+
// CIR: [[VAR_ALLOC:%.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
66+
// CIR: %1 = cir.alloca !cir.array<!s32i x 3>, !cir.ptr<!cir.array<!s32i x 3>>, ["arr", init] {alignment = 4 : i64}
67+
// CIR: [[TEMP:%.*]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["arrayinit.temp", init] {alignment = 8 : i64}
68+
// CIR: cir.store %arg0, [[VAR_ALLOC]] : !s32i, !cir.ptr<!s32i>
69+
// CIR: [[BEGIN:%.*]] = cir.cast(array_to_ptrdecay, %1 : !cir.ptr<!cir.array<!s32i x 3>>), !cir.ptr<!s32i>
70+
// CIR: [[VAR:%.*]] = cir.load [[VAR_ALLOC]] : !cir.ptr<!s32i>, !s32i
71+
// CIR: cir.store [[VAR]], [[BEGIN]] : !s32i, !cir.ptr<!s32i>
72+
// CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
73+
// CIR: [[ZERO_INIT_START:%.*]] = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
74+
// CIR: cir.store [[ZERO_INIT_START]], [[TEMP]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
75+
// CIR: [[SIZE:%.*]] = cir.const #cir.int<3> : !s64i
76+
// CIR: [[END:%.*]] = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[SIZE]] : !s64i), !cir.ptr<!s32i>
77+
// CIR: cir.do {
78+
// CIR: [[CUR:%.*]] = cir.load [[TEMP]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
79+
// CIR: [[FILLER:%.*]] = cir.const #cir.int<0> : !s32i
80+
// CIR: cir.store [[FILLER]], [[CUR]] : !s32i, !cir.ptr<!s32i>
81+
// CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
82+
// CIR: [[NEXT:%.*]] = cir.ptr_stride([[CUR]] : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
83+
// CIR: cir.store [[NEXT]], [[TEMP]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
84+
// CIR: cir.yield
85+
// CIR: } while {
86+
// CIR: [[CUR:%.*]] = cir.load [[TEMP]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
87+
// CIR: [[CMP:%.*]] = cir.cmp(ne, [[CUR]], [[END]]) : !cir.ptr<!s32i>, !cir.bool
88+
// CIR: cir.condition([[CMP]])
89+
// CIR: }
90+
// CIR: cir.return
91+
92+
void aggr_init() {
93+
int g = 5;
94+
int g_arr[5] = {1, 2, 3, g};
95+
}
96+
// CIR-LABEL: cir.func no_proto @aggr_init
97+
// CIR: [[VAR_ALLOC:%.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["g", init] {alignment = 4 : i64}
98+
// CIR: %1 = cir.alloca !cir.array<!s32i x 5>, !cir.ptr<!cir.array<!s32i x 5>>, ["g_arr", init] {alignment = 16 : i64}
99+
// CIR: [[TEMP:%.*]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["arrayinit.temp", init] {alignment = 8 : i64}
100+
// CIR: %3 = cir.const #cir.int<5> : !s32i
101+
// CIR: cir.store %3, [[VAR_ALLOC]] : !s32i, !cir.ptr<!s32i>
102+
// CIR: [[BEGIN:%.*]] = cir.cast(array_to_ptrdecay, %1 : !cir.ptr<!cir.array<!s32i x 5>>), !cir.ptr<!s32i>
103+
// CIR: %5 = cir.const #cir.int<1> : !s32i
104+
// CIR: cir.store %5, [[BEGIN]] : !s32i, !cir.ptr<!s32i>
105+
// CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
106+
// CIR: %7 = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
107+
// CIR: %8 = cir.const #cir.int<2> : !s32i
108+
// CIR: cir.store %8, %7 : !s32i, !cir.ptr<!s32i>
109+
// CIR: [[TWO:%.*]] = cir.const #cir.int<2> : !s64i
110+
// CIR: %10 = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[TWO]] : !s64i), !cir.ptr<!s32i>
111+
// CIR: %11 = cir.const #cir.int<3> : !s32i
112+
// CIR: cir.store %11, %10 : !s32i, !cir.ptr<!s32i>
113+
// CIR: [[THREE:%.*]] = cir.const #cir.int<3> : !s64i
114+
// CIR: %13 = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[THREE]] : !s64i), !cir.ptr<!s32i>
115+
// CIR: [[VAR:%.*]] = cir.load [[VAR_ALLOC]] : !cir.ptr<!s32i>, !s32i
116+
// CIR: cir.store [[VAR]], %13 : !s32i, !cir.ptr<!s32i>
117+
// CIR: [[ONE_VAR:%.*]] = cir.const #cir.int<1> : !s64i
118+
// CIR: %16 = cir.ptr_stride(%13 : !cir.ptr<!s32i>, [[ONE_VAR]] : !s64i), !cir.ptr<!s32i>
119+
// CIR: cir.store %16, [[TEMP]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
120+
// CIR: [[SIZE:%.*]] = cir.const #cir.int<5> : !s64i
121+
// CIR: [[END:%.*]] = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[SIZE]] : !s64i), !cir.ptr<!s32i>
122+
// CIR: cir.do {
123+
// CIR: [[CUR:%.*]] = cir.load [[TEMP]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
124+
// CIR: [[FILLER:%.*]] = cir.const #cir.int<0> : !s32i
125+
// CIR: cir.store [[FILLER]], [[CUR]] : !s32i, !cir.ptr<!s32i>
126+
// CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
127+
// CIR: [[NEXT:%.*]] = cir.ptr_stride([[CUR]] : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
128+
// CIR: cir.store [[NEXT]], [[TEMP]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
129+
// CIR: cir.yield
130+
// CIR: } while {
131+
// CIR: [[CUR:%.*]] = cir.load [[TEMP]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
132+
// CIR: [[CMP:%.*]] = cir.cmp(ne, [[CUR]], [[END]]) : !cir.ptr<!s32i>, !cir.bool
133+
// CIR: cir.condition([[CMP]])
134+
// CIR: }
135+
// CIR: cir.return
136+
//
137+
// LLVM-LABEL: @aggr_init
138+
// LLVM: [[VAR_ALLOC:%.*]] = alloca i32, i64 1, align 4
139+
// LLVM: %2 = alloca [5 x i32], i64 1, align 16
140+
// LLVM: [[TEMP:%.*]] = alloca ptr, i64 1, align 8
141+
// LLVM: store i32 5, ptr [[VAR_ALLOC]], align 4
142+
// LLVM: [[BEGIN:%.*]] = getelementptr i32, ptr %2, i32 0
143+
// LLVM: store i32 1, ptr [[BEGIN]], align 4
144+
// LLVM: [[ONE:%.*]] = getelementptr i32, ptr [[BEGIN]], i64 1
145+
// LLVM: store i32 2, ptr [[ONE]], align 4
146+
// LLVM: [[TWO:%.*]] = getelementptr i32, ptr [[BEGIN]], i64 2
147+
// LLVM: store i32 3, ptr [[TWO]], align 4
148+
// LLVM: [[THREE:%.*]] = getelementptr i32, ptr [[BEGIN]], i64 3
149+
// LLVM: [[VAR:%.*]] = load i32, ptr [[VAR_ALLOC]], align 4
150+
// LLVM: store i32 [[VAR]], ptr [[THREE]], align 4
151+
// LLVM: %9 = getelementptr i32, ptr [[THREE]], i64 1
152+
// LLVM: store ptr %9, ptr [[TEMP]], align 8
153+
// LLVM: [[END:%.*]] = getelementptr i32, ptr [[BEGIN]], i64 5
154+
// LLVM: br label %14
155+
//
156+
// LLVM: 11: ; preds = %14
157+
// LLVM: [[CUR:%.*]] = load ptr, ptr [[TEMP]], align 8
158+
// LLVM: [[CMP:%.*]] = icmp ne ptr [[CUR]], [[END]]
159+
// LLVM: br i1 [[CMP]], label %14, label %17
160+
//
161+
// LLVM: 14: ; preds = %11, %0
162+
// LLVM: [[CUR:%.*]] = load ptr, ptr [[TEMP]], align 8
163+
// LLVM: store i32 0, ptr [[CUR]], align 4
164+
// LLVM: [[NEXT:%.*]] = getelementptr i32, ptr [[CUR]], i64 1
165+
// LLVM: store ptr [[NEXT]], ptr [[TEMP]], align 8
166+
// LLVM: br label %11
167+
//
168+
// LLVM: 17: ; preds = %11
169+
// LLVM: ret void

0 commit comments

Comments
 (0)