357 lines · cpp
1// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir2// RUN: FileCheck --input-file=%t.cir %s3// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t-cir.ll4// RUN: FileCheck --check-prefix=LLVM --input-file=%t-cir.ll %s5// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o %t.ll6// RUN: FileCheck --check-prefix=OGCG --input-file=%t.ll %s7 8struct S {9 int a;10 int b;11};12 13void test_basic_new() {14 S *ps = new S;15 int *pn = new int;16 double *pd = new double;17}18 19// CHECK: cir.func{{.*}} @_Z14test_basic_newv20// CHECK: %[[PS_ADDR:.*]] = cir.alloca !cir.ptr<!rec_S>, !cir.ptr<!cir.ptr<!rec_S>>, ["ps", init]21// CHECK: %[[PN_ADDR:.*]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["pn", init]22// CHECK: %[[PD_ADDR:.*]] = cir.alloca !cir.ptr<!cir.double>, !cir.ptr<!cir.ptr<!cir.double>>, ["pd", init]23// CHECK: %[[EIGHT:.*]] = cir.const #cir.int<8>24// CHECK: %[[NEW_S:.*]] = cir.call @_Znwm(%[[EIGHT]])25// CHECK: %[[NEW_S_PTR:.*]] = cir.cast bitcast %[[NEW_S]]26// CHECK: cir.store{{.*}} %[[NEW_S_PTR]], %[[PS_ADDR]]27// CHECK: %[[FOUR:.*]] = cir.const #cir.int<4>28// CHECK: %[[NEW_INT:.*]] = cir.call @_Znwm(%[[FOUR]])29// CHECK: %[[NEW_INT_PTR:.*]] = cir.cast bitcast %[[NEW_INT]]30// CHECK: cir.store{{.*}} %[[NEW_INT_PTR]], %[[PN_ADDR]]31// CHECK: %[[EIGHT:.*]] = cir.const #cir.int<8>32// CHECK: %[[NEW_DOUBLE:.*]] = cir.call @_Znwm(%[[EIGHT]])33// CHECK: %[[NEW_DOUBLE_PTR:.*]] = cir.cast bitcast %[[NEW_DOUBLE]]34// CHECK: cir.store{{.*}} %[[NEW_DOUBLE_PTR]], %[[PD_ADDR]]35// CHECK: cir.return36 37// LLVM: define{{.*}} void @_Z14test_basic_newv38// LLVM: %[[PS_ADDR:.*]] = alloca ptr, i64 1, align 839// LLVM: %[[PN_ADDR:.*]] = alloca ptr, i64 1, align 840// LLVM: %[[PD_ADDR:.*]] = alloca ptr, i64 1, align 841// LLVM: %[[NEW_S:.*]] = call{{.*}} ptr @_Znwm(i64 8)42// LLVM: store ptr %[[NEW_S]], ptr %[[PS_ADDR]], align 843// LLVM: %[[NEW_INT:.*]] = call{{.*}} ptr @_Znwm(i64 4)44// LLVM: store ptr %[[NEW_INT]], ptr %[[PN_ADDR]], align 845// LLVM: %[[NEW_DOUBLE:.*]] = call{{.*}} ptr @_Znwm(i64 8)46// LLVM: store ptr %[[NEW_DOUBLE]], ptr %[[PD_ADDR]], align 847// LLVM: ret void48 49// OGCG: define{{.*}} void @_Z14test_basic_newv50// OGCG: %[[PS_ADDR:.*]] = alloca ptr, align 851// OGCG: %[[PN_ADDR:.*]] = alloca ptr, align 852// OGCG: %[[PD_ADDR:.*]] = alloca ptr, align 853// OGCG: %[[NEW_S:.*]] = call{{.*}} ptr @_Znwm(i64 noundef 8)54// OGCG: store ptr %[[NEW_S]], ptr %[[PS_ADDR]], align 855// OGCG: %[[NEW_INT:.*]] = call{{.*}} ptr @_Znwm(i64 noundef 4)56// OGCG: store ptr %[[NEW_INT]], ptr %[[PN_ADDR]], align 857// OGCG: %[[NEW_DOUBLE:.*]] = call{{.*}} ptr @_Znwm(i64 noundef 8)58// OGCG: store ptr %[[NEW_DOUBLE]], ptr %[[PD_ADDR]], align 859// OGCG: ret void60 61void test_new_with_init() {62 int *pn = new int{2};63 double *pd = new double{3.0};64}65 66// CHECK: cir.func{{.*}} @_Z18test_new_with_initv67// CHECK: %[[PN_ADDR:.*]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["pn", init]68// CHECK: %[[PD_ADDR:.*]] = cir.alloca !cir.ptr<!cir.double>, !cir.ptr<!cir.ptr<!cir.double>>, ["pd", init]69// CHECK: %[[FOUR:.*]] = cir.const #cir.int<4>70// CHECK: %[[NEW_INT:.*]] = cir.call @_Znwm(%[[FOUR]])71// CHECK: %[[NEW_INT_PTR:.*]] = cir.cast bitcast %[[NEW_INT]]72// CHECK: %[[TWO:.*]] = cir.const #cir.int<2>73// CHECK: cir.store{{.*}} %[[TWO]], %[[NEW_INT_PTR]]74// CHECK: cir.store{{.*}} %[[NEW_INT_PTR]], %[[PN_ADDR]]75// CHECK: %[[EIGHT:.*]] = cir.const #cir.int<8>76// CHECK: %[[NEW_DOUBLE:.*]] = cir.call @_Znwm(%[[EIGHT]])77// CHECK: %[[NEW_DOUBLE_PTR:.*]] = cir.cast bitcast %[[NEW_DOUBLE]]78// CHECK: %[[THREE:.*]] = cir.const #cir.fp<3.000000e+00>79// CHECK: cir.store{{.*}} %[[THREE]], %[[NEW_DOUBLE_PTR]]80// CHECK: cir.store{{.*}} %[[NEW_DOUBLE_PTR]], %[[PD_ADDR]]81// CHECK: cir.return82 83// LLVM: define{{.*}} void @_Z18test_new_with_initv84// LLVM: %[[PN_ADDR:.*]] = alloca ptr, i64 1, align 885// LLVM: %[[PD_ADDR:.*]] = alloca ptr, i64 1, align 886// LLVM: %[[NEW_INT:.*]] = call{{.*}} ptr @_Znwm(i64 4)87// LLVM: store i32 2, ptr %[[NEW_INT]], align 488// LLVM: store ptr %[[NEW_INT]], ptr %[[PN_ADDR]], align 889// LLVM: %[[NEW_DOUBLE:.*]] = call{{.*}} ptr @_Znwm(i64 8)90// LLVM: store double 3.000000e+00, ptr %[[NEW_DOUBLE]], align 891// LLVM: store ptr %[[NEW_DOUBLE]], ptr %[[PD_ADDR]], align 892// LLVM: ret void93 94// OGCG: define{{.*}} void @_Z18test_new_with_initv95// OGCG: %[[PN_ADDR:.*]] = alloca ptr, align 896// OGCG: %[[PD_ADDR:.*]] = alloca ptr, align 897// OGCG: %[[NEW_INT:.*]] = call{{.*}} ptr @_Znwm(i64 noundef 4)98// OGCG: store i32 2, ptr %[[NEW_INT]], align 499// OGCG: store ptr %[[NEW_INT]], ptr %[[PN_ADDR]], align 8100// OGCG: %[[NEW_DOUBLE:.*]] = call{{.*}} ptr @_Znwm(i64 noundef 8)101// OGCG: store double 3.000000e+00, ptr %[[NEW_DOUBLE]], align 8102// OGCG: store ptr %[[NEW_DOUBLE]], ptr %[[PD_ADDR]], align 8103// OGCG: ret void104 105struct S2 {106 S2();107 S2(int, int);108 int a;109 int b;110};111 112void test_new_with_ctor() {113 S2 *ps2 = new S2;114 S2 *ps2_2 = new S2(1, 2);115}116 117// CHECK: cir.func{{.*}} @_Z18test_new_with_ctorv118// CHECK: %[[PS2_ADDR:.*]] = cir.alloca !cir.ptr<!rec_S2>, !cir.ptr<!cir.ptr<!rec_S2>>, ["ps2", init]119// CHECK: %[[PS2_2_ADDR:.*]] = cir.alloca !cir.ptr<!rec_S2>, !cir.ptr<!cir.ptr<!rec_S2>>, ["ps2_2", init]120// CHECK: %[[EIGHT:.*]] = cir.const #cir.int<8>121// CHECK: %[[NEW_S2:.*]] = cir.call @_Znwm(%[[EIGHT]])122// CHECK: %[[NEW_S2_PTR:.*]] = cir.cast bitcast %[[NEW_S2]]123// CHECK: cir.call @_ZN2S2C1Ev(%[[NEW_S2_PTR]])124// CHECK: cir.store{{.*}} %[[NEW_S2_PTR]], %[[PS2_ADDR]]125// CHECK: %[[EIGHT:.*]] = cir.const #cir.int<8>126// CHECK: %[[NEW_S2_2:.*]] = cir.call @_Znwm(%[[EIGHT]])127// CHECK: %[[NEW_S2_2_PTR:.*]] = cir.cast bitcast %[[NEW_S2_2]]128// CHECK: %[[ONE:.*]] = cir.const #cir.int<1>129// CHECK: %[[TWO:.*]] = cir.const #cir.int<2>130// CHECK: cir.call @_ZN2S2C1Eii(%[[NEW_S2_2_PTR]], %[[ONE]], %[[TWO]])131// CHECK: cir.store{{.*}} %[[NEW_S2_2_PTR]], %[[PS2_2_ADDR]]132// CHECK: cir.return133 134// LLVM: define{{.*}} void @_Z18test_new_with_ctorv135// LLVM: %[[PS2_ADDR:.*]] = alloca ptr, i64 1, align 8136// LLVM: %[[PS2_2_ADDR:.*]] = alloca ptr, i64 1, align 8137// LLVM: %[[NEW_S2:.*]] = call{{.*}} ptr @_Znwm(i64 8)138// LLVM: call{{.*}} void @_ZN2S2C1Ev(ptr %[[NEW_S2]])139// LLVM: store ptr %[[NEW_S2]], ptr %[[PS2_ADDR]], align 8140// LLVM: %[[NEW_S2_2:.*]] = call{{.*}} ptr @_Znwm(i64 8)141// LLVM: call{{.*}} void @_ZN2S2C1Eii(ptr %[[NEW_S2_2]], i32 1, i32 2)142// LLVM: store ptr %[[NEW_S2_2]], ptr %[[PS2_2_ADDR]], align 8143// LLVM: ret void144 145// OGCG: define{{.*}} void @_Z18test_new_with_ctorv146// OGCG: %[[PS2_ADDR:.*]] = alloca ptr, align 8147// OGCG: %[[PS2_2_ADDR:.*]] = alloca ptr, align 8148// OGCG: %[[NEW_S2:.*]] = call{{.*}} ptr @_Znwm(i64 noundef 8)149// OGCG: call{{.*}} void @_ZN2S2C1Ev(ptr {{.*}} %[[NEW_S2]])150// OGCG: store ptr %[[NEW_S2]], ptr %[[PS2_ADDR]], align 8151// OGCG: %[[NEW_S2_2:.*]] = call{{.*}} ptr @_Znwm(i64 noundef 8)152// OGCG: call{{.*}} void @_ZN2S2C1Eii(ptr {{.*}} %[[NEW_S2_2]], i32 noundef 1, i32 noundef 2)153// OGCG: store ptr %[[NEW_S2_2]], ptr %[[PS2_2_ADDR]], align 8154// OGCG: ret void155 156void test_new_with_complex_type() {157 _Complex float *a = new _Complex float{1.0f, 2.0f};158}159 160// CHECK: cir.func{{.*}} @_Z26test_new_with_complex_typev161// CHECK: %[[A_ADDR:.*]] = cir.alloca !cir.ptr<!cir.complex<!cir.float>>, !cir.ptr<!cir.ptr<!cir.complex<!cir.float>>>, ["a", init]162// CHECK: %[[COMPLEX_SIZE:.*]] = cir.const #cir.int<8> : !u64i163// CHECK: %[[NEW_COMPLEX:.*]] = cir.call @_Znwm(%[[COMPLEX_SIZE]]) : (!u64i) -> !cir.ptr<!void>164// CHECK: %[[COMPLEX_PTR:.*]] = cir.cast bitcast %[[NEW_COMPLEX]] : !cir.ptr<!void> -> !cir.ptr<!cir.complex<!cir.float>>165// CHECK: %[[COMPLEX_VAL:.*]] = cir.const #cir.const_complex<#cir.fp<1.000000e+00> : !cir.float, #cir.fp<2.000000e+00> : !cir.float> : !cir.complex<!cir.float>166// CHECK: cir.store{{.*}} %[[COMPLEX_VAL]], %[[COMPLEX_PTR]] : !cir.complex<!cir.float>, !cir.ptr<!cir.complex<!cir.float>>167// CHECK: cir.store{{.*}} %[[COMPLEX_PTR]], %[[A_ADDR]] : !cir.ptr<!cir.complex<!cir.float>>, !cir.ptr<!cir.ptr<!cir.complex<!cir.float>>>168 169// LLVM: define{{.*}} void @_Z26test_new_with_complex_typev170// LLVM: %[[A_ADDR:.*]] = alloca ptr, i64 1, align 8171// LLVM: %[[NEW_COMPLEX:.*]] = call ptr @_Znwm(i64 8)172// LLVM: store { float, float } { float 1.000000e+00, float 2.000000e+00 }, ptr %[[NEW_COMPLEX]], align 8173// LLVM: store ptr %[[NEW_COMPLEX]], ptr %[[A_ADDR]], align 8174 175// OGCG: define{{.*}} void @_Z26test_new_with_complex_typev176// OGCG: %[[A_ADDR:.*]] = alloca ptr, align 8177// OGCG: %[[NEW_COMPLEX:.*]] = call noalias noundef nonnull ptr @_Znwm(i64 noundef 8)178// OGCG: %[[COMPLEX_REAL_PTR:.*]] = getelementptr inbounds nuw { float, float }, ptr %[[NEW_COMPLEX]], i32 0, i32 0179// OGCG: %[[COMPLEX_IMAG_PTR:.*]] = getelementptr inbounds nuw { float, float }, ptr %[[NEW_COMPLEX]], i32 0, i32 1180// OGCG: store float 1.000000e+00, ptr %[[COMPLEX_REAL_PTR]], align 8181// OGCG: store float 2.000000e+00, ptr %[[COMPLEX_IMAG_PTR]], align 4182// OGCG: store ptr %[[NEW_COMPLEX]], ptr %[[A_ADDR]], align 8183 184void t_new_constant_size() {185 auto p = new double[16];186}187 188// In this test, NUM_ELEMENTS isn't used because no cookie is needed and there189// are no constructor calls needed.190 191// CHECK: cir.func{{.*}} @_Z19t_new_constant_sizev()192// CHECK: %[[P_ADDR:.*]] = cir.alloca !cir.ptr<!cir.double>, !cir.ptr<!cir.ptr<!cir.double>>, ["p", init] {alignment = 8 : i64}193// CHECK: %[[#NUM_ELEMENTS:]] = cir.const #cir.int<16> : !u64i194// CHECK: %[[#ALLOCATION_SIZE:]] = cir.const #cir.int<128> : !u64i195// CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[#ALLOCATION_SIZE]]) : (!u64i) -> !cir.ptr<!void>196// CHECK: %[[TYPED_PTR:.*]] = cir.cast bitcast %[[RAW_PTR]] : !cir.ptr<!void> -> !cir.ptr<!cir.double>197// CHECK: cir.store align(8) %[[TYPED_PTR]], %[[P_ADDR]] : !cir.ptr<!cir.double>, !cir.ptr<!cir.ptr<!cir.double>>198// CHECK: cir.return199// CHECK: }200 201// LLVM: define{{.*}} void @_Z19t_new_constant_sizev202// LLVM: %[[P_ADDR:.*]] = alloca ptr, i64 1, align 8203// LLVM: %[[CALL:.*]] = call ptr @_Znam(i64 128)204// LLVM: store ptr %[[CALL]], ptr %[[P_ADDR]], align 8205 206// OGCG: define{{.*}} void @_Z19t_new_constant_sizev207// OGCG: %[[P_ADDR:.*]] = alloca ptr, align 8208// OGCG: %[[CALL:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 128)209// OGCG: store ptr %[[CALL]], ptr %[[P_ADDR]], align 8210 211class C {212 public:213 ~C();214};215 216void 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> : !u64i223// CHECK: %[[#SIZE_WITHOUT_COOKIE:]] = cir.const #cir.int<3> : !u64i224// CHECK: %[[#ALLOCATION_SIZE:]] = cir.const #cir.int<11> : !u64i225// 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> : !s32i230// 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.return235// CHECK: }236 237// LLVM: @_Z26t_constant_size_nontrivialv()238// LLVM: %[[ALLOCA:.*]] = alloca ptr, i64 1, align 8239// LLVM: %[[COOKIE_PTR:.*]] = call ptr @_Znam(i64 11)240// LLVM: store i64 3, ptr %[[COOKIE_PTR]], align 8241// LLVM: %[[ALLOCATED_PTR:.*]] = getelementptr ptr, ptr %[[COOKIE_PTR]], i64 8242// LLVM: store ptr %[[ALLOCATED_PTR]], ptr %[[ALLOCA]], align 8243 244// OGCG: @_Z26t_constant_size_nontrivialv()245// OGCG: %[[ALLOCA:.*]] = alloca ptr, align 8246// OGCG: %[[COOKIE_PTR:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 11)247// OGCG: store i64 3, ptr %[[COOKIE_PTR]], align 8248// OGCG: %[[ALLOCATED_PTR:.*]] = getelementptr inbounds i8, ptr %[[COOKIE_PTR]], i64 8249// OGCG: store ptr %[[ALLOCATED_PTR]], ptr %[[ALLOCA]], align 8250 251class D {252 public:253 int x;254 ~D();255};256 257void 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 were262// 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> : !u64i267// CHECK: %[[#SIZE_WITHOUT_COOKIE:]] = cir.const #cir.int<12> : !u64i268// CHECK: %[[#ALLOCATION_SIZE:]] = cir.const #cir.int<20> : !u64i269// 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> : !s32i274// 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.return279// CHECK: }280 281// LLVM: @_Z27t_constant_size_nontrivial2v()282// LLVM: %[[ALLOCA:.*]] = alloca ptr, i64 1, align 8283// LLVM: %[[COOKIE_PTR:.*]] = call ptr @_Znam(i64 20)284// LLVM: store i64 3, ptr %[[COOKIE_PTR]], align 8285// LLVM: %[[ALLOCATED_PTR:.*]] = getelementptr ptr, ptr %[[COOKIE_PTR]], i64 8286// LLVM: store ptr %[[ALLOCATED_PTR]], ptr %[[ALLOCA]], align 8287 288struct alignas(16) E {289 int x;290 ~E();291};292 293void 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> : !u64i300// CHECK: %[[#SIZE_WITHOUT_COOKIE:]] = cir.const #cir.int<32> : !u64i301// CHECK: %[[#ALLOCATION_SIZE:]] = cir.const #cir.int<48> : !u64i302// 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> : !s32i305// 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> : !s32i309// 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.return314// CHECK: }315 316// LLVM: @_Z20t_align16_nontrivialv()317// LLVM: %[[ALLOCA:.*]] = alloca ptr, i64 1, align 8318// LLVM: %[[RAW_PTR:.*]] = call ptr @_Znam(i64 48)319// LLVM: %[[COOKIE_PTR:.*]] = getelementptr ptr, ptr %[[RAW_PTR]], i64 8320// LLVM: store i64 2, ptr %[[COOKIE_PTR]], align 8321// LLVM: %[[ALLOCATED_PTR:.*]] = getelementptr ptr, ptr %[[RAW_PTR]], i64 16322// LLVM: store ptr %[[ALLOCATED_PTR]], ptr %[[ALLOCA]], align 8323 324// OGCG: define{{.*}} void @_Z20t_align16_nontrivialv325// OGCG: %[[ALLOCA:.*]] = alloca ptr, align 8326// OGCG: %[[RAW_PTR:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 48)327// OGCG: %[[COOKIE_PTR:.*]] = getelementptr inbounds i8, ptr %[[RAW_PTR]], i64 8328// OGCG: store i64 2, ptr %[[COOKIE_PTR]], align 8329// OGCG: %[[ALLOCATED_PTR:.*]] = getelementptr inbounds i8, ptr %[[RAW_PTR]], i64 16330// OGCG: store ptr %[[ALLOCATED_PTR]], ptr %[[ALLOCA]], align 8331// OGCG: ret void332 333void t_new_multidim_constant_size() {334 auto p = new double[2][3][4];335}336 337// As above, NUM_ELEMENTS isn't used.338 339// CHECK: cir.func{{.*}} @_Z28t_new_multidim_constant_sizev()340// CHECK: %[[P_ADDR:.*]] = cir.alloca !cir.ptr<!cir.array<!cir.array<!cir.double x 4> x 3>>, !cir.ptr<!cir.ptr<!cir.array<!cir.array<!cir.double x 4> x 3>>>, ["p", init] {alignment = 8 : i64}341// CHECK: %[[#NUM_ELEMENTS:]] = cir.const #cir.int<24> : !u64i342// CHECK: %[[#ALLOCATION_SIZE:]] = cir.const #cir.int<192> : !u64i343// CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[#ALLOCATION_SIZE]]) : (!u64i) -> !cir.ptr<!void>344// CHECK: %[[TYPED_PTR:.*]] = cir.cast bitcast %[[RAW_PTR]] : !cir.ptr<!void> -> !cir.ptr<!cir.array<!cir.array<!cir.double x 4> x 3>>345// CHECK: cir.store align(8) %[[TYPED_PTR]], %[[P_ADDR]] : !cir.ptr<!cir.array<!cir.array<!cir.double x 4> x 3>>, !cir.ptr<!cir.ptr<!cir.array<!cir.array<!cir.double x 4> x 3>>>346// CHECK: }347 348// LLVM: define{{.*}} void @_Z28t_new_multidim_constant_sizev349// LLVM: %[[P_ADDR:.*]] = alloca ptr, i64 1, align 8350// LLVM: %[[CALL:.*]] = call ptr @_Znam(i64 192)351// LLVM: store ptr %[[CALL]], ptr %[[P_ADDR]], align 8352 353// OGCG: define{{.*}} void @_Z28t_new_multidim_constant_sizev354// OGCG: %[[P_ADDR:.*]] = alloca ptr, align 8355// OGCG: %[[CALL:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 192)356// OGCG: store ptr %[[CALL]], ptr %[[P_ADDR]], align 8357