Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / JumpThreading / unreachable-loops.ll
blob7b0dc4ad3ae7836ae9abd22fd885c6efbc9fd6e7
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes=jump-threading -S < %s | FileCheck %s
4 ; Check the unreachable loop won't cause infinite loop
5 ; in jump-threading when it tries to update the predecessors'
6 ; profile metadata from a phi node.
8 define void @unreachable_single_bb_loop() {
10 ; CHECK-LABEL: @unreachable_single_bb_loop(
11 ; CHECK-NEXT:  bb:
12 ; CHECK-NEXT:    [[TMP:%.*]] = call i32 @a()
13 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32 [[TMP]], 1
14 ; CHECK-NEXT:    br i1 [[TMP1]], label [[BB8:%.*]], label [[BB8]]
15 ; CHECK:       bb2:
16 ; CHECK-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP]], 1
17 ; CHECK-NEXT:    switch i1 [[TMP4]], label [[BB2:%.*]] [
18 ; CHECK-NEXT:      i1 false, label [[BB8]]
19 ; CHECK-NEXT:      i1 true, label [[BB8]]
20 ; CHECK-NEXT:    ]
21 ; CHECK:       bb8:
22 ; CHECK-NEXT:    ret void
24 bb:
25   %tmp = call i32 @a()
26   %tmp1 = icmp eq i32 %tmp, 1
27   br i1 %tmp1, label %bb5, label %bb8
29 ; unreachable single bb loop.
30 bb2:                                              ; preds = %bb2
31   %tmp4 = icmp ne i32 %tmp, 1
32   switch i1 %tmp4, label %bb2 [
33   i1 0, label %bb5
34   i1 1, label %bb8
35   ]
37 bb5:                                              ; preds = %bb2, %bb
38   %tmp6 = phi i1 [ %tmp1, %bb ], [ false, %bb2 ]
39   br i1 %tmp6, label %bb8, label %bb7, !prof !0
41 bb7:                                              ; preds = %bb5
42   br label %bb8
44 bb8:                                              ; preds = %bb8, %bb7, %bb5, %bb2
45   ret void
48 define void @unreachable_multi_bbs_loop() {
50 ; CHECK-LABEL: @unreachable_multi_bbs_loop(
51 ; CHECK-NEXT:  bb:
52 ; CHECK-NEXT:    [[TMP:%.*]] = call i32 @a()
53 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32 [[TMP]], 1
54 ; CHECK-NEXT:    br i1 [[TMP1]], label [[BB8:%.*]], label [[BB8]]
55 ; CHECK:       bb3:
56 ; CHECK-NEXT:    br label [[BB2:%.*]]
57 ; CHECK:       bb2:
58 ; CHECK-NEXT:    [[TMP4:%.*]] = icmp ne i32 [[TMP]], 1
59 ; CHECK-NEXT:    switch i1 [[TMP4]], label [[BB3:%.*]] [
60 ; CHECK-NEXT:      i1 false, label [[BB8]]
61 ; CHECK-NEXT:      i1 true, label [[BB8]]
62 ; CHECK-NEXT:    ]
63 ; CHECK:       bb8:
64 ; CHECK-NEXT:    ret void
66 bb:
67   %tmp = call i32 @a()
68   %tmp1 = icmp eq i32 %tmp, 1
69   br i1 %tmp1, label %bb5, label %bb8
71 ; unreachable two bbs loop.
72 bb3:                                              ; preds = %bb2
73   br label %bb2
75 bb2:                                              ; preds = %bb3
76   %tmp4 = icmp ne i32 %tmp, 1
77   switch i1 %tmp4, label %bb3 [
78   i1 0, label %bb5
79   i1 1, label %bb8
80   ]
82 bb5:                                              ; preds = %bb2, %bb
83   %tmp6 = phi i1 [ %tmp1, %bb ], [ false, %bb2 ]
84   br i1 %tmp6, label %bb8, label %bb7, !prof !0
86 bb7:                                              ; preds = %bb5
87   br label %bb8
89 bb8:                                              ; preds = %bb8, %bb7, %bb5, %bb2
90   ret void
92 declare i32 @a()
94 ; This gets into a state that could cause instruction simplify
95 ; to hang - an insertelement instruction has itself as an operand.
97 define void @PR48362() {
99 ; CHECK-LABEL: @PR48362(
100 ; CHECK-NEXT:  cleanup.cont1500:
101 ; CHECK-NEXT:    unreachable
102 ; CHECK:       if.end1733:
103 ; CHECK-NEXT:    [[I82:%.*]] = load i32, ptr undef, align 1
104 ; CHECK-NEXT:    [[TOBOOL1731_NOT:%.*]] = icmp eq i32 [[I82]], 0
105 ; CHECK-NEXT:    br label [[IF_END1733:%.*]]
107 cleanup1491:                                      ; preds = %for.body1140
108   switch i32 0, label %cleanup2343.loopexit4 [
109   i32 0, label %cleanup.cont1500
110   i32 128, label %lbl_555.loopexit
111   ]
113 cleanup.cont1500:                                 ; preds = %cleanup1491
114   unreachable
116 lbl_555.loopexit:                                 ; preds = %cleanup1491
117   br label %for.body1509
119 for.body1509:                                     ; preds = %for.inc2340, %lbl_555.loopexit
120   %l_580.sroa.0.0 = phi <4 x i32> [ <i32 1684658741, i32 1684658741, i32 1684658741, i32 1684658741>, %lbl_555.loopexit ], [ %l_580.sroa.0.2, %for.inc2340 ]
121   %p_55.addr.10 = phi i16 [ 0, %lbl_555.loopexit ], [ %p_55.addr.11, %for.inc2340 ]
122   %i82 = load i32, ptr undef, align 1
123   %tobool1731.not = icmp eq i32 %i82, 0
124   br i1 %tobool1731.not, label %if.end1733, label %if.then1732
126 if.then1732:                                      ; preds = %for.body1509
127   br label %cleanup2329
129 if.end1733:                                       ; preds = %for.body1509
130   %tobool1735.not = icmp eq i16 %p_55.addr.10, 0
131   br i1 %tobool1735.not, label %if.then1736, label %if.else1904
133 if.then1736:                                      ; preds = %if.end1733
134   br label %cleanup2329
136 if.else1904:                                      ; preds = %if.end1733
137   br label %for.body1911
139 for.body1911:                                     ; preds = %if.else1904
140   %l_580.sroa.0.4.vec.extract683 = extractelement <4 x i32> %l_580.sroa.0.0, i32 2
141   %xor2107 = xor i32 undef, %l_580.sroa.0.4.vec.extract683
142   br label %land.end2173
144 land.end2173:                                     ; preds = %for.body1911
145   br i1 undef, label %if.end2178, label %cleanup2297
147 if.end2178:                                       ; preds = %land.end2173
148   %l_580.sroa.0.2.vec.insert = insertelement <4 x i32> %l_580.sroa.0.0, i32 undef, i32 1
149   br label %cleanup2297
151 cleanup2297:                                      ; preds = %if.end2178, %land.end2173
152   %l_580.sroa.0.1 = phi <4 x i32> [ %l_580.sroa.0.2.vec.insert, %if.end2178 ], [ %l_580.sroa.0.0, %land.end2173 ]
153   br label %cleanup2329
155 cleanup2329:                                      ; preds = %cleanup2297, %if.then1736, %if.then1732
156   %l_580.sroa.0.2 = phi <4 x i32> [ %l_580.sroa.0.0, %if.then1736 ], [ %l_580.sroa.0.1, %cleanup2297 ], [ %l_580.sroa.0.0, %if.then1732 ]
157   %cleanup.dest.slot.11 = phi i32 [ 0, %if.then1736 ], [ undef, %cleanup2297 ], [ 129, %if.then1732 ]
158   %p_55.addr.11 = phi i16 [ %p_55.addr.10, %if.then1736 ], [ undef, %cleanup2297 ], [ %p_55.addr.10, %if.then1732 ]
159   switch i32 %cleanup.dest.slot.11, label %cleanup2343.loopexit [
160   i32 0, label %cleanup.cont2339
161   i32 129, label %crit_edge114
162   ]
164 cleanup.cont2339:                                 ; preds = %cleanup2329
165   br label %for.inc2340
167 for.inc2340:                                      ; preds = %cleanup.cont2339
168   br i1 undef, label %for.body1509, label %crit_edge115
170 crit_edge114:                                     ; preds = %cleanup2329
171   unreachable
173 crit_edge115:                                     ; preds = %for.inc2340
174   unreachable
176 cleanup2343.loopexit:                             ; preds = %cleanup2329
177   unreachable
179 cleanup2343.loopexit4:                            ; preds = %cleanup1491
180   unreachable
183 !0 = !{!"branch_weights", i32 2146410443, i32 1073205}