[RISCV] Change func to funct in RISCVInstrInfoXqci.td. NFC (#119669)
[llvm-project.git] / llvm / test / Transforms / StructurizeCFG / workarounds / needs-fr-ule.ll
blob912beed6b2eed34bb22513e922a396dfee432d48
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -fix-irreducible -unify-loop-exits -structurizecfg -S | FileCheck %s
3 define void @irreducible_mountain_bug(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5, i1 %Pred6, i1 %Pred7, i1 %Pred8, i1 %Pred9, i1 %Pred10, i1 %Pred11, i1 %Pred12, i1 %Pred13) {
4 ; CHECK-LABEL: @irreducible_mountain_bug(
5 ; CHECK-NEXT:  entry:
6 ; CHECK-NEXT:    [[PRED0_INV:%.*]] = xor i1 [[PRED0:%.*]], true
7 ; CHECK-NEXT:    [[PRED1_INV:%.*]] = xor i1 [[PRED1:%.*]], true
8 ; CHECK-NEXT:    [[PRED2_INV:%.*]] = xor i1 [[PRED2:%.*]], true
9 ; CHECK-NEXT:    [[PRED3_INV:%.*]] = xor i1 [[PRED3:%.*]], true
10 ; CHECK-NEXT:    [[PRED5_INV:%.*]] = xor i1 [[PRED5:%.*]], true
11 ; CHECK-NEXT:    [[PRED10_INV:%.*]] = xor i1 [[PRED10:%.*]], true
12 ; CHECK-NEXT:    [[PRED11_INV:%.*]] = xor i1 [[PRED11:%.*]], true
13 ; CHECK-NEXT:    [[PRED12_INV:%.*]] = xor i1 [[PRED12:%.*]], true
14 ; CHECK-NEXT:    [[PRED13_INV:%.*]] = xor i1 [[PRED13:%.*]], true
15 ; CHECK-NEXT:    br i1 [[PRED0_INV]], label [[IF_THEN:%.*]], label [[FLOW22:%.*]]
16 ; CHECK:       Flow22:
17 ; CHECK-NEXT:    [[TMP0:%.*]] = phi i1 [ false, [[FLOW5:%.*]] ], [ true, [[ENTRY:%.*]] ]
18 ; CHECK-NEXT:    br i1 [[TMP0]], label [[IF_END:%.*]], label [[FLOW23:%.*]]
19 ; CHECK:       if.end:
20 ; CHECK-NEXT:    br i1 [[PRED1_INV]], label [[IF_ELSE:%.*]], label [[FLOW21:%.*]]
21 ; CHECK:       Flow21:
22 ; CHECK-NEXT:    [[TMP1:%.*]] = phi i1 [ false, [[IF_ELSE]] ], [ true, [[IF_END]] ]
23 ; CHECK-NEXT:    br i1 [[TMP1]], label [[IF_THEN7:%.*]], label [[IF_END16:%.*]]
24 ; CHECK:       if.then7:
25 ; CHECK-NEXT:    br label [[IF_END16]]
26 ; CHECK:       if.else:
27 ; CHECK-NEXT:    br label [[FLOW21]]
28 ; CHECK:       Flow23:
29 ; CHECK-NEXT:    br label [[EXIT:%.*]]
30 ; CHECK:       if.end16:
31 ; CHECK-NEXT:    br i1 [[PRED2_INV]], label [[IF_THEN39:%.*]], label [[FLOW19:%.*]]
32 ; CHECK:       Flow19:
33 ; CHECK-NEXT:    [[TMP2:%.*]] = phi i1 [ false, [[FLOW7:%.*]] ], [ true, [[IF_END16]] ]
34 ; CHECK-NEXT:    br i1 [[TMP2]], label [[WHILE_COND_PREHEADER:%.*]], label [[FLOW20:%.*]]
35 ; CHECK:       while.cond.preheader:
36 ; CHECK-NEXT:    br label [[WHILE_COND:%.*]]
37 ; CHECK:       Flow20:
38 ; CHECK-NEXT:    br label [[FLOW23]]
39 ; CHECK:       while.cond:
40 ; CHECK-NEXT:    br i1 [[PRED3_INV]], label [[LOR_RHS:%.*]], label [[FLOW15:%.*]]
41 ; CHECK:       Flow10:
42 ; CHECK-NEXT:    [[TMP3:%.*]] = phi i1 [ false, [[WHILE_COND47:%.*]] ], [ true, [[WHILE_BODY63:%.*]] ]
43 ; CHECK-NEXT:    [[TMP4:%.*]] = phi i1 [ [[PRED6:%.*]], [[WHILE_COND47]] ], [ false, [[WHILE_BODY63]] ]
44 ; CHECK-NEXT:    br label [[FLOW9:%.*]]
45 ; CHECK:       cond.true49:
46 ; CHECK-NEXT:    br label [[FLOW11:%.*]]
47 ; CHECK:       while.body63:
48 ; CHECK-NEXT:    br i1 [[PRED5_INV]], label [[WHILE_COND47]], label [[FLOW10:%.*]]
49 ; CHECK:       Flow9:
50 ; CHECK-NEXT:    [[TMP5:%.*]] = phi i1 [ [[TMP3]], [[FLOW10]] ], [ undef, [[IRR_GUARD1:%.*]] ]
51 ; CHECK-NEXT:    [[TMP6:%.*]] = phi i1 [ false, [[FLOW10]] ], [ undef, [[IRR_GUARD1]] ]
52 ; CHECK-NEXT:    [[TMP7:%.*]] = phi i1 [ true, [[FLOW10]] ], [ undef, [[IRR_GUARD1]] ]
53 ; CHECK-NEXT:    [[TMP8:%.*]] = phi i1 [ true, [[FLOW10]] ], [ undef, [[IRR_GUARD1]] ]
54 ; CHECK-NEXT:    [[TMP9:%.*]] = phi i1 [ [[TMP4]], [[FLOW10]] ], [ true, [[IRR_GUARD1]] ]
55 ; CHECK-NEXT:    br i1 [[TMP9]], label [[COND_TRUE49:%.*]], label [[FLOW11]]
56 ; CHECK:       while.cond47:
57 ; CHECK-NEXT:    br label [[FLOW10]]
58 ; CHECK:       cond.end61:
59 ; CHECK-NEXT:    br label [[FLOW12:%.*]]
60 ; CHECK:       Flow17:
61 ; CHECK-NEXT:    [[TMP10:%.*]] = phi i1 [ [[TMP19:%.*]], [[FLOW18:%.*]] ], [ undef, [[LOOP_EXIT_GUARD2:%.*]] ]
62 ; CHECK-NEXT:    [[TMP11:%.*]] = phi i1 [ [[TMP20:%.*]], [[FLOW18]] ], [ [[DOTINV:%.*]], [[LOOP_EXIT_GUARD2]] ]
63 ; CHECK-NEXT:    br label [[FLOW16:%.*]]
64 ; CHECK:       if.then69:
65 ; CHECK-NEXT:    br label [[FLOW18]]
66 ; CHECK:       lor.rhs:
67 ; CHECK-NEXT:    br label [[FLOW15]]
68 ; CHECK:       while.end76:
69 ; CHECK-NEXT:    br label [[FLOW8:%.*]]
70 ; CHECK:       if.then39:
71 ; CHECK-NEXT:    br i1 [[PRED10_INV]], label [[IF_END_I145:%.*]], label [[FLOW7]]
72 ; CHECK:       if.end.i145:
73 ; CHECK-NEXT:    br i1 [[PRED11_INV]], label [[IF_END8_I149:%.*]], label [[FLOW6:%.*]]
74 ; CHECK:       if.end8.i149:
75 ; CHECK-NEXT:    br label [[FLOW6]]
76 ; CHECK:       if.then:
77 ; CHECK-NEXT:    br i1 [[PRED12_INV]], label [[IF_END_I:%.*]], label [[FLOW5]]
78 ; CHECK:       if.end.i:
79 ; CHECK-NEXT:    br i1 [[PRED13_INV]], label [[IF_END8_I:%.*]], label [[FLOW:%.*]]
80 ; CHECK:       if.end8.i:
81 ; CHECK-NEXT:    br label [[FLOW]]
82 ; CHECK:       Flow:
83 ; CHECK-NEXT:    br label [[FLOW5]]
84 ; CHECK:       Flow5:
85 ; CHECK-NEXT:    br label [[FLOW22]]
86 ; CHECK:       Flow6:
87 ; CHECK-NEXT:    br label [[FLOW7]]
88 ; CHECK:       Flow7:
89 ; CHECK-NEXT:    br label [[FLOW19]]
90 ; CHECK:       Flow8:
91 ; CHECK-NEXT:    br label [[FLOW20]]
92 ; CHECK:       exit:
93 ; CHECK-NEXT:    ret void
94 ; CHECK:       Flow15:
95 ; CHECK-NEXT:    [[TMP12:%.*]] = phi i1 [ true, [[LOR_RHS]] ], [ undef, [[WHILE_COND]] ]
96 ; CHECK-NEXT:    [[TMP13:%.*]] = phi i1 [ true, [[LOR_RHS]] ], [ false, [[WHILE_COND]] ]
97 ; CHECK-NEXT:    [[TMP14:%.*]] = phi i1 [ [[PRED9:%.*]], [[LOR_RHS]] ], [ true, [[WHILE_COND]] ]
98 ; CHECK-NEXT:    br i1 [[TMP14]], label [[IRR_GUARD:%.*]], label [[FLOW16]]
99 ; CHECK:       irr.guard:
100 ; CHECK-NEXT:    [[GUARD_COND_END61:%.*]] = phi i1 [ [[TMP28:%.*]], [[FLOW13:%.*]] ], [ [[TMP13]], [[FLOW15]] ]
101 ; CHECK-NEXT:    br i1 [[GUARD_COND_END61]], label [[COND_END61:%.*]], label [[FLOW12]]
102 ; CHECK:       Flow12:
103 ; CHECK-NEXT:    [[TMP15:%.*]] = phi i1 [ false, [[COND_END61]] ], [ undef, [[IRR_GUARD]] ]
104 ; CHECK-NEXT:    [[TMP16:%.*]] = phi i1 [ true, [[COND_END61]] ], [ undef, [[IRR_GUARD]] ]
105 ; CHECK-NEXT:    [[TMP17:%.*]] = phi i1 [ true, [[COND_END61]] ], [ false, [[IRR_GUARD]] ]
106 ; CHECK-NEXT:    [[TMP18:%.*]] = phi i1 [ [[PRED7:%.*]], [[COND_END61]] ], [ true, [[IRR_GUARD]] ]
107 ; CHECK-NEXT:    br i1 [[TMP18]], label [[IRR_GUARD1]], label [[FLOW13]]
108 ; CHECK:       irr.guard1:
109 ; CHECK-NEXT:    [[GUARD_WHILE_BODY63:%.*]] = phi i1 [ [[TMP23:%.*]], [[FLOW11]] ], [ [[TMP17]], [[FLOW12]] ]
110 ; CHECK-NEXT:    br i1 [[GUARD_WHILE_BODY63]], label [[WHILE_BODY63]], label [[FLOW9]]
111 ; CHECK:       Flow18:
112 ; CHECK-NEXT:    [[TMP19]] = phi i1 [ false, [[IF_THEN69:%.*]] ], [ [[TMP31:%.*]], [[LOOP_EXIT_GUARD3:%.*]] ]
113 ; CHECK-NEXT:    [[TMP20]] = phi i1 [ [[PRED8:%.*]], [[IF_THEN69]] ], [ [[DOTINV]], [[LOOP_EXIT_GUARD3]] ]
114 ; CHECK-NEXT:    br label [[FLOW17:%.*]]
115 ; CHECK:       loop.exit.guard:
116 ; CHECK-NEXT:    br i1 [[TMP21:%.*]], label [[WHILE_END76:%.*]], label [[FLOW8]]
117 ; CHECK:       Flow16:
118 ; CHECK-NEXT:    [[TMP21]] = phi i1 [ [[TMP10]], [[FLOW17]] ], [ [[TMP12]], [[FLOW15]] ]
119 ; CHECK-NEXT:    [[TMP22:%.*]] = phi i1 [ [[TMP11]], [[FLOW17]] ], [ true, [[FLOW15]] ]
120 ; CHECK-NEXT:    br i1 [[TMP22]], label [[LOOP_EXIT_GUARD:%.*]], label [[WHILE_COND]]
121 ; CHECK:       loop.exit.guard2:
122 ; CHECK-NEXT:    br i1 [[DOTINV]], label [[LOOP_EXIT_GUARD3]], label [[FLOW17]]
123 ; CHECK:       loop.exit.guard3:
124 ; CHECK-NEXT:    br i1 [[DOTINV14:%.*]], label [[IF_THEN69]], label [[FLOW18]]
125 ; CHECK:       Flow11:
126 ; CHECK-NEXT:    [[TMP23]] = phi i1 [ true, [[COND_TRUE49]] ], [ undef, [[FLOW9]] ]
127 ; CHECK-NEXT:    [[TMP24:%.*]] = phi i1 [ true, [[COND_TRUE49]] ], [ [[TMP5]], [[FLOW9]] ]
128 ; CHECK-NEXT:    [[TMP25:%.*]] = phi i1 [ false, [[COND_TRUE49]] ], [ [[TMP6]], [[FLOW9]] ]
129 ; CHECK-NEXT:    [[TMP26:%.*]] = phi i1 [ false, [[COND_TRUE49]] ], [ [[TMP7]], [[FLOW9]] ]
130 ; CHECK-NEXT:    [[TMP27:%.*]] = phi i1 [ [[PRED4:%.*]], [[COND_TRUE49]] ], [ true, [[FLOW9]] ]
131 ; CHECK-NEXT:    br i1 [[TMP27]], label [[LOOP_EXIT_GUARD4:%.*]], label [[IRR_GUARD1]]
132 ; CHECK:       Flow13:
133 ; CHECK-NEXT:    [[TMP28]] = phi i1 [ [[TMP8]], [[LOOP_EXIT_GUARD4]] ], [ undef, [[FLOW12]] ]
134 ; CHECK-NEXT:    [[TMP29:%.*]] = phi i1 [ [[TMP26]], [[LOOP_EXIT_GUARD4]] ], [ [[TMP15]], [[FLOW12]] ]
135 ; CHECK-NEXT:    [[TMP30:%.*]] = phi i1 [ [[TMP25]], [[LOOP_EXIT_GUARD4]] ], [ [[TMP16]], [[FLOW12]] ]
136 ; CHECK-NEXT:    [[TMP31]] = phi i1 [ [[TMP6]], [[LOOP_EXIT_GUARD4]] ], [ undef, [[FLOW12]] ]
137 ; CHECK-NEXT:    [[TMP32:%.*]] = phi i1 [ [[TMP24]], [[LOOP_EXIT_GUARD4]] ], [ true, [[FLOW12]] ]
138 ; CHECK-NEXT:    [[DOTINV14]] = xor i1 [[TMP29]], true
139 ; CHECK-NEXT:    [[DOTINV]] = xor i1 [[TMP30]], true
140 ; CHECK-NEXT:    br i1 [[TMP32]], label [[LOOP_EXIT_GUARD2]], label [[IRR_GUARD]]
141 ; CHECK:       loop.exit.guard4:
142 ; CHECK-NEXT:    br label [[FLOW13]]
144 entry:
145   br i1 %Pred0, label %if.end, label %if.then
147 if.end:
148   br i1 %Pred1, label %if.then7, label %if.else
150 if.then7:
151   br label %if.end16
153 if.else:
154   br label %if.end16
156 if.end16:
157   br i1 %Pred2, label %while.cond.preheader, label %if.then39
159 while.cond.preheader:
160   br label %while.cond
162 while.cond:
163   br i1 %Pred3, label %cond.true49, label %lor.rhs
165 cond.true49:
166   br i1 %Pred4, label %if.then69, label %while.body63
168 while.body63:
169   br i1 %Pred5, label %exit, label %while.cond47
171 while.cond47:
172   br i1 %Pred6, label %cond.true49, label %cond.end61
174 cond.end61:
175   br i1 %Pred7, label %while.body63, label %while.cond
177 if.then69:
178   br i1 %Pred8, label %exit, label %while.cond
180 lor.rhs:
181   br i1 %Pred9, label %cond.end61, label %while.end76
183 while.end76:
184   br label %exit
186 if.then39:
187   br i1 %Pred10, label %exit, label %if.end.i145
189 if.end.i145:
190   br i1 %Pred11, label %exit, label %if.end8.i149
192 if.end8.i149:
193   br label %exit
195 if.then:
196   br i1 %Pred12, label %exit, label %if.end.i
198 if.end.i:
199   br i1 %Pred13, label %exit, label %if.end8.i
201 if.end8.i:
202   br label %exit
204 exit:
205   ret void