1- // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-cir %s -o - | FileCheck %s
1+ // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir
2+ // RUN: FileCheck --check-prefix=CIR --input-file=%t.cir %s
3+ // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm -fno-clangir-call-conv-lowering %s -o %t.ll
4+ // RUN: FileCheck --check-prefix=LLVM --input-file=%t.ll %s
25
3- // CHECK -DAG: cir.global "private" constant cir_private @__const.foo.bar = #cir.const_array<[#cir.fp<9.000000e+00> : !cir.double, #cir.fp<8.000000e+00> : !cir.double, #cir.fp<7.000000e+00> : !cir.double]> : !cir.array<!cir.double x 3>
6+ // CIR -DAG: cir.global "private" constant cir_private @__const.foo.bar = #cir.const_array<[#cir.fp<9.000000e+00> : !cir.double, #cir.fp<8.000000e+00> : !cir.double, #cir.fp<7.000000e+00> : !cir.double]> : !cir.array<!cir.double x 3>
47typedef struct {
58 int a ;
69 long b ;
@@ -9,78 +12,158 @@ typedef struct {
912void buz (int x ) {
1013 T arr [] = { {0 , x }, {0 , 0 } };
1114}
12- // CHECK : cir.func @buz
13- // CHECK -NEXT: [[X_ALLOCA:%.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
14- // CHECK -NEXT: [[ARR:%.*]] = cir.alloca !cir.array<!ty_T x 2>, !cir.ptr<!cir.array<!ty_T x 2>>, ["arr", init] {alignment = 16 : i64}
15- // CHECK -NEXT: cir.store %arg0, [[X_ALLOCA]] : !s32i, !cir.ptr<!s32i>
16- // CHECK -NEXT: [[ARR_INIT:%.*]] = cir.const #cir.zero : !cir.array<!ty_T x 2>
17- // CHECK -NEXT: cir.store [[ARR_INIT]], [[ARR]] : !cir.array<!ty_T x 2>, !cir.ptr<!cir.array<!ty_T x 2>>
18- // CHECK -NEXT: [[FI_EL:%.*]] = cir.cast(array_to_ptrdecay, [[ARR]] : !cir.ptr<!cir.array<!ty_T x 2>>), !cir.ptr<!ty_T>
19- // CHECK -NEXT: [[A_STORAGE0:%.*]] = cir.get_member [[FI_EL]][0] {name = "a"} : !cir.ptr<!ty_T> -> !cir.ptr<!s32i>
20- // CHECK -NEXT: [[B_STORAGE0:%.*]] = cir.get_member [[FI_EL]][1] {name = "b"} : !cir.ptr<!ty_T> -> !cir.ptr<!s64i>
21- // CHECK -NEXT: [[X_VAL:%.*]] = cir.load [[X_ALLOCA]] : !cir.ptr<!s32i>, !s32i
22- // CHECK -NEXT: [[X_CASTED:%.*]] = cir.cast(integral, [[X_VAL]] : !s32i), !s64i
23- // CHECK -NEXT: cir.store [[X_CASTED]], [[B_STORAGE0]] : !s64i, !cir.ptr<!s64i>
24- // CHECK -NEXT: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
25- // CHECK -NEXT: [[SE_EL:%.*]] = cir.ptr_stride([[FI_EL]] : !cir.ptr<!ty_T>, [[ONE]] : !s64i), !cir.ptr<!ty_T>
26- // CHECK -NEXT: [[A_STORAGE1:%.*]] = cir.get_member [[SE_EL]][0] {name = "a"} : !cir.ptr<!ty_T> -> !cir.ptr<!s32i>
27- // CHECK -NEXT: [[B_STORAGE1:%.*]] = cir.get_member [[SE_EL]][1] {name = "b"} : !cir.ptr<!ty_T> -> !cir.ptr<!s64i>
28- // CHECK -NEXT: cir.return
15+ // CIR : cir.func @buz
16+ // CIR -NEXT: [[X_ALLOCA:%.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
17+ // CIR -NEXT: [[ARR:%.*]] = cir.alloca !cir.array<!ty_T x 2>, !cir.ptr<!cir.array<!ty_T x 2>>, ["arr", init] {alignment = 16 : i64}
18+ // CIR -NEXT: cir.store %arg0, [[X_ALLOCA]] : !s32i, !cir.ptr<!s32i>
19+ // CIR -NEXT: [[ARR_INIT:%.*]] = cir.const #cir.zero : !cir.array<!ty_T x 2>
20+ // CIR -NEXT: cir.store [[ARR_INIT]], [[ARR]] : !cir.array<!ty_T x 2>, !cir.ptr<!cir.array<!ty_T x 2>>
21+ // CIR -NEXT: [[FI_EL:%.*]] = cir.cast(array_to_ptrdecay, [[ARR]] : !cir.ptr<!cir.array<!ty_T x 2>>), !cir.ptr<!ty_T>
22+ // CIR -NEXT: [[A_STORAGE0:%.*]] = cir.get_member [[FI_EL]][0] {name = "a"} : !cir.ptr<!ty_T> -> !cir.ptr<!s32i>
23+ // CIR -NEXT: [[B_STORAGE0:%.*]] = cir.get_member [[FI_EL]][1] {name = "b"} : !cir.ptr<!ty_T> -> !cir.ptr<!s64i>
24+ // CIR -NEXT: [[X_VAL:%.*]] = cir.load [[X_ALLOCA]] : !cir.ptr<!s32i>, !s32i
25+ // CIR -NEXT: [[X_CASTED:%.*]] = cir.cast(integral, [[X_VAL]] : !s32i), !s64i
26+ // CIR -NEXT: cir.store [[X_CASTED]], [[B_STORAGE0]] : !s64i, !cir.ptr<!s64i>
27+ // CIR -NEXT: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
28+ // CIR -NEXT: [[SE_EL:%.*]] = cir.ptr_stride([[FI_EL]] : !cir.ptr<!ty_T>, [[ONE]] : !s64i), !cir.ptr<!ty_T>
29+ // CIR -NEXT: [[A_STORAGE1:%.*]] = cir.get_member [[SE_EL]][0] {name = "a"} : !cir.ptr<!ty_T> -> !cir.ptr<!s32i>
30+ // CIR -NEXT: [[B_STORAGE1:%.*]] = cir.get_member [[SE_EL]][1] {name = "b"} : !cir.ptr<!ty_T> -> !cir.ptr<!s64i>
31+ // CIR -NEXT: cir.return
2932
3033void foo () {
3134 double bar [] = {9 ,8 ,7 };
3235}
33- // CHECK -LABEL: @foo
34- // CHECK : %[[DST:.*]] = cir.alloca !cir.array<!cir.double x 3>, !cir.ptr<!cir.array<!cir.double x 3>>, ["bar"]
35- // CHECK : %[[SRC:.*]] = cir.get_global @__const.foo.bar : !cir.ptr<!cir.array<!cir.double x 3>>
36- // CHECK : cir.copy %[[SRC]] to %[[DST]] : !cir.ptr<!cir.array<!cir.double x 3>>
36+ // CIR -LABEL: @foo
37+ // CIR : %[[DST:.*]] = cir.alloca !cir.array<!cir.double x 3>, !cir.ptr<!cir.array<!cir.double x 3>>, ["bar"]
38+ // CIR : %[[SRC:.*]] = cir.get_global @__const.foo.bar : !cir.ptr<!cir.array<!cir.double x 3>>
39+ // CIR : cir.copy %[[SRC]] to %[[DST]] : !cir.ptr<!cir.array<!cir.double x 3>>
3740
3841void bar (int a , int b , int c ) {
3942 int arr [] = {a ,b ,c };
4043}
41- // CHECK: cir.func @bar
42- // CHECK: [[ARR:%.*]] = cir.alloca !cir.array<!s32i x 3>, !cir.ptr<!cir.array<!s32i x 3>>, ["arr", init] {alignment = 4 : i64}
43- // CHECK-NEXT: cir.store %arg0, [[A:%.*]] : !s32i, !cir.ptr<!s32i>
44- // CHECK-NEXT: cir.store %arg1, [[B:%.*]] : !s32i, !cir.ptr<!s32i>
45- // CHECK-NEXT: cir.store %arg2, [[C:%.*]] : !s32i, !cir.ptr<!s32i>
46- // CHECK-NEXT: [[FI_EL:%.*]] = cir.cast(array_to_ptrdecay, [[ARR]] : !cir.ptr<!cir.array<!s32i x 3>>), !cir.ptr<!s32i>
47- // CHECK-NEXT: [[LOAD_A:%.*]] = cir.load [[A]] : !cir.ptr<!s32i>, !s32i
48- // CHECK-NEXT: cir.store [[LOAD_A]], [[FI_EL]] : !s32i, !cir.ptr<!s32i>
49- // CHECK-NEXT: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
50- // CHECK-NEXT: [[SE_EL:%.*]] = cir.ptr_stride(%4 : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
51- // CHECK-NEXT: [[LOAD_B:%.*]] = cir.load [[B]] : !cir.ptr<!s32i>, !s32i
52- // CHECK-NEXT: cir.store [[LOAD_B]], [[SE_EL]] : !s32i, !cir.ptr<!s32i>
53- // CHECK-NEXT: [[TH_EL:%.*]] = cir.ptr_stride(%7 : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
54- // CHECK-NEXT: [[LOAD_C:%.*]] = cir.load [[C]] : !cir.ptr<!s32i>, !s32i
55- // CHECK-NEXT: cir.store [[LOAD_C]], [[TH_EL]] : !s32i, !cir.ptr<!s32i>
44+ // CIR: cir.func @bar
45+ // CIR: [[ARR:%.*]] = cir.alloca !cir.array<!s32i x 3>, !cir.ptr<!cir.array<!s32i x 3>>, ["arr", init] {alignment = 4 : i64}
46+ // CIR-NEXT: cir.store %arg0, [[A:%.*]] : !s32i, !cir.ptr<!s32i>
47+ // CIR-NEXT: cir.store %arg1, [[B:%.*]] : !s32i, !cir.ptr<!s32i>
48+ // CIR-NEXT: cir.store %arg2, [[C:%.*]] : !s32i, !cir.ptr<!s32i>
49+ // CIR-NEXT: [[FI_EL:%.*]] = cir.cast(array_to_ptrdecay, [[ARR]] : !cir.ptr<!cir.array<!s32i x 3>>), !cir.ptr<!s32i>
50+ // CIR-NEXT: [[LOAD_A:%.*]] = cir.load [[A]] : !cir.ptr<!s32i>, !s32i
51+ // CIR-NEXT: cir.store [[LOAD_A]], [[FI_EL]] : !s32i, !cir.ptr<!s32i>
52+ // CIR-NEXT: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
53+ // CIR-NEXT: [[SE_EL:%.*]] = cir.ptr_stride(%4 : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
54+ // CIR-NEXT: [[LOAD_B:%.*]] = cir.load [[B]] : !cir.ptr<!s32i>, !s32i
55+ // CIR-NEXT: cir.store [[LOAD_B]], [[SE_EL]] : !s32i, !cir.ptr<!s32i>
56+ // CIR-NEXT: [[TWO:%.*]] = cir.const #cir.int<2> : !s64i
57+ // CIR-NEXT: [[TH_EL:%.*]] = cir.ptr_stride(%4 : !cir.ptr<!s32i>, [[TWO]] : !s64i), !cir.ptr<!s32i>
58+ // CIR-NEXT: [[LOAD_C:%.*]] = cir.load [[C]] : !cir.ptr<!s32i>, !s32i
59+ // CIR-NEXT: cir.store [[LOAD_C]], [[TH_EL]] : !s32i, !cir.ptr<!s32i>
5660
5761void zero_init (int x ) {
5862 int arr [3 ] = {x };
5963}
60- // CHECK: cir.func @zero_init
61- // CHECK: [[VAR_ALLOC:%.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
62- // CHECK: %1 = cir.alloca !cir.array<!s32i x 3>, !cir.ptr<!cir.array<!s32i x 3>>, ["arr", init] {alignment = 4 : i64}
63- // CHECK: [[TEMP:%.*]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["arrayinit.temp", init] {alignment = 8 : i64}
64- // CHECK: cir.store %arg0, [[VAR_ALLOC]] : !s32i, !cir.ptr<!s32i>
65- // CHECK: [[BEGIN:%.*]] = cir.cast(array_to_ptrdecay, %1 : !cir.ptr<!cir.array<!s32i x 3>>), !cir.ptr<!s32i>
66- // CHECK: [[VAR:%.*]] = cir.load [[VAR_ALLOC]] : !cir.ptr<!s32i>, !s32i
67- // CHECK: cir.store [[VAR]], [[BEGIN]] : !s32i, !cir.ptr<!s32i>
68- // CHECK: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
69- // CHECK: [[ZERO_INIT_START:%.*]] = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
70- // CHECK: cir.store [[ZERO_INIT_START]], [[TEMP]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
71- // CHECK: [[SIZE:%.*]] = cir.const #cir.int<3> : !s64i
72- // CHECK: [[END:%.*]] = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[SIZE]] : !s64i), !cir.ptr<!s32i>
73- // CHECK: cir.do {
74- // CHECK: [[CUR:%.*]] = cir.load [[TEMP]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
75- // CHECK: [[FILLER:%.*]] = cir.const #cir.int<0> : !s32i
76- // CHECK: cir.store [[FILLER]], [[CUR]] : !s32i, !cir.ptr<!s32i>
77- // CHECK: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
78- // CHECK: [[NEXT:%.*]] = cir.ptr_stride([[CUR]] : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
79- // CHECK: cir.store [[NEXT]], [[TEMP]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
80- // CHECK: cir.yield
81- // CHECK: } while {
82- // CHECK: [[CUR:%.*]] = cir.load [[TEMP]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
83- // CHECK: [[CMP:%.*]] = cir.cmp(ne, [[CUR]], [[END]]) : !cir.ptr<!s32i>, !cir.bool
84- // CHECK: cir.condition([[CMP]])
85- // CHECK: }
86- // CHECK: cir.return
64+ // CIR: cir.func @zero_init
65+ // CIR: [[VAR_ALLOC:%.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
66+ // CIR: %1 = cir.alloca !cir.array<!s32i x 3>, !cir.ptr<!cir.array<!s32i x 3>>, ["arr", init] {alignment = 4 : i64}
67+ // CIR: [[TEMP:%.*]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["arrayinit.temp", init] {alignment = 8 : i64}
68+ // CIR: cir.store %arg0, [[VAR_ALLOC]] : !s32i, !cir.ptr<!s32i>
69+ // CIR: [[BEGIN:%.*]] = cir.cast(array_to_ptrdecay, %1 : !cir.ptr<!cir.array<!s32i x 3>>), !cir.ptr<!s32i>
70+ // CIR: [[VAR:%.*]] = cir.load [[VAR_ALLOC]] : !cir.ptr<!s32i>, !s32i
71+ // CIR: cir.store [[VAR]], [[BEGIN]] : !s32i, !cir.ptr<!s32i>
72+ // CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
73+ // CIR: [[ZERO_INIT_START:%.*]] = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
74+ // CIR: cir.store [[ZERO_INIT_START]], [[TEMP]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
75+ // CIR: [[SIZE:%.*]] = cir.const #cir.int<3> : !s64i
76+ // CIR: [[END:%.*]] = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[SIZE]] : !s64i), !cir.ptr<!s32i>
77+ // CIR: cir.do {
78+ // CIR: [[CUR:%.*]] = cir.load [[TEMP]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
79+ // CIR: [[FILLER:%.*]] = cir.const #cir.int<0> : !s32i
80+ // CIR: cir.store [[FILLER]], [[CUR]] : !s32i, !cir.ptr<!s32i>
81+ // CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
82+ // CIR: [[NEXT:%.*]] = cir.ptr_stride([[CUR]] : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
83+ // CIR: cir.store [[NEXT]], [[TEMP]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
84+ // CIR: cir.yield
85+ // CIR: } while {
86+ // CIR: [[CUR:%.*]] = cir.load [[TEMP]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
87+ // CIR: [[CMP:%.*]] = cir.cmp(ne, [[CUR]], [[END]]) : !cir.ptr<!s32i>, !cir.bool
88+ // CIR: cir.condition([[CMP]])
89+ // CIR: }
90+ // CIR: cir.return
91+
92+ void aggr_init () {
93+ int g = 5 ;
94+ int g_arr [5 ] = {1 , 2 , 3 , g };
95+ }
96+ // CIR-LABEL: cir.func no_proto @aggr_init
97+ // CIR: [[VAR_ALLOC:%.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["g", init] {alignment = 4 : i64}
98+ // CIR: %1 = cir.alloca !cir.array<!s32i x 5>, !cir.ptr<!cir.array<!s32i x 5>>, ["g_arr", init] {alignment = 16 : i64}
99+ // CIR: [[TEMP:%.*]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["arrayinit.temp", init] {alignment = 8 : i64}
100+ // CIR: %3 = cir.const #cir.int<5> : !s32i
101+ // CIR: cir.store %3, [[VAR_ALLOC]] : !s32i, !cir.ptr<!s32i>
102+ // CIR: [[BEGIN:%.*]] = cir.cast(array_to_ptrdecay, %1 : !cir.ptr<!cir.array<!s32i x 5>>), !cir.ptr<!s32i>
103+ // CIR: %5 = cir.const #cir.int<1> : !s32i
104+ // CIR: cir.store %5, [[BEGIN]] : !s32i, !cir.ptr<!s32i>
105+ // CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
106+ // CIR: %7 = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
107+ // CIR: %8 = cir.const #cir.int<2> : !s32i
108+ // CIR: cir.store %8, %7 : !s32i, !cir.ptr<!s32i>
109+ // CIR: [[TWO:%.*]] = cir.const #cir.int<2> : !s64i
110+ // CIR: %10 = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[TWO]] : !s64i), !cir.ptr<!s32i>
111+ // CIR: %11 = cir.const #cir.int<3> : !s32i
112+ // CIR: cir.store %11, %10 : !s32i, !cir.ptr<!s32i>
113+ // CIR: [[THREE:%.*]] = cir.const #cir.int<3> : !s64i
114+ // CIR: %13 = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[THREE]] : !s64i), !cir.ptr<!s32i>
115+ // CIR: [[VAR:%.*]] = cir.load [[VAR_ALLOC]] : !cir.ptr<!s32i>, !s32i
116+ // CIR: cir.store [[VAR]], %13 : !s32i, !cir.ptr<!s32i>
117+ // CIR: [[ONE_VAR:%.*]] = cir.const #cir.int<1> : !s64i
118+ // CIR: %16 = cir.ptr_stride(%13 : !cir.ptr<!s32i>, [[ONE_VAR]] : !s64i), !cir.ptr<!s32i>
119+ // CIR: cir.store %16, [[TEMP]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
120+ // CIR: [[SIZE:%.*]] = cir.const #cir.int<5> : !s64i
121+ // CIR: [[END:%.*]] = cir.ptr_stride([[BEGIN]] : !cir.ptr<!s32i>, [[SIZE]] : !s64i), !cir.ptr<!s32i>
122+ // CIR: cir.do {
123+ // CIR: [[CUR:%.*]] = cir.load [[TEMP]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
124+ // CIR: [[FILLER:%.*]] = cir.const #cir.int<0> : !s32i
125+ // CIR: cir.store [[FILLER]], [[CUR]] : !s32i, !cir.ptr<!s32i>
126+ // CIR: [[ONE:%.*]] = cir.const #cir.int<1> : !s64i
127+ // CIR: [[NEXT:%.*]] = cir.ptr_stride([[CUR]] : !cir.ptr<!s32i>, [[ONE]] : !s64i), !cir.ptr<!s32i>
128+ // CIR: cir.store [[NEXT]], [[TEMP]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
129+ // CIR: cir.yield
130+ // CIR: } while {
131+ // CIR: [[CUR:%.*]] = cir.load [[TEMP]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
132+ // CIR: [[CMP:%.*]] = cir.cmp(ne, [[CUR]], [[END]]) : !cir.ptr<!s32i>, !cir.bool
133+ // CIR: cir.condition([[CMP]])
134+ // CIR: }
135+ // CIR: cir.return
136+ //
137+ // LLVM-LABEL: @aggr_init
138+ // LLVM: [[VAR_ALLOC:%.*]] = alloca i32, i64 1, align 4
139+ // LLVM: %2 = alloca [5 x i32], i64 1, align 16
140+ // LLVM: [[TEMP:%.*]] = alloca ptr, i64 1, align 8
141+ // LLVM: store i32 5, ptr [[VAR_ALLOC]], align 4
142+ // LLVM: [[BEGIN:%.*]] = getelementptr i32, ptr %2, i32 0
143+ // LLVM: store i32 1, ptr [[BEGIN]], align 4
144+ // LLVM: [[ONE:%.*]] = getelementptr i32, ptr [[BEGIN]], i64 1
145+ // LLVM: store i32 2, ptr [[ONE]], align 4
146+ // LLVM: [[TWO:%.*]] = getelementptr i32, ptr [[BEGIN]], i64 2
147+ // LLVM: store i32 3, ptr [[TWO]], align 4
148+ // LLVM: [[THREE:%.*]] = getelementptr i32, ptr [[BEGIN]], i64 3
149+ // LLVM: [[VAR:%.*]] = load i32, ptr [[VAR_ALLOC]], align 4
150+ // LLVM: store i32 [[VAR]], ptr [[THREE]], align 4
151+ // LLVM: %9 = getelementptr i32, ptr [[THREE]], i64 1
152+ // LLVM: store ptr %9, ptr [[TEMP]], align 8
153+ // LLVM: [[END:%.*]] = getelementptr i32, ptr [[BEGIN]], i64 5
154+ // LLVM: br label %14
155+ //
156+ // LLVM: 11: ; preds = %14
157+ // LLVM: [[CUR:%.*]] = load ptr, ptr [[TEMP]], align 8
158+ // LLVM: [[CMP:%.*]] = icmp ne ptr [[CUR]], [[END]]
159+ // LLVM: br i1 [[CMP]], label %14, label %17
160+ //
161+ // LLVM: 14: ; preds = %11, %0
162+ // LLVM: [[CUR:%.*]] = load ptr, ptr [[TEMP]], align 8
163+ // LLVM: store i32 0, ptr [[CUR]], align 4
164+ // LLVM: [[NEXT:%.*]] = getelementptr i32, ptr [[CUR]], i64 1
165+ // LLVM: store ptr [[NEXT]], ptr [[TEMP]], align 8
166+ // LLVM: br label %11
167+ //
168+ // LLVM: 17: ; preds = %11
169+ // LLVM: ret void
0 commit comments