[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / JumpThreading / unreachable-loops.ll
bloba0f1c21272095abf58df6733049d8e857d7d9d65
1 ; RUN: opt -jump-threading -S < %s | FileCheck %s
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() {
9 ; CHECK-LABEL: @unreachable_single_bb_loop(
10 bb:
11   %tmp = call i32 @a()
12   %tmp1 = icmp eq i32 %tmp, 1
13   br i1 %tmp1, label %bb5, label %bb8
15 ; unreachable single bb loop.
16 bb2:                                              ; preds = %bb2
17   %tmp4 = icmp ne i32 %tmp, 1
18   switch i1 %tmp4, label %bb2 [
19   i1 0, label %bb5
20   i1 1, label %bb8
21   ]
23 bb5:                                              ; preds = %bb2, %bb
24   %tmp6 = phi i1 [ %tmp1, %bb ], [ false, %bb2 ]
25   br i1 %tmp6, label %bb8, label %bb7, !prof !0
27 bb7:                                              ; preds = %bb5
28   br label %bb8
30 bb8:                                              ; preds = %bb8, %bb7, %bb5, %bb2
31   ret void
34 define void @unreachable_multi_bbs_loop() {
35 ; CHECK-LABEL: @unreachable_multi_bbs_loop(
36 bb:
37   %tmp = call i32 @a()
38   %tmp1 = icmp eq i32 %tmp, 1
39   br i1 %tmp1, label %bb5, label %bb8
41 ; unreachable two bbs loop.
42 bb3:                                              ; preds = %bb2
43   br label %bb2
45 bb2:                                              ; preds = %bb3
46   %tmp4 = icmp ne i32 %tmp, 1
47   switch i1 %tmp4, label %bb3 [
48   i1 0, label %bb5
49   i1 1, label %bb8
50   ]
52 bb5:                                              ; preds = %bb2, %bb
53   %tmp6 = phi i1 [ %tmp1, %bb ], [ false, %bb2 ]
54   br i1 %tmp6, label %bb8, label %bb7, !prof !0
56 bb7:                                              ; preds = %bb5
57   br label %bb8
59 bb8:                                              ; preds = %bb8, %bb7, %bb5, %bb2
60   ret void
62 declare i32 @a()
64 ; This gets into a state that could cause instruction simplify
65 ; to hang - an insertelement instruction has itself as an operand.
67 define void @PR48362() {
68 ; CHECK-LABEL: @PR48362(
69 cleanup1491:                                      ; preds = %for.body1140
70   switch i32 0, label %cleanup2343.loopexit4 [
71   i32 0, label %cleanup.cont1500
72   i32 128, label %lbl_555.loopexit
73   ]
75 cleanup.cont1500:                                 ; preds = %cleanup1491
76   unreachable
78 lbl_555.loopexit:                                 ; preds = %cleanup1491
79   br label %for.body1509
81 for.body1509:                                     ; preds = %for.inc2340, %lbl_555.loopexit
82   %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 ]
83   %p_55.addr.10 = phi i16 [ 0, %lbl_555.loopexit ], [ %p_55.addr.11, %for.inc2340 ]
84   %i82 = load i32, i32* undef, align 1
85   %tobool1731.not = icmp eq i32 %i82, 0
86   br i1 %tobool1731.not, label %if.end1733, label %if.then1732
88 if.then1732:                                      ; preds = %for.body1509
89   br label %cleanup2329
91 if.end1733:                                       ; preds = %for.body1509
92   %tobool1735.not = icmp eq i16 %p_55.addr.10, 0
93   br i1 %tobool1735.not, label %if.then1736, label %if.else1904
95 if.then1736:                                      ; preds = %if.end1733
96   br label %cleanup2329
98 if.else1904:                                      ; preds = %if.end1733
99   br label %for.body1911
101 for.body1911:                                     ; preds = %if.else1904
102   %l_580.sroa.0.4.vec.extract683 = extractelement <4 x i32> %l_580.sroa.0.0, i32 2
103   %xor2107 = xor i32 undef, %l_580.sroa.0.4.vec.extract683
104   br label %land.end2173
106 land.end2173:                                     ; preds = %for.body1911
107   br i1 undef, label %if.end2178, label %cleanup2297
109 if.end2178:                                       ; preds = %land.end2173
110   %l_580.sroa.0.2.vec.insert = insertelement <4 x i32> %l_580.sroa.0.0, i32 undef, i32 1
111   br label %cleanup2297
113 cleanup2297:                                      ; preds = %if.end2178, %land.end2173
114   %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 ]
115   br label %cleanup2329
117 cleanup2329:                                      ; preds = %cleanup2297, %if.then1736, %if.then1732
118   %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 ]
119   %cleanup.dest.slot.11 = phi i32 [ 0, %if.then1736 ], [ undef, %cleanup2297 ], [ 129, %if.then1732 ]
120   %p_55.addr.11 = phi i16 [ %p_55.addr.10, %if.then1736 ], [ undef, %cleanup2297 ], [ %p_55.addr.10, %if.then1732 ]
121   switch i32 %cleanup.dest.slot.11, label %cleanup2343.loopexit [
122   i32 0, label %cleanup.cont2339
123   i32 129, label %crit_edge114
124   ]
126 cleanup.cont2339:                                 ; preds = %cleanup2329
127   br label %for.inc2340
129 for.inc2340:                                      ; preds = %cleanup.cont2339
130   br i1 undef, label %for.body1509, label %crit_edge115
132 crit_edge114:                                     ; preds = %cleanup2329
133   unreachable
135 crit_edge115:                                     ; preds = %for.inc2340
136   unreachable
138 cleanup2343.loopexit:                             ; preds = %cleanup2329
139   unreachable
141 cleanup2343.loopexit4:                            ; preds = %cleanup1491
142   unreachable
145 !0 = !{!"branch_weights", i32 2146410443, i32 1073205}