• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt -S < %s -simplifycfg -simplifycfg-merge-cond-stores=true -simplifycfg-merge-cond-stores-aggressively=false -phi-node-folding-threshold=2 | FileCheck %s
2
3target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4target triple = "armv7--linux-gnueabihf"
5
6; This is a bit reversal that has been run through the early optimizer (-mem2reg -gvn -instcombine).
7; There should be no additional PHIs created at all. The store should be on its own in a predicated
8; block and there should be no PHIs.
9
10; CHECK-LABEL: @f
11; Exactly 15 phis, as there are 15 in the original test case.
12; CHECK: select
13; CHECK: select
14; CHECK: select
15; CHECK: select
16; CHECK: select
17; CHECK: select
18; CHECK: select
19; CHECK: select
20; CHECK: select
21; CHECK: select
22; CHECK: select
23; CHECK: select
24; CHECK: select
25; CHECK: select
26; CHECK: select
27; CHECK: select
28; CHECK-NOT: select
29; CHECK: br i1 {{.*}}, label %[[L:.*]], label %[[R:.*]]
30; CHECK: [[L]]: ; preds =
31; CHECK-NEXT: store
32; CHECK-NEXT: br label %[[R]]
33; CHECK: [[R]]: ; preds =
34; CHECK-NEXT: ret i32 0
35
36define i32 @f(i32* %b) {
37entry:
38  %0 = load i32, i32* %b, align 4
39  %and = and i32 %0, 1
40  %tobool = icmp eq i32 %and, 0
41  br i1 %tobool, label %if.end, label %if.then
42
43if.then:                                          ; preds = %entry
44  %or = or i32 %0, -2147483648
45  store i32 %or, i32* %b, align 4
46  br label %if.end
47
48if.end:                                           ; preds = %entry, %if.then
49  %1 = phi i32 [ %0, %entry ], [ %or, %if.then ]
50  %and1 = and i32 %1, 2
51  %tobool2 = icmp eq i32 %and1, 0
52  br i1 %tobool2, label %if.end5, label %if.then3
53
54if.then3:                                         ; preds = %if.end
55  %or4 = or i32 %1, 1073741824
56  store i32 %or4, i32* %b, align 4
57  br label %if.end5
58
59if.end5:                                          ; preds = %if.end, %if.then3
60  %2 = phi i32 [ %1, %if.end ], [ %or4, %if.then3 ]
61  %and6 = and i32 %2, 4
62  %tobool7 = icmp eq i32 %and6, 0
63  br i1 %tobool7, label %if.end10, label %if.then8
64
65if.then8:                                         ; preds = %if.end5
66  %or9 = or i32 %2, 536870912
67  store i32 %or9, i32* %b, align 4
68  br label %if.end10
69
70if.end10:                                         ; preds = %if.end5, %if.then8
71  %3 = phi i32 [ %2, %if.end5 ], [ %or9, %if.then8 ]
72  %and11 = and i32 %3, 8
73  %tobool12 = icmp eq i32 %and11, 0
74  br i1 %tobool12, label %if.end15, label %if.then13
75
76if.then13:                                        ; preds = %if.end10
77  %or14 = or i32 %3, 268435456
78  store i32 %or14, i32* %b, align 4
79  br label %if.end15
80
81if.end15:                                         ; preds = %if.end10, %if.then13
82  %4 = phi i32 [ %3, %if.end10 ], [ %or14, %if.then13 ]
83  %and16 = and i32 %4, 16
84  %tobool17 = icmp eq i32 %and16, 0
85  br i1 %tobool17, label %if.end20, label %if.then18
86
87if.then18:                                        ; preds = %if.end15
88  %or19 = or i32 %4, 134217728
89  store i32 %or19, i32* %b, align 4
90  br label %if.end20
91
92if.end20:                                         ; preds = %if.end15, %if.then18
93  %5 = phi i32 [ %4, %if.end15 ], [ %or19, %if.then18 ]
94  %and21 = and i32 %5, 32
95  %tobool22 = icmp eq i32 %and21, 0
96  br i1 %tobool22, label %if.end25, label %if.then23
97
98if.then23:                                        ; preds = %if.end20
99  %or24 = or i32 %5, 67108864
100  store i32 %or24, i32* %b, align 4
101  br label %if.end25
102
103if.end25:                                         ; preds = %if.end20, %if.then23
104  %6 = phi i32 [ %5, %if.end20 ], [ %or24, %if.then23 ]
105  %and26 = and i32 %6, 64
106  %tobool27 = icmp eq i32 %and26, 0
107  br i1 %tobool27, label %if.end30, label %if.then28
108
109if.then28:                                        ; preds = %if.end25
110  %or29 = or i32 %6, 33554432
111  store i32 %or29, i32* %b, align 4
112  br label %if.end30
113
114if.end30:                                         ; preds = %if.end25, %if.then28
115  %7 = phi i32 [ %6, %if.end25 ], [ %or29, %if.then28 ]
116  %and31 = and i32 %7, 256
117  %tobool32 = icmp eq i32 %and31, 0
118  br i1 %tobool32, label %if.end35, label %if.then33
119
120if.then33:                                        ; preds = %if.end30
121  %or34 = or i32 %7, 8388608
122  store i32 %or34, i32* %b, align 4
123  br label %if.end35
124
125if.end35:                                         ; preds = %if.end30, %if.then33
126  %8 = phi i32 [ %7, %if.end30 ], [ %or34, %if.then33 ]
127  %and36 = and i32 %8, 512
128  %tobool37 = icmp eq i32 %and36, 0
129  br i1 %tobool37, label %if.end40, label %if.then38
130
131if.then38:                                        ; preds = %if.end35
132  %or39 = or i32 %8, 4194304
133  store i32 %or39, i32* %b, align 4
134  br label %if.end40
135
136if.end40:                                         ; preds = %if.end35, %if.then38
137  %9 = phi i32 [ %8, %if.end35 ], [ %or39, %if.then38 ]
138  %and41 = and i32 %9, 1024
139  %tobool42 = icmp eq i32 %and41, 0
140  br i1 %tobool42, label %if.end45, label %if.then43
141
142if.then43:                                        ; preds = %if.end40
143  %or44 = or i32 %9, 2097152
144  store i32 %or44, i32* %b, align 4
145  br label %if.end45
146
147if.end45:                                         ; preds = %if.end40, %if.then43
148  %10 = phi i32 [ %9, %if.end40 ], [ %or44, %if.then43 ]
149  %and46 = and i32 %10, 2048
150  %tobool47 = icmp eq i32 %and46, 0
151  br i1 %tobool47, label %if.end50, label %if.then48
152
153if.then48:                                        ; preds = %if.end45
154  %or49 = or i32 %10, 1048576
155  store i32 %or49, i32* %b, align 4
156  br label %if.end50
157
158if.end50:                                         ; preds = %if.end45, %if.then48
159  %11 = phi i32 [ %10, %if.end45 ], [ %or49, %if.then48 ]
160  %and51 = and i32 %11, 4096
161  %tobool52 = icmp eq i32 %and51, 0
162  br i1 %tobool52, label %if.end55, label %if.then53
163
164if.then53:                                        ; preds = %if.end50
165  %or54 = or i32 %11, 524288
166  store i32 %or54, i32* %b, align 4
167  br label %if.end55
168
169if.end55:                                         ; preds = %if.end50, %if.then53
170  %12 = phi i32 [ %11, %if.end50 ], [ %or54, %if.then53 ]
171  %and56 = and i32 %12, 8192
172  %tobool57 = icmp eq i32 %and56, 0
173  br i1 %tobool57, label %if.end60, label %if.then58
174
175if.then58:                                        ; preds = %if.end55
176  %or59 = or i32 %12, 262144
177  store i32 %or59, i32* %b, align 4
178  br label %if.end60
179
180if.end60:                                         ; preds = %if.end55, %if.then58
181  %13 = phi i32 [ %12, %if.end55 ], [ %or59, %if.then58 ]
182  %and61 = and i32 %13, 16384
183  %tobool62 = icmp eq i32 %and61, 0
184  br i1 %tobool62, label %if.end65, label %if.then63
185
186if.then63:                                        ; preds = %if.end60
187  %or64 = or i32 %13, 131072
188  store i32 %or64, i32* %b, align 4
189  br label %if.end65
190
191if.end65:                                         ; preds = %if.end60, %if.then63
192  %14 = phi i32 [ %13, %if.end60 ], [ %or64, %if.then63 ]
193  %and66 = and i32 %14, 32768
194  %tobool67 = icmp eq i32 %and66, 0
195  br i1 %tobool67, label %if.end70, label %if.then68
196
197if.then68:                                        ; preds = %if.end65
198  %or69 = or i32 %14, 65536
199  store i32 %or69, i32* %b, align 4
200  br label %if.end70
201
202if.end70:                                         ; preds = %if.end65, %if.then68
203  %15 = phi i32 [ %14, %if.end65 ], [ %or69, %if.then68 ]
204  %and71 = and i32 %15, 128
205  %tobool72 = icmp eq i32 %and71, 0
206  br i1 %tobool72, label %if.end75, label %if.then73
207
208if.then73:                                        ; preds = %if.end70
209  %or74 = or i32 %15, 16777216
210  store i32 %or74, i32* %b, align 4
211  br label %if.end75
212
213if.end75:                                         ; preds = %if.end70, %if.then73
214  ret i32 0
215}
216