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