brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.4 KiB · 2efad10 Raw
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