@@ -10,24 +10,30 @@ typedef struct {
1010} T ;
1111
1212void buz (int x ) {
13- T arr [] = { {0 , x }, {0 , 0 } };
13+ T arr [] = { {x , x }, {0 , 0 } };
1414}
1515// CIR: cir.func dso_local @buz
1616// CIR-NEXT: [[X_ALLOCA:%.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
1717// CIR-NEXT: [[ARR:%.*]] = cir.alloca !cir.array<!rec_T x 2>, !cir.ptr<!cir.array<!rec_T x 2>>, ["arr", init] {alignment = 16 : i64}
1818// CIR-NEXT: cir.store{{.*}} %arg0, [[X_ALLOCA]] : !s32i, !cir.ptr<!s32i>
19- // CIR-NEXT: [[ARR_INIT:%.*]] = cir.const #cir.zero : !cir.array<!rec_T x 2>
20- // CIR-NEXT: cir.store{{.*}} [[ARR_INIT]], [[ARR]] : !cir.array<!rec_T x 2>, !cir.ptr<!cir.array<!rec_T x 2>>
21- // CIR-NEXT: [[FI_EL:%.*]] = cir.cast(array_to_ptrdecay, [[ARR]] : !cir.ptr<!cir.array<!rec_T x 2>>), !cir.ptr<!rec_T>
19+ // CIR-NEXT: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
20+ // CIR-NEXT: [[FI_EL:%.*]] = cir.get_element [[ARR]][[[ZERO]]] : (!cir.ptr<!cir.array<!rec_T x 2>>, !s32i) -> !cir.ptr<!rec_T>
2221// CIR-NEXT: [[A_STORAGE0:%.*]] = cir.get_member [[FI_EL]][0] {name = "a"} : !cir.ptr<!rec_T> -> !cir.ptr<!s32i>
22+ // CIR-NEXT: [[XA_VAL:%.*]] = cir.load{{.*}} [[X_ALLOCA]] : !cir.ptr<!s32i>, !s32i
23+ // CIR-NEXT: cir.store{{.*}} [[XA_VAL]], [[A_STORAGE0]] : !s32i, !cir.ptr<!s32i>
2324// CIR-NEXT: [[B_STORAGE0:%.*]] = cir.get_member [[FI_EL]][1] {name = "b"} : !cir.ptr<!rec_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>
25+ // CIR-NEXT: [[XB_VAL :%.*]] = cir.load{{.*}} [[X_ALLOCA]] : !cir.ptr<!s32i>, !s32i
26+ // CIR-NEXT: [[XB_CASTED :%.*]] = cir.cast(integral, [[XB_VAL ]] : !s32i), !s64i
27+ // CIR-NEXT: cir.store{{.*}} [[XB_CASTED ]], [[B_STORAGE0]] : !s64i, !cir.ptr<!s64i>
2728// CIR-NEXT: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
28- // CIR-NEXT: [[SE_EL:%.*]] = cir.ptr_stride([[FI_EL]] : !cir.ptr<!rec_T>, [[ONE]] : !s64i), !cir.ptr<!rec_T>
29+ // CIR-NEXT: [[SE_EL:%.*]] = cir.get_element [[ARR]][[[ONE]]] : ( !cir.ptr<!cir.array<! rec_T x 2>>, !s64i) -> !cir.ptr<!rec_T>
2930// CIR-NEXT: [[A_STORAGE1:%.*]] = cir.get_member [[SE_EL]][0] {name = "a"} : !cir.ptr<!rec_T> -> !cir.ptr<!s32i>
31+ // CIR-NEXT: [[A1_ZERO:%.*]] = cir.const #cir.int<0> : !s32i
32+ // CIR-NEXT: cir.store{{.*}} [[A1_ZERO]], [[A_STORAGE1]] : !s32i, !cir.ptr<!s32i>
3033// CIR-NEXT: [[B_STORAGE1:%.*]] = cir.get_member [[SE_EL]][1] {name = "b"} : !cir.ptr<!rec_T> -> !cir.ptr<!s64i>
34+ // CIR-NEXT: [[B1_ZERO:%.*]] = cir.const #cir.int<0> : !s32i
35+ // CIR-NEXT: [[B1_CASTED:%.*]] = cir.cast(integral, [[B1_ZERO]] : !s32i), !s64i
36+ // CIR-NEXT: cir.store{{.*}} [[B1_CASTED]], [[B_STORAGE1]] : !s64i, !cir.ptr<!s64i>
3137// CIR-NEXT: cir.return
3238
3339void foo () {
@@ -46,34 +52,36 @@ void bar(int a, int b, int c) {
4652// CIR-NEXT: cir.store{{.*}} %arg0, [[A:%.*]] : !s32i, !cir.ptr<!s32i>
4753// CIR-NEXT: cir.store{{.*}} %arg1, [[B:%.*]] : !s32i, !cir.ptr<!s32i>
4854// 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>
55+ // CIR-NEXT: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
56+ // CIR-NEXT: [[ELEM0:%.*]] = cir.get_element [[ARR]][[[ZERO]]] : (!cir.ptr<!cir.array<!s32i x 3>>, !s32i) -> !cir.ptr<!s32i>
5057// CIR-NEXT: [[LOAD_A:%.*]] = cir.load{{.*}} [[A]] : !cir.ptr<!s32i>, !s32i
51- // CIR-NEXT: cir.store{{.*}} [[LOAD_A]], [[FI_EL ]] : !s32i, !cir.ptr<!s32i>
58+ // CIR-NEXT: cir.store{{.*}} [[LOAD_A]], [[ELEM0 ]] : !s32i, !cir.ptr<!s32i>
5259// 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>
60+ // CIR-NEXT: [[ELEM1 :%.*]] = cir.get_element [[ARR]][[[ONE]]] : ( !cir.ptr<!cir.array<! s32i x 3>>, !s64i) -> !cir.ptr<!s32i>
5461// CIR-NEXT: [[LOAD_B:%.*]] = cir.load{{.*}} [[B]] : !cir.ptr<!s32i>, !s32i
55- // CIR-NEXT: cir.store{{.*}} [[LOAD_B]], [[SE_EL ]] : !s32i, !cir.ptr<!s32i>
62+ // CIR-NEXT: cir.store{{.*}} [[LOAD_B]], [[ELEM1 ]] : !s32i, !cir.ptr<!s32i>
5663// 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>
64+ // CIR-NEXT: [[ELEM2 :%.*]] = cir.get_element [[ARR]][[[TWO]]] : ( !cir.ptr<!cir.array<! s32i x 3>>, !s64i) -> !cir.ptr<!s32i>
5865// CIR-NEXT: [[LOAD_C:%.*]] = cir.load{{.*}} [[C]] : !cir.ptr<!s32i>, !s32i
59- // CIR-NEXT: cir.store{{.*}} [[LOAD_C]], [[TH_EL ]] : !s32i, !cir.ptr<!s32i>
66+ // CIR-NEXT: cir.store{{.*}} [[LOAD_C]], [[ELEM2 ]] : !s32i, !cir.ptr<!s32i>
6067
6168void zero_init (int x ) {
6269 int arr [3 ] = {x };
6370}
6471// CIR: cir.func dso_local @zero_init
6572// 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}
73+ // CIR: [[ARR:%.*]] = cir.alloca !cir.array<!s32i x 3>, !cir.ptr<!cir.array<!s32i x 3>>, ["arr", init] {alignment = 4 : i64}
6774// CIR: [[TEMP:%.*]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["arrayinit.temp", init] {alignment = 8 : i64}
6875// 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>
76+ // CIR: [[ZERO:%.*]] = cir.const #cir.int<0> : !s32i
77+ // CIR: [[BEGIN:%.*]] = cir.get_element [[ARR]][[[ZERO]]] : (!cir.ptr<!cir.array<!s32i x 3>>, !s32i) -> !cir.ptr<!s32i>
7078// CIR: [[VAR:%.*]] = cir.load{{.*}} [[VAR_ALLOC]] : !cir.ptr<!s32i>, !s32i
7179// CIR: cir.store{{.*}} [[VAR]], [[BEGIN]] : !s32i, !cir.ptr<!s32i>
7280// 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>
81+ // CIR: [[ZERO_INIT_START:%.*]] = cir.get_element [[ARR]][[[ONE]]] : ( !cir.ptr<!cir.array<! s32i x 3>>, !s64i) -> !cir.ptr<!s32i>
7482// CIR: cir.store{{.*}} [[ZERO_INIT_START]], [[TEMP]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
7583// CIR: [[SIZE:%.*]] = cir.const #cir.int<3> : !s64i
76- // CIR: [[END:%.*]] = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[SIZE]] : !s64i), !cir.ptr<!s32i>
84+ // CIR: [[END:%.*]] = cir.get_element [[ARR]][[[SIZE]]] : ( !cir.ptr<!cir.array<! s32i x 3>>, !s64i) -> !cir.ptr<!s32i>
7785// CIR: cir.do {
7886// CIR: [[CUR:%.*]] = cir.load{{.*}} [[TEMP]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
7987// CIR: [[FILLER:%.*]] = cir.const #cir.int<0> : !s32i
@@ -99,26 +107,28 @@ void aggr_init() {
99107// CIR: [[TEMP:%.*]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["arrayinit.temp", init] {alignment = 8 : i64}
100108// CIR: %3 = cir.const #cir.int<5> : !s32i
101109// 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>
110+ // CIR: [[OFFSET0:%.*]] = cir.const #cir.int<0> : !s32i
111+ // CIR: [[BEGIN:%.*]] = cir.get_element %1[[[OFFSET0]]] : (!cir.ptr<!cir.array<!s32i x 5>>, !s32i) -> !cir.ptr<!s32i>
112+ // CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s32i
113+ // CIR: cir.store{{.*}} [[ONE]], [[BEGIN]] : !s32i, !cir.ptr<!s32i>
114+ // CIR: [[OFFSET1:%.*]] = cir.const #cir.int<1> : !s64i
115+ // CIR: [[ELEM1:%.*]] = cir.get_element %1[[[OFFSET1]]] : (!cir.ptr<!cir.array<!s32i x 5>>, !s64i) -> !cir.ptr<!s32i>
116+ // CIR: [[TWO:%.*]] = cir.const #cir.int<2> : !s32i
117+ // CIR: cir.store{{.*}} [[TWO]], [[ELEM1]] : !s32i, !cir.ptr<!s32i>
118+ // CIR: [[OFFSET2:%.*]] = cir.const #cir.int<2> : !s64i
119+ // CIR: [[ELEM2:%.*]] = cir.get_element %1[[[OFFSET2]]] : (!cir.ptr<!cir.array<!s32i x 5>>, !s64i) -> !cir.ptr<!s32i>
120+ // CIR: [[THREE:%.*]] = cir.const #cir.int<3> : !s32i
121+ // CIR: cir.store{{.*}} [[THREE]], [[ELEM2]] : !s32i, !cir.ptr<!s32i>
122+ // CIR: [[OFFSET3:%.*]] = cir.const #cir.int<3> : !s64i
123+ // CIR: [[ELEM3:%.*]] = cir.get_element %1[[[OFFSET3]]] : (!cir.ptr<!cir.array<!s32i x 5>>, !s64i) -> !cir.ptr<!s32i>
115124// CIR: [[VAR:%.*]] = cir.load{{.*}} [[VAR_ALLOC]] : !cir.ptr<!s32i>, !s32i
116- // CIR: cir.store{{.*}} [[VAR]], %13 : !s32i, !cir.ptr<!s32i>
125+ // CIR: cir.store{{.*}} [[VAR]], [[ELEM3]] : !s32i, !cir.ptr<!s32i>
117126// 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>>
127+ // CIR: [[OFFSET4:%.*]] = cir.binop(add, [[OFFSET3]], [[ONE_VAR]]) : !s64i
128+ // CIR: [[LAST:%.*]] = cir.get_element %1[[[OFFSET4]]] : (!cir.ptr<!cir.array<!s32i x 5>>, !s64i) -> !cir.ptr<!s32i>
129+ // CIR: cir.store{{.*}} [[LAST]], [[TEMP]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
120130// CIR: [[SIZE:%.*]] = cir.const #cir.int<5> : !s64i
121- // CIR: [[END:%.*]] = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[SIZE]] : !s64i), !cir.ptr<!s32i>
131+ // CIR: [[END:%.*]] = cir.get_element %1[[[SIZE]]] : ( !cir.ptr<!cir.array<! s32i x 5>>, !s64i) -> !cir.ptr<!s32i>
122132// CIR: cir.do {
123133// CIR: [[CUR:%.*]] = cir.load{{.*}} [[TEMP]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
124134// CIR: [[FILLER:%.*]] = cir.const #cir.int<0> : !s32i
@@ -139,18 +149,18 @@ void aggr_init() {
139149// LLVM: %2 = alloca [5 x i32], i64 1, align 16
140150// LLVM: [[TEMP:%.*]] = alloca ptr, i64 1, align 8
141151// LLVM: store i32 5, ptr [[VAR_ALLOC]], align 4
142- // LLVM: [[BEGIN:%.*]] = getelementptr i32, ptr %2, i32 0
152+ // LLVM: [[BEGIN:%.*]] = getelementptr [5 x i32] , ptr %2, i32 0, i64 0
143153// LLVM: store i32 1, ptr [[BEGIN]], align 4
144- // LLVM: [[ONE:%.*]] = getelementptr i32, ptr [[BEGIN]] , i64 1
154+ // LLVM: [[ONE:%.*]] = getelementptr [5 x i32] , ptr %2, i32 0 , i64 1
145155// LLVM: store i32 2, ptr [[ONE]], align 4
146- // LLVM: [[TWO:%.*]] = getelementptr i32, ptr [[BEGIN]] , i64 2
156+ // LLVM: [[TWO:%.*]] = getelementptr [5 x i32] , ptr %2, i32 0 , i64 2
147157// LLVM: store i32 3, ptr [[TWO]], align 4
148- // LLVM: [[THREE:%.*]] = getelementptr i32, ptr [[BEGIN]] , i64 3
158+ // LLVM: [[THREE:%.*]] = getelementptr [5 x i32] , ptr %2, i32 0 , i64 3
149159// LLVM: [[VAR:%.*]] = load i32, ptr [[VAR_ALLOC]], align 4
150160// 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
161+ // LLVM: [[LAST:%.*]] = getelementptr [5 x i32] , ptr %2, i32 0, i64 4
162+ // LLVM: store ptr [[LAST]] , ptr [[TEMP]], align 8
163+ // LLVM: [[END:%.*]] = getelementptr [5 x i32] , ptr %2, i32 0 , i64 5
154164// LLVM: br label %14
155165//
156166// LLVM: 11: ; preds = %14
0 commit comments