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
2
5
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>
4
7
typedef struct {
5
8
int a ;
6
9
long b ;
@@ -9,78 +12,158 @@ typedef struct {
9
12
void buz (int x ) {
10
13
T arr [] = { {0 , x }, {0 , 0 } };
11
14
}
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
29
32
30
33
void foo () {
31
34
double bar [] = {9 ,8 ,7 };
32
35
}
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>>
37
40
38
41
void bar (int a , int b , int c ) {
39
42
int arr [] = {a ,b ,c };
40
43
}
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>
56
60
57
61
void zero_init (int x ) {
58
62
int arr [3 ] = {x };
59
63
}
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