Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / switch_ub.ll
blobe7b582653414fd359bb6e09f13ae26ed255096a1
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s
4 declare void @foo_01()
5 declare void @foo_02()
6 declare void @foo_03()
8 define i32 @test_01(ptr %p, i32 %x, i1 %cond) {
9 ; CHECK-LABEL: @test_01(
10 ; CHECK-NEXT:  entry:
11 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB:%.*]], label [[COMMON_RET:%.*]]
12 ; CHECK:       common.ret:
13 ; CHECK-NEXT:    [[COMMON_RET_OP:%.*]] = phi i32 [ [[R:%.*]], [[BB]] ], [ 0, [[ENTRY:%.*]] ]
14 ; CHECK-NEXT:    ret i32 [[COMMON_RET_OP]]
15 ; CHECK:       bb:
16 ; CHECK-NEXT:    [[R]] = load i32, ptr [[P:%.*]], align 4
17 ; CHECK-NEXT:    br label [[COMMON_RET]]
19 entry:
20   br i1 %cond, label %bb, label %pred
22 pred:
23   switch i32 %x, label %other_succ [i32 42, label %bb
24   i32 123456, label %bb
25   i32 -654321, label %bb]
27 bb:
28   %phi = phi ptr [null, %pred], [null, %pred], [null, %pred], [%p, %entry]
29   %r = load i32, ptr %phi
30   ret i32 %r
32 other_succ:
33   ret i32 0
36 define i32 @test_02(ptr %p, i32 %x, i1 %cond) {
37 ; CHECK-LABEL: @test_02(
38 ; CHECK-NEXT:  entry:
39 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB:%.*]], label [[COMMON_RET:%.*]]
40 ; CHECK:       common.ret:
41 ; CHECK-NEXT:    [[COMMON_RET_OP:%.*]] = phi i32 [ [[R:%.*]], [[BB]] ], [ 0, [[ENTRY:%.*]] ]
42 ; CHECK-NEXT:    ret i32 [[COMMON_RET_OP]]
43 ; CHECK:       bb:
44 ; CHECK-NEXT:    [[R]] = load i32, ptr [[P:%.*]], align 4
45 ; CHECK-NEXT:    br label [[COMMON_RET]]
47 entry:
48   br i1 %cond, label %bb, label %pred
50 pred:
51   switch i32 %x, label %bb [i32 42, label %other_succ
52   i32 123456, label %other_succ
53   i32 -654321, label %other_succ]
55 bb:
56   %phi = phi ptr [null, %pred], [%p, %entry]
57   %r = load i32, ptr %phi
58   ret i32 %r
60 other_succ:
61   ret i32 0
64 define i32 @test_03(ptr %p, i32 %x, i1 %cond) {
65 ; CHECK-LABEL: @test_03(
66 ; CHECK-NEXT:  entry:
67 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB:%.*]], label [[PRED:%.*]]
68 ; CHECK:       pred:
69 ; CHECK-NEXT:    switch i32 [[X:%.*]], label [[UNREACHABLE:%.*]] [
70 ; CHECK-NEXT:      i32 42, label [[COMMON_RET:%.*]]
71 ; CHECK-NEXT:      i32 123456, label [[COMMON_RET]]
72 ; CHECK-NEXT:      i32 -654321, label [[COMMON_RET]]
73 ; CHECK-NEXT:      i32 1, label [[DO_1:%.*]]
74 ; CHECK-NEXT:      i32 2, label [[DO_2:%.*]]
75 ; CHECK-NEXT:      i32 3, label [[DO_3:%.*]]
76 ; CHECK-NEXT:    ]
77 ; CHECK:       common.ret:
78 ; CHECK-NEXT:    [[COMMON_RET_OP:%.*]] = phi i32 [ [[R:%.*]], [[BB]] ], [ 1, [[DO_1]] ], [ 1, [[DO_2]] ], [ 1, [[DO_3]] ], [ 0, [[PRED]] ], [ 0, [[PRED]] ], [ 0, [[PRED]] ]
79 ; CHECK-NEXT:    ret i32 [[COMMON_RET_OP]]
80 ; CHECK:       unreachable:
81 ; CHECK-NEXT:    unreachable
82 ; CHECK:       bb:
83 ; CHECK-NEXT:    [[R]] = load i32, ptr [[P:%.*]], align 4
84 ; CHECK-NEXT:    br label [[COMMON_RET]]
85 ; CHECK:       do_1:
86 ; CHECK-NEXT:    call void @foo_01()
87 ; CHECK-NEXT:    br label [[COMMON_RET]]
88 ; CHECK:       do_2:
89 ; CHECK-NEXT:    call void @foo_02()
90 ; CHECK-NEXT:    br label [[COMMON_RET]]
91 ; CHECK:       do_3:
92 ; CHECK-NEXT:    call void @foo_03()
93 ; CHECK-NEXT:    br label [[COMMON_RET]]
95 entry:
96   br i1 %cond, label %bb, label %pred
98 pred:
99   switch i32 %x, label %bb [i32 42, label %other_succ
100   i32 123456, label %other_succ
101   i32 -654321, label %other_succ
102   i32 1, label %do_1
103   i32 2, label %do_2
104   i32 3, label %do_3]
107   %phi = phi ptr [null, %pred], [%p, %entry]
108   %r = load i32, ptr %phi
109   ret i32 %r
111 do_1:
112   call void @foo_01()
113   ret i32 1
115 do_2:
116   call void @foo_02()
117   ret i32 1
119 do_3:
120   call void @foo_03()
121   ret i32 1
123 other_succ:
124   ret i32 0
127 define i32 @test_04(ptr %p, i32 %x, i1 %cond) {
128 ; CHECK-LABEL: @test_04(
129 ; CHECK-NEXT:  entry:
130 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB:%.*]], label [[PRED:%.*]]
131 ; CHECK:       pred:
132 ; CHECK-NEXT:    switch i32 [[X:%.*]], label [[COMMON_RET:%.*]] [
133 ; CHECK-NEXT:      i32 3, label [[DO_3:%.*]]
134 ; CHECK-NEXT:      i32 2, label [[DO_2:%.*]]
135 ; CHECK-NEXT:      i32 1, label [[DO_1:%.*]]
136 ; CHECK-NEXT:    ]
137 ; CHECK:       common.ret:
138 ; CHECK-NEXT:    [[COMMON_RET_OP:%.*]] = phi i32 [ [[R:%.*]], [[BB]] ], [ 1, [[DO_1]] ], [ 1, [[DO_2]] ], [ 1, [[DO_3]] ], [ 0, [[PRED]] ]
139 ; CHECK-NEXT:    ret i32 [[COMMON_RET_OP]]
140 ; CHECK:       bb:
141 ; CHECK-NEXT:    [[R]] = load i32, ptr [[P:%.*]], align 4
142 ; CHECK-NEXT:    br label [[COMMON_RET]]
143 ; CHECK:       do_1:
144 ; CHECK-NEXT:    call void @foo_01()
145 ; CHECK-NEXT:    br label [[COMMON_RET]]
146 ; CHECK:       do_2:
147 ; CHECK-NEXT:    call void @foo_02()
148 ; CHECK-NEXT:    br label [[COMMON_RET]]
149 ; CHECK:       do_3:
150 ; CHECK-NEXT:    call void @foo_03()
151 ; CHECK-NEXT:    br label [[COMMON_RET]]
153 entry:
154   br i1 %cond, label %bb, label %pred
156 pred:
157   switch i32 %x, label %other_succ [i32 42, label %bb
158   i32 123456, label %bb
159   i32 -654321, label %bb
160   i32 1, label %do_1
161   i32 2, label %do_2
162   i32 3, label %do_3]
165   %phi = phi ptr [null, %pred], [null, %pred], [null, %pred], [%p, %entry]
166   %r = load i32, ptr %phi
167   ret i32 %r
169 do_1:
170   call void @foo_01()
171   ret i32 1
173 do_2:
174   call void @foo_02()
175   ret i32 1
177 do_3:
178   call void @foo_03()
179   ret i32 1
181 other_succ:
182   ret i32 0