blob: 27c274d557eb1c2a90eeaeb34cdbc021fd756526 [file] [log] [blame]
Arnold Schwaighofer38de7cd42013-06-27 20:31:06 +00001; RUN: opt -S -loop-vectorize < %s | FileCheck %s
2
3target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
4target triple = "x86_64-apple-macosx10.9.0"
5
6@a = global i32* null, align 8
7@b = global i32* null, align 8
8@c = global i32* null, align 8
9
10; Don't create an exponetial IR for the edge masks needed when if-converting
11; this code.
12
13; PR16472
14
15; CHECK-NOT: %6000000 =
16
17define void @_Z3fn4i(i32 %p1) {
18entry:
19 %cmp88 = icmp sgt i32 %p1, 0
20 br i1 %cmp88, label %for.body.lr.ph, label %for.end
21
22for.body.lr.ph:
23 %0 = load i32** @b, align 8 %1 = load i32** @a, align 8 %2 = load i32** @c, align 8 br label %for.body
24
25for.body:
26 %indvars.iv = phi i64 [ 0, %for.body.lr.ph ], [ %indvars.iv.next, %_ZL3fn3ii.exit58 ]
27 %arrayidx = getelementptr inbounds i32* %0, i64 %indvars.iv
28 %3 = load i32* %arrayidx, align 4 %4 = trunc i64 %indvars.iv to i32
29 %and.i = and i32 %4, 1
30 %tobool.i.i = icmp eq i32 %and.i, 0
31 br i1 %tobool.i.i, label %if.end.i, label %if.then.i
32
33if.then.i:
34 %and.i.i = lshr i32 %3, 2
35 %and.lobit.i.i = and i32 %and.i.i, 1
36 %5 = xor i32 %and.lobit.i.i, 1
37 %or.i.i = or i32 %5, %3
38 %cmp.i = icmp sgt i32 %or.i.i, 0
39 %conv.i = zext i1 %cmp.i to i32
40 br label %if.end.i
41
42if.end.i:
43 %tobool.i87 = phi i1 [ true, %if.then.i ], [ false, %for.body ]
44 %p1.addr.0.i = phi i32 [ %conv.i, %if.then.i ], [ %3, %for.body ]
45 %6 = trunc i64 %indvars.iv to i32
46 %and1.i = and i32 %6, 7
47 %tobool2.i = icmp eq i32 %and1.i, 0
48 br i1 %tobool2.i, label %if.end7.i, label %if.then3.i
49
50if.then3.i:
51 %p1.addr.0.lobit.i = lshr i32 %p1.addr.0.i, 31
52 %and6.i = and i32 %p1.addr.0.i, 1
53 %or.i = or i32 %p1.addr.0.lobit.i, %and6.i
54 br label %if.end7.i
55
56if.end7.i:
57 %p1.addr.1.i = phi i32 [ %or.i, %if.then3.i ], [ %p1.addr.0.i, %if.end.i ]
58 br i1 %tobool.i87, label %if.then10.i, label %if.end13.i
59
60if.then10.i:
61 %cmp11.i = icmp sgt i32 %p1.addr.1.i, 0
62 %conv12.i = zext i1 %cmp11.i to i32
63 br label %if.end13.i
64
65if.end13.i:
66 %p1.addr.2.i = phi i32 [ %conv12.i, %if.then10.i ], [ %p1.addr.1.i, %if.end7.i ]
67 br i1 %tobool.i.i, label %_Z3fn2iii.exit, label %if.then16.i
68
69if.then16.i:
70 %and17.i = lshr i32 %p1.addr.2.i, 3
71 %and17.lobit.i = and i32 %and17.i, 1
72 br label %_Z3fn2iii.exit
73
74_Z3fn2iii.exit:
75 %p1.addr.3.i = phi i32 [ %and17.lobit.i, %if.then16.i ], [ %p1.addr.2.i, %if.end13.i ]
76 %7 = trunc i64 %indvars.iv to i32
77 %shr.i = ashr i32 %7, 1
78 %and.i18.i = and i32 %shr.i, 1
79 %tobool.i19.i = icmp ne i32 %and.i18.i, 0
80 br i1 %tobool.i19.i, label %if.then.i20.i, label %if.end.i.i
81
82if.then.i20.i:
83 %cmp.i.i = icmp sgt i32 %p1.addr.3.i, 0
84 %conv.i.i = zext i1 %cmp.i.i to i32
85 br label %if.end.i.i
86
87if.end.i.i:
88 %p1.addr.0.i21.i = phi i32 [ %conv.i.i, %if.then.i20.i ], [ %p1.addr.3.i, %_Z3fn2iii.exit ]
89 %and1.i.i = and i32 %shr.i, 7
90 %tobool2.i.i = icmp eq i32 %and1.i.i, 0
91 br i1 %tobool2.i.i, label %if.end7.i.i, label %if.then3.i.i
92
93if.then3.i.i:
94 %p1.addr.0.lobit.i.i = lshr i32 %p1.addr.0.i21.i, 31
95 %and6.i.i = and i32 %p1.addr.0.i21.i, 1
96 %or.i22.i = or i32 %p1.addr.0.lobit.i.i, %and6.i.i
97 br label %if.end7.i.i
98
99if.end7.i.i:
100 %p1.addr.1.i.i = phi i32 [ %or.i22.i, %if.then3.i.i ], [ %p1.addr.0.i21.i, %if.end.i.i ]
101 br i1 %tobool.i19.i, label %if.then10.i.i, label %if.end13.i.i
102
103if.then10.i.i:
104 %cmp11.i.i = icmp sgt i32 %p1.addr.1.i.i, 0
105 %conv12.i.i = zext i1 %cmp11.i.i to i32
106 br label %if.end13.i.i
107
108if.end13.i.i:
109 %p1.addr.2.i.i = phi i32 [ %conv12.i.i, %if.then10.i.i ], [ %p1.addr.1.i.i, %if.end7.i.i ]
110 %and14.i.i = and i32 %shr.i, 5
111 %tobool15.i.i = icmp eq i32 %and14.i.i, 0
112 br i1 %tobool15.i.i, label %_Z3fn2iii.exit.i, label %if.then16.i.i
113
114if.then16.i.i:
115 %and17.i.i = lshr i32 %p1.addr.2.i.i, 3
116 %and17.lobit.i.i = and i32 %and17.i.i, 1
117 br label %_Z3fn2iii.exit.i
118
119_Z3fn2iii.exit.i:
120 %p1.addr.3.i.i = phi i32 [ %and17.lobit.i.i, %if.then16.i.i ], [ %p1.addr.2.i.i, %if.end13.i.i ]
121 %8 = trunc i64 %indvars.iv to i32
122 %tobool.i11.i = icmp eq i32 %8, 0
123 br i1 %tobool.i11.i, label %_ZL3fn3ii.exit, label %if.then.i15.i
124
125if.then.i15.i:
126 %and.i12.i = lshr i32 %p1.addr.3.i.i, 2
127 %and.lobit.i13.i = and i32 %and.i12.i, 1
128 %9 = xor i32 %and.lobit.i13.i, 1
129 %or.i14.i = or i32 %9, %p1.addr.3.i.i
130 br label %_ZL3fn3ii.exit
131
132_ZL3fn3ii.exit:
133 %p1.addr.0.i16.i = phi i32 [ %or.i14.i, %if.then.i15.i ], [ %p1.addr.3.i.i, %_Z3fn2iii.exit.i ]
134 %arrayidx2 = getelementptr inbounds i32* %1, i64 %indvars.iv
135 store i32 %p1.addr.0.i16.i, i32* %arrayidx2, align 4 %arrayidx4 = getelementptr inbounds i32* %0, i64 %indvars.iv
136 %10 = load i32* %arrayidx4, align 4 br i1 %tobool.i.i, label %_Z3fn1ii.exit.i26, label %if.then.i.i21
137
138if.then.i.i21:
139 %and.i.i18 = lshr i32 %10, 2
140 %and.lobit.i.i19 = and i32 %and.i.i18, 1
141 %11 = xor i32 %and.lobit.i.i19, 1
142 %or.i.i20 = or i32 %11, %10
143 br label %_Z3fn1ii.exit.i26
144
145_Z3fn1ii.exit.i26:
146 %p1.addr.0.i.i22 = phi i32 [ %or.i.i20, %if.then.i.i21 ], [ %10, %_ZL3fn3ii.exit ]
147 br i1 %tobool.i87, label %if.then.i63, label %if.end.i67
148
149if.then.i63:
150 %cmp.i61 = icmp sgt i32 %p1.addr.0.i.i22, 0
151 %conv.i62 = zext i1 %cmp.i61 to i32
152 br label %if.end.i67
153
154if.end.i67:
155 %p1.addr.0.i64 = phi i32 [ %conv.i62, %if.then.i63 ], [ %p1.addr.0.i.i22, %_Z3fn1ii.exit.i26 ]
156 br i1 %tobool2.i, label %if.end7.i73, label %if.then3.i71
157
158if.then3.i71:
159 %p1.addr.0.lobit.i68 = lshr i32 %p1.addr.0.i64, 31
160 %and6.i69 = and i32 %p1.addr.0.i64, 1
161 %or.i70 = or i32 %p1.addr.0.lobit.i68, %and6.i69
162 br label %if.end7.i73
163
164if.end7.i73:
165 %p1.addr.1.i72 = phi i32 [ %or.i70, %if.then3.i71 ], [ %p1.addr.0.i64, %if.end.i67 ]
166 br i1 %tobool.i87, label %if.then10.i76, label %if.end13.i80
167
168if.then10.i76:
169 %cmp11.i74 = icmp sgt i32 %p1.addr.1.i72, 0
170 %conv12.i75 = zext i1 %cmp11.i74 to i32
171 br label %if.end13.i80
172
173if.end13.i80:
174 %p1.addr.2.i77 = phi i32 [ %conv12.i75, %if.then10.i76 ], [ %p1.addr.1.i72, %if.end7.i73 ]
175 br i1 %tobool.i.i, label %_Z3fn2iii.exit85, label %if.then16.i83
176
177if.then16.i83:
178 %and17.i81 = lshr i32 %p1.addr.2.i77, 3
179 %and17.lobit.i82 = and i32 %and17.i81, 1
180 br label %_Z3fn2iii.exit85
181
182_Z3fn2iii.exit85:
183 %p1.addr.3.i84 = phi i32 [ %and17.lobit.i82, %if.then16.i83 ], [ %p1.addr.2.i77, %if.end13.i80 ]
184 br i1 %tobool.i19.i, label %if.then.i20.i29, label %if.end.i.i33
185
186if.then.i20.i29:
187 %cmp.i.i27 = icmp sgt i32 %p1.addr.3.i84, 0
188 %conv.i.i28 = zext i1 %cmp.i.i27 to i32
189 br label %if.end.i.i33
190
191if.end.i.i33:
192 %p1.addr.0.i21.i30 = phi i32 [ %conv.i.i28, %if.then.i20.i29 ], [ %p1.addr.3.i84, %_Z3fn2iii.exit85 ]
193 br i1 %tobool2.i.i, label %if.end7.i.i39, label %if.then3.i.i37
194
195if.then3.i.i37:
196 %p1.addr.0.lobit.i.i34 = lshr i32 %p1.addr.0.i21.i30, 31
197 %and6.i.i35 = and i32 %p1.addr.0.i21.i30, 1
198 %or.i22.i36 = or i32 %p1.addr.0.lobit.i.i34, %and6.i.i35
199 br label %if.end7.i.i39
200
201if.end7.i.i39:
202 %p1.addr.1.i.i38 = phi i32 [ %or.i22.i36, %if.then3.i.i37 ], [ %p1.addr.0.i21.i30, %if.end.i.i33 ]
203 br i1 %tobool.i19.i, label %if.then10.i.i42, label %if.end13.i.i46
204
205if.then10.i.i42:
206 %cmp11.i.i40 = icmp sgt i32 %p1.addr.1.i.i38, 0
207 %conv12.i.i41 = zext i1 %cmp11.i.i40 to i32
208 br label %if.end13.i.i46
209
210if.end13.i.i46:
211 %p1.addr.2.i.i43 = phi i32 [ %conv12.i.i41, %if.then10.i.i42 ], [ %p1.addr.1.i.i38, %if.end7.i.i39 ]
212 br i1 %tobool15.i.i, label %_Z3fn2iii.exit.i52, label %if.then16.i.i49
213
214if.then16.i.i49:
215 %and17.i.i47 = lshr i32 %p1.addr.2.i.i43, 3
216 %and17.lobit.i.i48 = and i32 %and17.i.i47, 1
217 br label %_Z3fn2iii.exit.i52
218
219_Z3fn2iii.exit.i52:
220 %p1.addr.3.i.i50 = phi i32 [ %and17.lobit.i.i48, %if.then16.i.i49 ], [ %p1.addr.2.i.i43, %if.end13.i.i46 ]
221 br i1 %tobool.i11.i, label %_ZL3fn3ii.exit58, label %if.then.i15.i56
222
223if.then.i15.i56:
224 %and.i12.i53 = lshr i32 %p1.addr.3.i.i50, 2
225 %and.lobit.i13.i54 = and i32 %and.i12.i53, 1
226 %12 = xor i32 %and.lobit.i13.i54, 1
227 %or.i14.i55 = or i32 %12, %p1.addr.3.i.i50
228 br label %_ZL3fn3ii.exit58
229
230_ZL3fn3ii.exit58:
231 %p1.addr.0.i16.i57 = phi i32 [ %or.i14.i55, %if.then.i15.i56 ], [ %p1.addr.3.i.i50, %_Z3fn2iii.exit.i52 ]
232 %arrayidx7 = getelementptr inbounds i32* %2, i64 %indvars.iv
233 store i32 %p1.addr.0.i16.i57, i32* %arrayidx7, align 4 %indvars.iv.next = add i64 %indvars.iv, 1
234 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
235 %exitcond = icmp ne i32 %lftr.wideiv, %p1
236 br i1 %exitcond, label %for.body, label %for.cond.for.end_crit_edge
237
238for.cond.for.end_crit_edge:
239 br label %for.end
240
241for.end:
242 ret void
243}