125 lines · cpp
1// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t-cir.ll2// RUN: FileCheck --input-file=%t-cir.ll %s3 4int a[10];5// CHECK: @a = global [10 x i32] zeroinitializer6 7int aa[10][5];8// CHECK: @aa = global [10 x [5 x i32]] zeroinitializer9 10int c[10] = {};11// CHECK: @c = global [10 x i32] zeroinitializer12 13int d[3] = {1, 2, 3};14// CHECK: @d = global [3 x i32] [i32 1, i32 2, i32 3]15 16int dd[3][2] = {{1, 2}, {3, 4}, {5, 6}};17// CHECK: @dd = global [3 x [2 x i32]] [18// CHECK: [2 x i32] [i32 1, i32 2], [2 x i32]19// CHECK: [i32 3, i32 4], [2 x i32] [i32 5, i32 6]]20 21int e[10] = {1, 2};22// CHECK: @e = global <{ i32, i32, [8 x i32] }> <{ i32 1, i32 2, [8 x i32] zeroinitializer }>23 24int f[5] = {1, 2};25// CHECK: @f = global [5 x i32] [i32 1, i32 2, i32 0, i32 0, i32 0]26 27extern int b[10];28// CHECK: @b = external global [10 x i32]29 30extern int bb[10][5];31// CHECK: @bb = external global [10 x [5 x i32]]32 33// This function is only here to make sure the external globals are emitted.34void reference_externs() {35 b;36 bb;37}38 39void func() {40 int arr[10];41 int e = arr[0];42 int e2 = arr[1];43}44// CHECK: define{{.*}} void @_Z4funcv()45// CHECK-NEXT: %[[ARR_ALLOCA:.*]] = alloca [10 x i32], i64 1, align 1646// CHECK-NEXT: %[[INIT:.*]] = alloca i32, i64 1, align 447// CHECK-NEXT: %[[INIT_2:.*]] = alloca i32, i64 1, align 448// CHECK-NEXT: %[[ARR_PTR:.*]] = getelementptr i32, ptr %[[ARR_ALLOCA]], i32 049// CHECK-NEXT: %[[ELE_PTR:.*]] = getelementptr i32, ptr %[[ARR_PTR]], i64 050// CHECK-NEXT: %[[TMP:.*]] = load i32, ptr %[[ELE_PTR]], align 1651// CHECK-NEXT: store i32 %[[TMP]], ptr %[[INIT]], align 452// CHECK-NEXT: %[[ARR_PTR:.*]] = getelementptr i32, ptr %[[ARR_ALLOCA]], i32 053// CHECK-NEXT: %[[ELE_PTR:.*]] = getelementptr i32, ptr %[[ARR_PTR]], i64 154// CHECK-NEXT: %[[TMP:.*]] = load i32, ptr %[[ELE_PTR]], align 455// CHECK-NEXT: store i32 %[[TMP]], ptr %[[INIT_2]], align 456 57void func2() {58 int arr[2] = {5};59}60 61// CHECK: define{{.*}} void @_Z5func2v()62// CHECK: %[[ARR:.*]] = alloca [2 x i32], i64 1, align 463// CHECK: store [2 x i32] [i32 5, i32 0], ptr %[[ARR]], align 464// CHECK: ret void65 66void func3() {67 int arr3[2] = {5, 6};68}69// CHECK: define{{.*}} void @_Z5func3v()70// CHECK: %[[ARR_ALLOCA:.*]] = alloca [2 x i32], i64 1, align 471// CHECK: store [2 x i32] [i32 5, i32 6], ptr %[[ARR_ALLOCA]], align 472 73void func4() {74 int arr[2][1] = {{5}, {6}};75 int e = arr[1][0];76}77// CHECK: define{{.*}} void @_Z5func4v()78// CHECK: %[[ARR_ALLOCA:.*]] = alloca [2 x [1 x i32]], i64 1, align 479// CHECK: %[[INIT:.*]] = alloca i32, i64 1, align 480// CHECK: store [2 x [1 x i32]] {{\[}}[1 x i32] [i32 5], [1 x i32] [i32 6]], ptr %[[ARR_ALLOCA]], align 481// CHECK: %[[ARR_PTR:.*]] = getelementptr [1 x i32], ptr %[[ARR_ALLOCA]], i32 082// CHECK: %[[ARR_1:.*]] = getelementptr [1 x i32], ptr %[[ARR_PTR]], i64 183// CHECK: %[[ARR_1_0:.*]] = getelementptr i32, ptr %[[ARR_1]], i32 084// CHECK: %[[ELE_PTR:.*]] = getelementptr i32, ptr %[[ARR_1_0]], i64 085// CHECK: %[[TMP:.*]] = load i32, ptr %[[ELE_PTR]], align 486// CHECK: store i32 %[[TMP]], ptr %[[INIT]], align 487 88void func5() {89 int arr[2][1] = {{5}};90}91// CHECK: define{{.*}} void @_Z5func5v()92// CHECK: %[[ARR:.*]] = alloca [2 x [1 x i32]], i64 1, align 493// CHECK: store [2 x [1 x i32]] {{\[}}[1 x i32] [i32 5], [1 x i32] zeroinitializer], ptr %[[ARR]], align 494// CHECK: ret void95 96void func6() {97 int x = 4;98 int arr[2] = { x, 5 };99}100// CHECK: define{{.*}} void @_Z5func6v()101// CHECK: %[[VAR:.*]] = alloca i32, i64 1, align 4102// CHECK: %[[ARR:.*]] = alloca [2 x i32], i64 1, align 4103// CHECK: store i32 4, ptr %[[VAR]], align 4104// CHECK: %[[ELE_0:.*]] = getelementptr i32, ptr %[[ARR]], i32 0105// CHECK: %[[TMP:.*]] = load i32, ptr %[[VAR]], align 4106// CHECK: store i32 %[[TMP]], ptr %[[ELE_0]], align 4107// CHECK: %[[ELE_1:.*]] = getelementptr i32, ptr %[[ELE_0]], i64 1108// CHECK: store i32 5, ptr %[[ELE_1]], align 4109 110void func7() {111 int* arr[1] = {};112}113// CHECK: define{{.*}} void @_Z5func7v()114// CHECK: %[[ARR:.*]] = alloca [1 x ptr], i64 1, align 8115// CHECK: store [1 x ptr] zeroinitializer, ptr %[[ARR]], align 8116// CHECK: ret void117 118void func8(int p[10]) {}119// CHECK: define{{.*}} void @_Z5func8Pi(ptr {{%.*}})120// CHECK-NEXT: alloca ptr, i64 1, align 8121 122void func9(int pp[10][5]) {}123// CHECK: define{{.*}} void @_Z5func9PA5_i(ptr {{%.*}})124// CHECK-NEXT: alloca ptr, i64 1, align 8125