@@ -10,24 +10,30 @@ typedef struct {
10
10
} T ;
11
11
12
12
void buz (int x ) {
13
- T arr [] = { {0 , x }, {0 , 0 } };
13
+ T arr [] = { {x , x }, {0 , 0 } };
14
14
}
15
15
// CIR: cir.func dso_local @buz
16
16
// CIR-NEXT: [[X_ALLOCA:%.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
17
17
// CIR-NEXT: [[ARR:%.*]] = cir.alloca !cir.array<!rec_T x 2>, !cir.ptr<!cir.array<!rec_T x 2>>, ["arr", init] {alignment = 16 : i64}
18
18
// 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>
22
21
// 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>
23
24
// 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>
27
28
// 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>
29
30
// 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>
30
33
// 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>
31
37
// CIR-NEXT: cir.return
32
38
33
39
void foo () {
@@ -46,34 +52,36 @@ void bar(int a, int b, int c) {
46
52
// CIR-NEXT: cir.store{{.*}} %arg0, [[A:%.*]] : !s32i, !cir.ptr<!s32i>
47
53
// CIR-NEXT: cir.store{{.*}} %arg1, [[B:%.*]] : !s32i, !cir.ptr<!s32i>
48
54
// 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>
50
57
// 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>
52
59
// 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>
54
61
// 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>
56
63
// 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>
58
65
// 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>
60
67
61
68
void zero_init (int x ) {
62
69
int arr [3 ] = {x };
63
70
}
64
71
// CIR: cir.func dso_local @zero_init
65
72
// 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}
67
74
// CIR: [[TEMP:%.*]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["arrayinit.temp", init] {alignment = 8 : i64}
68
75
// 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>
70
78
// CIR: [[VAR:%.*]] = cir.load{{.*}} [[VAR_ALLOC]] : !cir.ptr<!s32i>, !s32i
71
79
// CIR: cir.store{{.*}} [[VAR]], [[BEGIN]] : !s32i, !cir.ptr<!s32i>
72
80
// 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>
74
82
// CIR: cir.store{{.*}} [[ZERO_INIT_START]], [[TEMP]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
75
83
// 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>
77
85
// CIR: cir.do {
78
86
// CIR: [[CUR:%.*]] = cir.load{{.*}} [[TEMP]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
79
87
// CIR: [[FILLER:%.*]] = cir.const #cir.int<0> : !s32i
@@ -99,26 +107,28 @@ void aggr_init() {
99
107
// CIR: [[TEMP:%.*]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["arrayinit.temp", init] {alignment = 8 : i64}
100
108
// CIR: %3 = cir.const #cir.int<5> : !s32i
101
109
// 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>
115
124
// 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>
117
126
// 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>>
120
130
// 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>
122
132
// CIR: cir.do {
123
133
// CIR: [[CUR:%.*]] = cir.load{{.*}} [[TEMP]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
124
134
// CIR: [[FILLER:%.*]] = cir.const #cir.int<0> : !s32i
@@ -139,18 +149,18 @@ void aggr_init() {
139
149
// LLVM: %2 = alloca [5 x i32], i64 1, align 16
140
150
// LLVM: [[TEMP:%.*]] = alloca ptr, i64 1, align 8
141
151
// 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
143
153
// 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
145
155
// 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
147
157
// 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
149
159
// LLVM: [[VAR:%.*]] = load i32, ptr [[VAR_ALLOC]], align 4
150
160
// 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
154
164
// LLVM: br label %14
155
165
//
156
166
// LLVM: 11: ; preds = %14
0 commit comments