11// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir
22// RUN: FileCheck --input-file=%t.cir %s -check-prefix=CIR
3+ // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t-cir.ll
4+ // RUN: FileCheck --input-file=%t-cir.ll %s --check-prefix=LLVM
35// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o %t.ll
46// RUN: FileCheck --input-file=%t.ll %s --check-prefix=OGCG
57
@@ -27,6 +29,24 @@ int shouldNotGenBranchRet(int x) {
2729// CIR: cir.store [[MINUS]], [[RETVAL]] : !s32i, !cir.ptr<!s32i>
2830// CIR: cir.br ^bb1
2931
32+ // LLVM: define dso_local i32 @_Z21shouldNotGenBranchReti
33+ // LLVM: [[COND:%.*]] = load i32, ptr {{.*}}, align 4
34+ // LLVM: [[CMP:%.*]] = icmp sgt i32 [[COND]], 5
35+ // LLVM: br i1 [[CMP]], label %[[IFTHEN:.*]], label %[[IFEND:.*]]
36+ // LLVM: [[IFTHEN]]:
37+ // LLVM: br label %[[ERR:.*]]
38+ // LLVM: [[IFEND]]:
39+ // LLVM: br label %[[BB9:.*]]
40+ // LLVM: [[BB9]]:
41+ // LLVM: store i32 0, ptr %[[RETVAL:.*]], align 4
42+ // LLVM: br label %[[BBRET:.*]]
43+ // LLVM: [[BBRET]]:
44+ // LLVM: [[RET:%.*]] = load i32, ptr %[[RETVAL]], align 4
45+ // LLVM: ret i32 [[RET]]
46+ // LLVM: [[ERR]]:
47+ // LLVM: store i32 -1, ptr %[[RETVAL]], align 4
48+ // LLVM: br label %10
49+
3050// OGCG: define dso_local noundef i32 @_Z21shouldNotGenBranchReti
3151// OGCG: if.then:
3252// OGCG: br label %err
@@ -51,6 +71,17 @@ int shouldGenBranch(int x) {
5171// CIR: ^bb1:
5272// CIR: cir.label "err"
5373
74+ // LLVM: define dso_local i32 @_Z15shouldGenBranchi
75+ // LLVM: br i1 [[CMP:%.*]], label %[[IFTHEN:.*]], label %[[IFEND:.*]]
76+ // LLVM: [[IFTHEN]]:
77+ // LLVM: br label %[[ERR:.*]]
78+ // LLVM: [[IFEND]]:
79+ // LLVM: br label %[[BB9:.*]]
80+ // LLVM: [[BB9]]:
81+ // LLVM: br label %[[ERR]]
82+ // LLVM: [[ERR]]:
83+ // LLVM: ret i32 [[RET:%.*]]
84+
5485// OGCG: define dso_local noundef i32 @_Z15shouldGenBranchi
5586// OGCG: if.then:
5687// OGCG: br label %err
@@ -78,6 +109,15 @@ void severalLabelsInARow(int a) {
78109// CIR: ^bb[[#BLK3]]:
79110// CIR: cir.label "end2"
80111
112+ // LLVM: define dso_local void @_Z19severalLabelsInARowi
113+ // LLVM: br label %[[END1:.*]]
114+ // LLVM: [[UNRE:.*]]: ; No predecessors!
115+ // LLVM: br label %[[END2:.*]]
116+ // LLVM: [[END1]]:
117+ // LLVM: br label %[[END2]]
118+ // LLVM: [[END2]]:
119+ // LLVM: ret
120+
81121// OGCG: define dso_local void @_Z19severalLabelsInARowi
82122// OGCG: br label %end1
83123// OGCG: end1:
@@ -99,6 +139,13 @@ void severalGotosInARow(int a) {
99139// CIR: ^bb[[#BLK2:]]:
100140// CIR: cir.label "end"
101141
142+ // LLVM: define dso_local void @_Z18severalGotosInARowi
143+ // LLVM: br label %[[END:.*]]
144+ // LLVM: [[UNRE:.*]]: ; No predecessors!
145+ // LLVM: br label %[[END]]
146+ // LLVM: [[END]]:
147+ // LLVM: ret void
148+
102149// OGCG: define dso_local void @_Z18severalGotosInARowi(i32 noundef %a) #0 {
103150// OGCG: br label %end
104151// OGCG: end:
@@ -126,6 +173,14 @@ extern "C" void multiple_non_case(int v) {
126173// CIR: cir.call @action2()
127174// CIR: cir.break
128175
176+ // LLVM: define dso_local void @multiple_non_case
177+ // LLVM: [[SWDEFAULT:.*]]:
178+ // LLVM: call void @action1()
179+ // LLVM: br label %[[L2:.*]]
180+ // LLVM: [[L2]]:
181+ // LLVM: call void @action2()
182+ // LLVM: br label %[[BREAK:.*]]
183+
129184// OGCG: define dso_local void @multiple_non_case
130185// OGCG: sw.default:
131186// OGCG: call void @action1()
@@ -158,6 +213,26 @@ extern "C" void case_follow_label(int v) {
158213// CIR: cir.call @action2()
159214// CIR: cir.goto "label"
160215
216+ // LLVM: define dso_local void @case_follow_label
217+ // LLVM: switch i32 {{.*}}, label %[[SWDEFAULT:.*]] [
218+ // LLVM: i32 1, label %[[LABEL:.*]]
219+ // LLVM: i32 2, label %[[CASE2:.*]]
220+ // LLVM: ]
221+ // LLVM: [[LABEL]]:
222+ // LLVM: br label %[[CASE2]]
223+ // LLVM: [[CASE2]]:
224+ // LLVM: call void @action1()
225+ // LLVM: br label %[[BREAK:.*]]
226+ // LLVM: [[BREAK]]:
227+ // LLVM: br label %[[END:.*]]
228+ // LLVM: [[SWDEFAULT]]:
229+ // LLVM: call void @action2()
230+ // LLVM: br label %[[LABEL]]
231+ // LLVM: [[END]]:
232+ // LLVM: br label %[[RET:.*]]
233+ // LLVM: [[RET]]:
234+ // LLVM: ret void
235+
161236// OGCG: define dso_local void @case_follow_label
162237// OGCG: sw.bb:
163238// OGCG: br label %label
@@ -197,6 +272,26 @@ extern "C" void default_follow_label(int v) {
197272// CIR: cir.call @action2()
198273// CIR: cir.goto "label"
199274
275+ // LLVM: define dso_local void @default_follow_label
276+ // LLVM: [[CASE1:.*]]:
277+ // LLVM: br label %[[BB8:.*]]
278+ // LLVM: [[BB8]]:
279+ // LLVM: br label %[[CASE2:.*]]
280+ // LLVM: [[CASE2]]:
281+ // LLVM: call void @action1()
282+ // LLVM: br label %[[BREAK:.*]]
283+ // LLVM: [[LABEL:.*]]:
284+ // LLVM: br label %[[SWDEFAULT:.*]]
285+ // LLVM: [[SWDEFAULT]]:
286+ // LLVM: call void @action2()
287+ // LLVM: br label %[[BB9:.*]]
288+ // LLVM: [[BB9]]:
289+ // LLVM: br label %[[LABEL]]
290+ // LLVM: [[BREAK]]:
291+ // LLVM: br label %[[RET:.*]]
292+ // LLVM: [[RET]]:
293+ // LLVM: ret void
294+
200295// OGCG: define dso_local void @default_follow_label
201296// OGCG: sw.bb:
202297// OGCG: call void @action1()
0 commit comments