@@ -164,3 +164,57 @@ void test4(int n) {
164
164
int y = _Countof (int [n ++ ][7 ]);
165
165
}
166
166
167
+ // CHECK-64-LABEL: define dso_local void @test5(
168
+ // CHECK-64-SAME: ) #[[ATTR0]] {
169
+ // CHECK-64-NEXT: [[ENTRY:.*:]]
170
+ // CHECK-64-NEXT: [[J:%.*]] = alloca i32, align
171
+ // CHECK-64-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align
172
+ // CHECK-64-NEXT: [[A:%.*]] = alloca i32, align
173
+ // CHECK-64-NEXT: [[B:%.*]] = alloca i32, align
174
+ // CHECK-64-NEXT: [[C:%.*]] = alloca i32, align
175
+ // CHECK-64-NEXT: [[D:%.*]] = alloca i32, align
176
+ // CHECK-64-NEXT: store i32 2, ptr [[J]], align
177
+ // CHECK-64-NEXT: [[TMP0:%.*]] = call ptr @llvm.stacksave.p0()
178
+ // CHECK-64-NEXT: store ptr [[TMP0]], ptr [[SAVED_STACK]], align
179
+ // CHECK-64-NEXT: [[VLA:%.*]] = alloca i32, i64 120, align
180
+ // CHECK-64-NEXT: store i32 1, ptr [[A]], align
181
+ // CHECK-64-NEXT: store i32 4, ptr [[B]], align
182
+ // CHECK-64-NEXT: store i32 5, ptr [[C]], align
183
+ // CHECK-64-NEXT: store i32 6, ptr [[D]], align
184
+ // CHECK-64-NEXT: [[TMP1:%.*]] = load ptr, ptr [[SAVED_STACK]], align
185
+ // CHECK-64-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP1]])
186
+ // CHECK-64-NEXT: ret void
187
+ //
188
+ // CHECK-32-LABEL: define dso_local void @test5(
189
+ // CHECK-32-SAME: ) #[[ATTR0]] {
190
+ // CHECK-32-NEXT: [[ENTRY:.*:]]
191
+ // CHECK-32-NEXT: [[J:%.*]] = alloca i32, align
192
+ // CHECK-32-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align
193
+ // CHECK-32-NEXT: [[A:%.*]] = alloca i32, align
194
+ // CHECK-32-NEXT: [[B:%.*]] = alloca i32, align
195
+ // CHECK-32-NEXT: [[C:%.*]] = alloca i32, align
196
+ // CHECK-32-NEXT: [[D:%.*]] = alloca i32, align
197
+ // CHECK-32-NEXT: store i32 2, ptr [[J]], align
198
+ // CHECK-32-NEXT: [[TMP0:%.*]] = call ptr @llvm.stacksave.p0()
199
+ // CHECK-32-NEXT: store ptr [[TMP0]], ptr [[SAVED_STACK]], align
200
+ // CHECK-32-NEXT: [[VLA:%.*]] = alloca i32, i32 120, align
201
+ // CHECK-32-NEXT: store i32 1, ptr [[A]], align
202
+ // CHECK-32-NEXT: store i32 4, ptr [[B]], align
203
+ // CHECK-32-NEXT: store i32 5, ptr [[C]], align
204
+ // CHECK-32-NEXT: store i32 6, ptr [[D]], align
205
+ // CHECK-32-NEXT: [[TMP1:%.*]] = load ptr, ptr [[SAVED_STACK]], align
206
+ // CHECK-32-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP1]])
207
+ // CHECK-32-NEXT: ret void
208
+ //
209
+ void test5 () {
210
+ // Ensure we're getting the variable-length dimensions correctly. We were
211
+ // previously returning the size of all VLA dimensions multiplied together
212
+ // to get the total element count rather than the element count for a single
213
+ // array rank. See GH141409
214
+ const int j = 2 ;
215
+ int arr [1 ][j + 2 ][j + 3 ][j + 4 ];
216
+ int a = _Countof arr ;
217
+ int b = _Countof * arr ;
218
+ int c = _Countof * * arr ;
219
+ int d = _Countof * * * arr ;
220
+ }
0 commit comments