• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -fix-irreducible -unify-loop-exits -structurizecfg -enable-new-pm=0 -S | FileCheck %s
3define 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:    [[PRED4_INV:%.*]] = xor i1 [[PRED4:%.*]], true
12; CHECK-NEXT:    [[PRED10_INV:%.*]] = xor i1 [[PRED10:%.*]], true
13; CHECK-NEXT:    [[PRED11_INV:%.*]] = xor i1 [[PRED11:%.*]], true
14; CHECK-NEXT:    [[PRED12_INV:%.*]] = xor i1 [[PRED12:%.*]], true
15; CHECK-NEXT:    [[PRED13_INV:%.*]] = xor i1 [[PRED13:%.*]], true
16; CHECK-NEXT:    br i1 [[PRED0_INV]], label [[IF_THEN:%.*]], label [[FLOW19:%.*]]
17; CHECK:       Flow19:
18; CHECK-NEXT:    [[TMP0:%.*]] = phi i1 [ false, [[FLOW3:%.*]] ], [ true, [[ENTRY:%.*]] ]
19; CHECK-NEXT:    br i1 [[TMP0]], label [[IF_END:%.*]], label [[FLOW20:%.*]]
20; CHECK:       if.end:
21; CHECK-NEXT:    br i1 [[PRED1_INV]], label [[IF_ELSE:%.*]], label [[FLOW18:%.*]]
22; CHECK:       Flow18:
23; CHECK-NEXT:    [[TMP1:%.*]] = phi i1 [ false, [[IF_ELSE]] ], [ true, [[IF_END]] ]
24; CHECK-NEXT:    br i1 [[TMP1]], label [[IF_THEN7:%.*]], label [[IF_END16:%.*]]
25; CHECK:       if.then7:
26; CHECK-NEXT:    br label [[IF_END16]]
27; CHECK:       if.else:
28; CHECK-NEXT:    br label [[FLOW18]]
29; CHECK:       Flow20:
30; CHECK-NEXT:    br label [[EXIT:%.*]]
31; CHECK:       if.end16:
32; CHECK-NEXT:    br i1 [[PRED2_INV]], label [[IF_THEN39:%.*]], label [[FLOW16:%.*]]
33; CHECK:       Flow16:
34; CHECK-NEXT:    [[TMP2:%.*]] = phi i1 [ false, [[FLOW5:%.*]] ], [ true, [[IF_END16]] ]
35; CHECK-NEXT:    br i1 [[TMP2]], label [[WHILE_COND_PREHEADER:%.*]], label [[FLOW17:%.*]]
36; CHECK:       while.cond.preheader:
37; CHECK-NEXT:    br label [[WHILE_COND:%.*]]
38; CHECK:       Flow17:
39; CHECK-NEXT:    br label [[FLOW20]]
40; CHECK:       while.cond:
41; CHECK-NEXT:    br i1 [[PRED3_INV]], label [[LOR_RHS:%.*]], label [[FLOW12:%.*]]
42; CHECK:       Flow7:
43; CHECK-NEXT:    [[TMP3:%.*]] = phi i1 [ [[PRED7:%.*]], [[COND_END61:%.*]] ], [ false, [[IRR_GUARD:%.*]] ]
44; CHECK-NEXT:    [[TMP4:%.*]] = phi i1 [ false, [[COND_END61]] ], [ true, [[IRR_GUARD]] ]
45; CHECK-NEXT:    br i1 [[TMP4]], label [[COND_TRUE49:%.*]], label [[FLOW8:%.*]]
46; CHECK:       cond.true49:
47; CHECK-NEXT:    br label [[FLOW8]]
48; CHECK:       Flow8:
49; CHECK-NEXT:    [[TMP5:%.*]] = phi i1 [ false, [[COND_TRUE49]] ], [ true, [[FLOW7:%.*]] ]
50; CHECK-NEXT:    [[TMP6:%.*]] = phi i1 [ [[PRED4_INV]], [[COND_TRUE49]] ], [ [[TMP3]], [[FLOW7]] ]
51; CHECK-NEXT:    br i1 [[TMP6]], label [[WHILE_BODY63:%.*]], label [[FLOW9:%.*]]
52; CHECK:       while.body63:
53; CHECK-NEXT:    br i1 [[PRED5_INV]], label [[WHILE_COND47:%.*]], label [[FLOW10:%.*]]
54; CHECK:       Flow9:
55; CHECK-NEXT:    [[TMP7:%.*]] = phi i1 [ true, [[FLOW10]] ], [ false, [[FLOW8]] ]
56; CHECK-NEXT:    [[TMP8:%.*]] = phi i1 [ false, [[FLOW10]] ], [ [[TMP5]], [[FLOW8]] ]
57; CHECK-NEXT:    [[TMP9:%.*]] = phi i1 [ [[TMP15:%.*]], [[FLOW10]] ], [ true, [[FLOW8]] ]
58; CHECK-NEXT:    [[DOTINV11:%.*]] = xor i1 [[TMP7]], true
59; CHECK-NEXT:    [[DOTINV:%.*]] = xor i1 [[TMP8]], true
60; CHECK-NEXT:    br i1 [[TMP9]], label [[LOOP_EXIT_GUARD1:%.*]], label [[IRR_GUARD]]
61; CHECK:       while.cond47:
62; CHECK-NEXT:    br label [[FLOW10]]
63; CHECK:       cond.end61:
64; CHECK-NEXT:    br label [[FLOW7]]
65; CHECK:       Flow14:
66; CHECK-NEXT:    [[TMP10:%.*]] = phi i1 [ false, [[FLOW15:%.*]] ], [ true, [[LOOP_EXIT_GUARD1]] ]
67; CHECK-NEXT:    [[TMP11:%.*]] = phi i1 [ [[TMP14:%.*]], [[FLOW15]] ], [ [[DOTINV]], [[LOOP_EXIT_GUARD1]] ]
68; CHECK-NEXT:    br label [[FLOW13:%.*]]
69; CHECK:       if.then69:
70; CHECK-NEXT:    br label [[FLOW15]]
71; CHECK:       lor.rhs:
72; CHECK-NEXT:    br label [[FLOW12]]
73; CHECK:       while.end76:
74; CHECK-NEXT:    br label [[FLOW6:%.*]]
75; CHECK:       if.then39:
76; CHECK-NEXT:    br i1 [[PRED10_INV]], label [[IF_END_I145:%.*]], label [[FLOW5]]
77; CHECK:       if.end.i145:
78; CHECK-NEXT:    br i1 [[PRED11_INV]], label [[IF_END8_I149:%.*]], label [[FLOW4:%.*]]
79; CHECK:       if.end8.i149:
80; CHECK-NEXT:    br label [[FLOW4]]
81; CHECK:       if.then:
82; CHECK-NEXT:    br i1 [[PRED12_INV]], label [[IF_END_I:%.*]], label [[FLOW3]]
83; CHECK:       if.end.i:
84; CHECK-NEXT:    br i1 [[PRED13_INV]], label [[IF_END8_I:%.*]], label [[FLOW:%.*]]
85; CHECK:       if.end8.i:
86; CHECK-NEXT:    br label [[FLOW]]
87; CHECK:       Flow:
88; CHECK-NEXT:    br label [[FLOW3]]
89; CHECK:       Flow3:
90; CHECK-NEXT:    br label [[FLOW19]]
91; CHECK:       Flow4:
92; CHECK-NEXT:    br label [[FLOW5]]
93; CHECK:       Flow5:
94; CHECK-NEXT:    br label [[FLOW16]]
95; CHECK:       Flow6:
96; CHECK-NEXT:    br label [[FLOW17]]
97; CHECK:       exit:
98; CHECK-NEXT:    ret void
99; CHECK:       Flow12:
100; CHECK-NEXT:    [[TMP12:%.*]] = phi i1 [ false, [[LOR_RHS]] ], [ true, [[WHILE_COND]] ]
101; CHECK-NEXT:    [[TMP13:%.*]] = phi i1 [ [[PRED9:%.*]], [[LOR_RHS]] ], [ [[PRED3]], [[WHILE_COND]] ]
102; CHECK-NEXT:    br i1 [[TMP13]], label [[IRR_GUARD]], label [[FLOW13]]
103; CHECK:       irr.guard:
104; CHECK-NEXT:    [[GUARD_COND_TRUE49:%.*]] = phi i1 [ [[PRED6:%.*]], [[FLOW9]] ], [ [[TMP12]], [[FLOW12]] ]
105; CHECK-NEXT:    [[GUARD_COND_TRUE49_INV:%.*]] = xor i1 [[GUARD_COND_TRUE49]], true
106; CHECK-NEXT:    br i1 [[GUARD_COND_TRUE49_INV]], label [[COND_END61]], label [[FLOW7]]
107; CHECK:       Flow15:
108; CHECK-NEXT:    [[TMP14]] = phi i1 [ [[PRED8:%.*]], [[IF_THEN69:%.*]] ], [ [[DOTINV]], [[LOOP_EXIT_GUARD2:%.*]] ]
109; CHECK-NEXT:    br label [[FLOW14:%.*]]
110; CHECK:       loop.exit.guard:
111; CHECK-NEXT:    br i1 [[TMP16:%.*]], label [[WHILE_END76:%.*]], label [[FLOW6]]
112; CHECK:       Flow10:
113; CHECK-NEXT:    [[TMP15]] = phi i1 [ false, [[WHILE_COND47]] ], [ true, [[WHILE_BODY63]] ]
114; CHECK-NEXT:    br label [[FLOW9]]
115; CHECK:       Flow13:
116; CHECK-NEXT:    [[TMP16]] = phi i1 [ [[TMP10]], [[FLOW14]] ], [ true, [[FLOW12]] ]
117; CHECK-NEXT:    [[TMP17:%.*]] = phi i1 [ [[TMP11]], [[FLOW14]] ], [ true, [[FLOW12]] ]
118; CHECK-NEXT:    br i1 [[TMP17]], label [[LOOP_EXIT_GUARD:%.*]], label [[WHILE_COND]]
119; CHECK:       loop.exit.guard1:
120; CHECK-NEXT:    br i1 [[DOTINV]], label [[LOOP_EXIT_GUARD2]], label [[FLOW14]]
121; CHECK:       loop.exit.guard2:
122; CHECK-NEXT:    br i1 [[DOTINV11]], label [[IF_THEN69]], label [[FLOW15]]
123;
124entry:
125  br i1 %Pred0, label %if.end, label %if.then
126
127if.end:
128  br i1 %Pred1, label %if.then7, label %if.else
129
130if.then7:
131  br label %if.end16
132
133if.else:
134  br label %if.end16
135
136if.end16:
137  br i1 %Pred2, label %while.cond.preheader, label %if.then39
138
139while.cond.preheader:
140  br label %while.cond
141
142while.cond:
143  br i1 %Pred3, label %cond.true49, label %lor.rhs
144
145cond.true49:
146  br i1 %Pred4, label %if.then69, label %while.body63
147
148while.body63:
149  br i1 %Pred5, label %exit, label %while.cond47
150
151while.cond47:
152  br i1 %Pred6, label %cond.true49, label %cond.end61
153
154cond.end61:
155  br i1 %Pred7, label %while.body63, label %while.cond
156
157if.then69:
158  br i1 %Pred8, label %exit, label %while.cond
159
160lor.rhs:
161  br i1 %Pred9, label %cond.end61, label %while.end76
162
163while.end76:
164  br label %exit
165
166if.then39:
167  br i1 %Pred10, label %exit, label %if.end.i145
168
169if.end.i145:
170  br i1 %Pred11, label %exit, label %if.end8.i149
171
172if.end8.i149:
173  br label %exit
174
175if.then:
176  br i1 %Pred12, label %exit, label %if.end.i
177
178if.end.i:
179  br i1 %Pred13, label %exit, label %if.end8.i
180
181if.end8.i:
182  br label %exit
183
184exit:
185  ret void
186}
187