@@ -208,6 +208,127 @@ void t_new_constant_size() {
208208// OGCG: %[[CALL:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 128)
209209// OGCG: store ptr %[[CALL]], ptr %[[P_ADDR]], align 8
210210
211+ class C {
212+ public:
213+ ~C ();
214+ };
215+
216+ void t_constant_size_nontrivial () {
217+ auto p = new C[3 ];
218+ }
219+
220+ // CHECK: cir.func{{.*}} @_Z26t_constant_size_nontrivialv()
221+ // CHECK: %[[P_ADDR:.*]] = cir.alloca !cir.ptr<!rec_C>, !cir.ptr<!cir.ptr<!rec_C>>, ["p", init] {alignment = 8 : i64}
222+ // CHECK: %[[#NUM_ELEMENTS:]] = cir.const #cir.int<3> : !u64i
223+ // CHECK: %[[#SIZE_WITHOUT_COOKIE:]] = cir.const #cir.int<3> : !u64i
224+ // CHECK: %[[#ALLOCATION_SIZE:]] = cir.const #cir.int<11> : !u64i
225+ // CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[#ALLOCATION_SIZE]]) : (!u64i) -> !cir.ptr<!void>
226+ // CHECK: %[[COOKIE_PTR_BASE:.*]] = cir.cast bitcast %[[RAW_PTR]] : !cir.ptr<!void> -> !cir.ptr<!cir.ptr<!u8i>>
227+ // CHECK: %[[COOKIE_PTR:.*]] = cir.cast bitcast %[[COOKIE_PTR_BASE]] : !cir.ptr<!cir.ptr<!u8i>> -> !cir.ptr<!u64i>
228+ // CHECK: cir.store align(8) %[[#NUM_ELEMENTS]], %[[COOKIE_PTR]] : !u64i, !cir.ptr<!u64i>
229+ // CHECK: %[[#COOKIE_SIZE:]] = cir.const #cir.int<8> : !s32i
230+ // CHECK: %[[DATA_PTR_RAW:.*]] = cir.ptr_stride %[[COOKIE_PTR_BASE]], %[[#COOKIE_SIZE]] : (!cir.ptr<!cir.ptr<!u8i>>, !s32i) -> !cir.ptr<!cir.ptr<!u8i>>
231+ // CHECK: %[[DATA_PTR_VOID:.*]] = cir.cast bitcast %[[DATA_PTR_RAW]] : !cir.ptr<!cir.ptr<!u8i>> -> !cir.ptr<!void>
232+ // CHECK: %[[DATA_PTR:.*]] = cir.cast bitcast %[[DATA_PTR_VOID]] : !cir.ptr<!void> -> !cir.ptr<!rec_C>
233+ // CHECK: cir.store align(8) %[[DATA_PTR]], %[[P_ADDR]] : !cir.ptr<!rec_C>, !cir.ptr<!cir.ptr<!rec_C>>
234+ // CHECK: cir.return
235+ // CHECK: }
236+
237+ // LLVM: @_Z26t_constant_size_nontrivialv()
238+ // LLVM: %[[ALLOCA:.*]] = alloca ptr, i64 1, align 8
239+ // LLVM: %[[COOKIE_PTR:.*]] = call ptr @_Znam(i64 11)
240+ // LLVM: store i64 3, ptr %[[COOKIE_PTR]], align 8
241+ // LLVM: %[[ALLOCATED_PTR:.*]] = getelementptr ptr, ptr %[[COOKIE_PTR]], i64 8
242+ // LLVM: store ptr %[[ALLOCATED_PTR]], ptr %[[ALLOCA]], align 8
243+
244+ // OGCG: @_Z26t_constant_size_nontrivialv()
245+ // OGCG: %[[ALLOCA:.*]] = alloca ptr, align 8
246+ // OGCG: %[[COOKIE_PTR:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 11)
247+ // OGCG: store i64 3, ptr %[[COOKIE_PTR]], align 8
248+ // OGCG: %[[ALLOCATED_PTR:.*]] = getelementptr inbounds i8, ptr %[[COOKIE_PTR]], i64 8
249+ // OGCG: store ptr %[[ALLOCATED_PTR]], ptr %[[ALLOCA]], align 8
250+
251+ class D {
252+ public:
253+ int x;
254+ ~D ();
255+ };
256+
257+ void t_constant_size_nontrivial2 () {
258+ auto p = new D[3 ];
259+ }
260+
261+ // In this test SIZE_WITHOUT_COOKIE isn't used, but it would be if there were
262+ // an initializer.
263+
264+ // CHECK: cir.func{{.*}} @_Z27t_constant_size_nontrivial2v()
265+ // CHECK: %[[P_ADDR:.*]] = cir.alloca !cir.ptr<!rec_D>, !cir.ptr<!cir.ptr<!rec_D>>, ["p", init] {alignment = 8 : i64}
266+ // CHECK: %[[#NUM_ELEMENTS:]] = cir.const #cir.int<3> : !u64i
267+ // CHECK: %[[#SIZE_WITHOUT_COOKIE:]] = cir.const #cir.int<12> : !u64i
268+ // CHECK: %[[#ALLOCATION_SIZE:]] = cir.const #cir.int<20> : !u64i
269+ // CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[#ALLOCATION_SIZE]]) : (!u64i) -> !cir.ptr<!void>
270+ // CHECK: %[[COOKIE_PTR_BASE:.*]] = cir.cast bitcast %[[RAW_PTR]] : !cir.ptr<!void> -> !cir.ptr<!cir.ptr<!u8i>>
271+ // CHECK: %[[COOKIE_PTR:.*]] = cir.cast bitcast %[[COOKIE_PTR_BASE]] : !cir.ptr<!cir.ptr<!u8i>> -> !cir.ptr<!u64i>
272+ // CHECK: cir.store align(8) %[[#NUM_ELEMENTS]], %[[COOKIE_PTR]] : !u64i, !cir.ptr<!u64i>
273+ // CHECK: %[[#COOKIE_SIZE:]] = cir.const #cir.int<8> : !s32i
274+ // CHECK: %[[DATA_PTR_RAW:.*]] = cir.ptr_stride %[[COOKIE_PTR_BASE]], %[[#COOKIE_SIZE]] : (!cir.ptr<!cir.ptr<!u8i>>, !s32i) -> !cir.ptr<!cir.ptr<!u8i>>
275+ // CHECK: %[[DATA_PTR_VOID:.*]] = cir.cast bitcast %[[DATA_PTR_RAW]] : !cir.ptr<!cir.ptr<!u8i>> -> !cir.ptr<!void>
276+ // CHECK: %[[DATA_PTR:.*]] = cir.cast bitcast %[[DATA_PTR_VOID]] : !cir.ptr<!void> -> !cir.ptr<!rec_D>
277+ // CHECK: cir.store align(8) %[[DATA_PTR]], %[[P_ADDR]] : !cir.ptr<!rec_D>, !cir.ptr<!cir.ptr<!rec_D>>
278+ // CHECK: cir.return
279+ // CHECK: }
280+
281+ // LLVM: @_Z27t_constant_size_nontrivial2v()
282+ // LLVM: %[[ALLOCA:.*]] = alloca ptr, i64 1, align 8
283+ // LLVM: %[[COOKIE_PTR:.*]] = call ptr @_Znam(i64 20)
284+ // LLVM: store i64 3, ptr %[[COOKIE_PTR]], align 8
285+ // LLVM: %[[ALLOCATED_PTR:.*]] = getelementptr ptr, ptr %[[COOKIE_PTR]], i64 8
286+ // LLVM: store ptr %[[ALLOCATED_PTR]], ptr %[[ALLOCA]], align 8
287+
288+ struct alignas (16 ) E {
289+ int x;
290+ ~E ();
291+ };
292+
293+ void t_align16_nontrivial () {
294+ auto p = new E[2 ];
295+ }
296+
297+ // CHECK: cir.func{{.*}} @_Z20t_align16_nontrivialv()
298+ // CHECK: %[[P_ADDR:.*]] = cir.alloca !cir.ptr<!rec_E>, !cir.ptr<!cir.ptr<!rec_E>>, ["p", init] {alignment = 8 : i64}
299+ // CHECK: %[[#NUM_ELEMENTS:]] = cir.const #cir.int<2> : !u64i
300+ // CHECK: %[[#SIZE_WITHOUT_COOKIE:]] = cir.const #cir.int<32> : !u64i
301+ // CHECK: %[[#ALLOCATION_SIZE:]] = cir.const #cir.int<48> : !u64i
302+ // CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[#ALLOCATION_SIZE]]) : (!u64i) -> !cir.ptr<!void>
303+ // CHECK: %[[COOKIE_PTR_BASE:.*]] = cir.cast bitcast %[[RAW_PTR]] : !cir.ptr<!void> -> !cir.ptr<!cir.ptr<!u8i>>
304+ // CHECK: %[[COOKIE_OFFSET:.*]] = cir.const #cir.int<8> : !s32i
305+ // CHECK: %[[COOKIE_PTR_RAW:.*]] = cir.ptr_stride %[[COOKIE_PTR_BASE]], %[[COOKIE_OFFSET]] : (!cir.ptr<!cir.ptr<!u8i>>, !s32i) -> !cir.ptr<!cir.ptr<!u8i>>
306+ // CHECK: %[[COOKIE_PTR:.*]] = cir.cast bitcast %[[COOKIE_PTR_RAW]] : !cir.ptr<!cir.ptr<!u8i>> -> !cir.ptr<!u64i>
307+ // CHECK: cir.store align(8) %[[#NUM_ELEMENTS]], %[[COOKIE_PTR]] : !u64i, !cir.ptr<!u64i>
308+ // CHECK: %[[#COOKIE_SIZE:]] = cir.const #cir.int<16> : !s32i
309+ // CHECK: %[[DATA_PTR_RAW:.*]] = cir.ptr_stride %[[COOKIE_PTR_BASE]], %[[#COOKIE_SIZE]] : (!cir.ptr<!cir.ptr<!u8i>>, !s32i) -> !cir.ptr<!cir.ptr<!u8i>>
310+ // CHECK: %[[DATA_PTR_VOID:.*]] = cir.cast bitcast %[[DATA_PTR_RAW]] : !cir.ptr<!cir.ptr<!u8i>> -> !cir.ptr<!void>
311+ // CHECK: %[[DATA_PTR:.*]] = cir.cast bitcast %[[DATA_PTR_VOID]] : !cir.ptr<!void> -> !cir.ptr<!rec_E>
312+ // CHECK: cir.store align(8) %[[DATA_PTR]], %[[P_ADDR]] : !cir.ptr<!rec_E>, !cir.ptr<!cir.ptr<!rec_E>>
313+ // CHECK: cir.return
314+ // CHECK: }
315+
316+ // LLVM: @_Z20t_align16_nontrivialv()
317+ // LLVM: %[[ALLOCA:.*]] = alloca ptr, i64 1, align 8
318+ // LLVM: %[[RAW_PTR:.*]] = call ptr @_Znam(i64 48)
319+ // LLVM: %[[COOKIE_PTR:.*]] = getelementptr ptr, ptr %[[RAW_PTR]], i64 8
320+ // LLVM: store i64 2, ptr %[[COOKIE_PTR]], align 8
321+ // LLVM: %[[ALLOCATED_PTR:.*]] = getelementptr ptr, ptr %[[RAW_PTR]], i64 16
322+ // LLVM: store ptr %[[ALLOCATED_PTR]], ptr %[[ALLOCA]], align 8
323+
324+ // OGCG: define{{.*}} void @_Z20t_align16_nontrivialv
325+ // OGCG: %[[ALLOCA:.*]] = alloca ptr, align 8
326+ // OGCG: %[[RAW_PTR:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 48)
327+ // OGCG: %[[COOKIE_PTR:.*]] = getelementptr inbounds i8, ptr %[[RAW_PTR]], i64 8
328+ // OGCG: store i64 2, ptr %[[COOKIE_PTR]], align 8
329+ // OGCG: %[[ALLOCATED_PTR:.*]] = getelementptr inbounds i8, ptr %[[RAW_PTR]], i64 16
330+ // OGCG: store ptr %[[ALLOCATED_PTR]], ptr %[[ALLOCA]], align 8
331+ // OGCG: ret void
211332
212333void t_new_multidim_constant_size () {
213334 auto p = new double [2 ][3 ][4 ];
0 commit comments