[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / multiple-loop-post-inc.ll
blob1a1ad39423d06d23ab8aea03b515f64580d47bde
1 ; RUN: llc -asm-verbose=false -disable-branch-fold -disable-block-placement -disable-tail-duplicate -mtriple=x86_64-- -mcpu=nehalem -no-integrated-as < %s | FileCheck %s
2 ; rdar://7236213
4 ; The scheduler's 2-address hack has been disabled, so there is
5 ; currently no good guarantee that this test will pass until the
6 ; machine scheduler develops an equivalent heuristic.
8 ; CodeGen shouldn't require any lea instructions inside the marked loop.
9 ; It should properly set up post-increment uses and do coalescing for
10 ; the induction variables.
12 ; CHECK: # Start
13 ; CHECK-NOT: lea
14 ; CHECK: # Stop
16 target 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"
18 define void @foo(ptr %I, i64 %IS, ptr nocapture %Start, ptr nocapture %Step, ptr %O, i64 %OS, i64 %N) nounwind {
19 entry:
20   %times4 = alloca float, align 4                 ; <ptr> [#uses=3]
21   %timesN = alloca float, align 4                 ; <ptr> [#uses=2]
22   %0 = load float, ptr %Step, align 4                 ; <float> [#uses=8]
23   %1 = ptrtoint ptr %I to i64                  ; <i64> [#uses=1]
24   %2 = ptrtoint ptr %O to i64                  ; <i64> [#uses=1]
25   %tmp = xor i64 %2, %1                           ; <i64> [#uses=1]
26   %tmp16 = and i64 %tmp, 15                       ; <i64> [#uses=1]
27   %3 = icmp eq i64 %tmp16, 0                      ; <i1> [#uses=1]
28   %4 = trunc i64 %IS to i32                       ; <i32> [#uses=1]
29   %5 = xor i32 %4, 1                              ; <i32> [#uses=1]
30   %6 = trunc i64 %OS to i32                       ; <i32> [#uses=1]
31   %7 = xor i32 %6, 1                              ; <i32> [#uses=1]
32   %8 = or i32 %7, %5                              ; <i32> [#uses=1]
33   %9 = icmp eq i32 %8, 0                          ; <i1> [#uses=1]
34   br i1 %9, label %bb, label %return
36 bb:                                               ; preds = %entry
37   %10 = load float, ptr %Start, align 4               ; <float> [#uses=1]
38   br label %bb2
40 bb1:                                              ; preds = %bb3
41   %11 = load float, ptr %I_addr.0, align 4            ; <float> [#uses=1]
42   %12 = fmul float %11, %x.0                      ; <float> [#uses=1]
43   store float %12, ptr %O_addr.0, align 4
44   %13 = fadd float %x.0, %0                       ; <float> [#uses=1]
45   %indvar.next53 = add i64 %14, 1                 ; <i64> [#uses=1]
46   br label %bb2
48 bb2:                                              ; preds = %bb1, %bb
49   %14 = phi i64 [ %indvar.next53, %bb1 ], [ 0, %bb ] ; <i64> [#uses=21]
50   %x.0 = phi float [ %13, %bb1 ], [ %10, %bb ]    ; <float> [#uses=6]
51   %N_addr.0 = sub i64 %N, %14                     ; <i64> [#uses=4]
52   %O_addr.0 = getelementptr float, ptr %O, i64 %14    ; <ptr> [#uses=4]
53   %I_addr.0 = getelementptr float, ptr %I, i64 %14    ; <ptr> [#uses=3]
54   %15 = icmp slt i64 %N_addr.0, 1                 ; <i1> [#uses=1]
55   br i1 %15, label %bb4, label %bb3
57 bb3:                                              ; preds = %bb2
58   %16 = ptrtoint ptr %O_addr.0 to i64          ; <i64> [#uses=1]
59   %17 = and i64 %16, 15                           ; <i64> [#uses=1]
60   %18 = icmp eq i64 %17, 0                        ; <i1> [#uses=1]
61   br i1 %18, label %bb4, label %bb1
63 bb4:                                              ; preds = %bb3, %bb2
64   %19 = fmul float %0, 4.000000e+00               ; <float> [#uses=1]
65   store float %19, ptr %times4, align 4
66   %20 = fmul float %0, 1.600000e+01               ; <float> [#uses=1]
67   store float %20, ptr %timesN, align 4
68   %21 = fmul float %0, 0.000000e+00               ; <float> [#uses=1]
69   %22 = fadd float %21, %x.0                      ; <float> [#uses=1]
70   %23 = fadd float %x.0, %0                       ; <float> [#uses=1]
71   %24 = fmul float %0, 2.000000e+00               ; <float> [#uses=1]
72   %25 = fadd float %24, %x.0                      ; <float> [#uses=1]
73   %26 = fmul float %0, 3.000000e+00               ; <float> [#uses=1]
74   %27 = fadd float %26, %x.0                      ; <float> [#uses=1]
75   %28 = insertelement <4 x float> undef, float %22, i32 0 ; <<4 x float>> [#uses=1]
76   %29 = insertelement <4 x float> %28, float %23, i32 1 ; <<4 x float>> [#uses=1]
77   %30 = insertelement <4 x float> %29, float %25, i32 2 ; <<4 x float>> [#uses=1]
78   %31 = insertelement <4 x float> %30, float %27, i32 3 ; <<4 x float>> [#uses=5]
79   %asmtmp.i = call <4 x float> asm "movss $1, $0\09\0Apshufd $$0, $0, $0", "=x,*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(float) %times4) nounwind ; <<4 x float>> [#uses=3]
80   %32 = fadd <4 x float> %31, %asmtmp.i           ; <<4 x float>> [#uses=3]
81   %33 = fadd <4 x float> %32, %asmtmp.i           ; <<4 x float>> [#uses=3]
82   %34 = fadd <4 x float> %33, %asmtmp.i           ; <<4 x float>> [#uses=2]
83   %asmtmp.i18 = call <4 x float> asm "movss $1, $0\09\0Apshufd $$0, $0, $0", "=x,*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(float) %timesN) nounwind ; <<4 x float>> [#uses=8]
84   %35 = icmp sgt i64 %N_addr.0, 15                ; <i1> [#uses=2]
85   br i1 %3, label %bb6.preheader, label %bb8
87 bb6.preheader:                                    ; preds = %bb4
88   br i1 %35, label %bb.nph43, label %bb7
90 bb.nph43:                                         ; preds = %bb6.preheader
91   %tmp108 = add i64 %14, 16                       ; <i64> [#uses=1]
92   %tmp111 = add i64 %14, 4                        ; <i64> [#uses=1]
93   %tmp115 = add i64 %14, 8                        ; <i64> [#uses=1]
94   %tmp119 = add i64 %14, 12                       ; <i64> [#uses=1]
95   %tmp134 = add i64 %N, -16                       ; <i64> [#uses=1]
96   %tmp135 = sub i64 %tmp134, %14                  ; <i64> [#uses=1]
97   call void asm sideeffect "# Start.", "~{dirflag},~{fpsr},~{flags}"() nounwind
98   br label %bb5
100 bb5:                                              ; preds = %bb.nph43, %bb5
101   %indvar102 = phi i64 [ 0, %bb.nph43 ], [ %indvar.next103, %bb5 ] ; <i64> [#uses=3]
102   %vX3.041 = phi <4 x float> [ %34, %bb.nph43 ], [ %45, %bb5 ] ; <<4 x float>> [#uses=2]
103   %vX0.039 = phi <4 x float> [ %31, %bb.nph43 ], [ %41, %bb5 ] ; <<4 x float>> [#uses=2]
104   %vX2.037 = phi <4 x float> [ %33, %bb.nph43 ], [ %46, %bb5 ] ; <<4 x float>> [#uses=2]
105   %vX1.036 = phi <4 x float> [ %32, %bb.nph43 ], [ %47, %bb5 ] ; <<4 x float>> [#uses=2]
106   %tmp104 = shl i64 %indvar102, 4                 ; <i64> [#uses=5]
107   %tmp105 = add i64 %14, %tmp104                  ; <i64> [#uses=2]
108   %scevgep106 = getelementptr float, ptr %I, i64 %tmp105 ; <ptr> [#uses=1]
109   %tmp109 = add i64 %tmp108, %tmp104              ; <i64> [#uses=2]
110   %tmp112 = add i64 %tmp111, %tmp104              ; <i64> [#uses=2]
111   %scevgep113 = getelementptr float, ptr %I, i64 %tmp112 ; <ptr> [#uses=1]
112   %tmp116 = add i64 %tmp115, %tmp104              ; <i64> [#uses=2]
113   %scevgep117 = getelementptr float, ptr %I, i64 %tmp116 ; <ptr> [#uses=1]
114   %tmp120 = add i64 %tmp119, %tmp104              ; <i64> [#uses=2]
115   %scevgep121 = getelementptr float, ptr %I, i64 %tmp120 ; <ptr> [#uses=1]
116   %scevgep123 = getelementptr float, ptr %O, i64 %tmp105 ; <ptr> [#uses=1]
117   %scevgep126 = getelementptr float, ptr %O, i64 %tmp112 ; <ptr> [#uses=1]
118   %scevgep128 = getelementptr float, ptr %O, i64 %tmp116 ; <ptr> [#uses=1]
119   %scevgep130 = getelementptr float, ptr %O, i64 %tmp120 ; <ptr> [#uses=1]
120   %tmp132 = mul i64 %indvar102, -16               ; <i64> [#uses=1]
121   %tmp136 = add i64 %tmp135, %tmp132              ; <i64> [#uses=2]
122   %36 = load <4 x float>, ptr %scevgep106, align 16 ; <<4 x float>> [#uses=1]
123   %37 = load <4 x float>, ptr %scevgep113, align 16 ; <<4 x float>> [#uses=1]
124   %38 = load <4 x float>, ptr %scevgep117, align 16 ; <<4 x float>> [#uses=1]
125   %39 = load <4 x float>, ptr %scevgep121, align 16 ; <<4 x float>> [#uses=1]
126   %40 = fmul <4 x float> %36, %vX0.039            ; <<4 x float>> [#uses=1]
127   %41 = fadd <4 x float> %vX0.039, %asmtmp.i18    ; <<4 x float>> [#uses=2]
128   %42 = fmul <4 x float> %37, %vX1.036            ; <<4 x float>> [#uses=1]
129   %43 = fmul <4 x float> %38, %vX2.037            ; <<4 x float>> [#uses=1]
130   %44 = fmul <4 x float> %39, %vX3.041            ; <<4 x float>> [#uses=1]
131   store <4 x float> %40, ptr %scevgep123, align 16
132   store <4 x float> %42, ptr %scevgep126, align 16
133   store <4 x float> %43, ptr %scevgep128, align 16
134   store <4 x float> %44, ptr %scevgep130, align 16
135   %45 = fadd <4 x float> %vX3.041, %asmtmp.i18    ; <<4 x float>> [#uses=1]
136   %46 = fadd <4 x float> %vX2.037, %asmtmp.i18    ; <<4 x float>> [#uses=1]
137   %47 = fadd <4 x float> %vX1.036, %asmtmp.i18    ; <<4 x float>> [#uses=1]
138   %48 = icmp sgt i64 %tmp136, 15                  ; <i1> [#uses=1]
139   %indvar.next103 = add i64 %indvar102, 1         ; <i64> [#uses=1]
140   br i1 %48, label %bb5, label %bb6.bb7_crit_edge
142 bb6.bb7_crit_edge:                                ; preds = %bb5
143   call void asm sideeffect "# Stop.", "~{dirflag},~{fpsr},~{flags}"() nounwind
144   %scevgep110 = getelementptr float, ptr %I, i64 %tmp109 ; <ptr> [#uses=1]
145   %scevgep125 = getelementptr float, ptr %O, i64 %tmp109 ; <ptr> [#uses=1]
146   br label %bb7
148 bb7:                                              ; preds = %bb6.bb7_crit_edge, %bb6.preheader
149   %I_addr.1.lcssa = phi ptr [ %scevgep110, %bb6.bb7_crit_edge ], [ %I_addr.0, %bb6.preheader ] ; <ptr> [#uses=1]
150   %O_addr.1.lcssa = phi ptr [ %scevgep125, %bb6.bb7_crit_edge ], [ %O_addr.0, %bb6.preheader ] ; <ptr> [#uses=1]
151   %vX0.0.lcssa = phi <4 x float> [ %41, %bb6.bb7_crit_edge ], [ %31, %bb6.preheader ] ; <<4 x float>> [#uses=1]
152   %N_addr.1.lcssa = phi i64 [ %tmp136, %bb6.bb7_crit_edge ], [ %N_addr.0, %bb6.preheader ] ; <i64> [#uses=1]
153   %asmtmp.i17 = call <4 x float> asm "movss $1, $0\09\0Apshufd $$0, $0, $0", "=x,*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(float) %times4) nounwind ; <<4 x float>> [#uses=0]
154   br label %bb11
156 bb8:                                              ; preds = %bb4
157   br i1 %35, label %bb.nph, label %bb11
159 bb.nph:                                           ; preds = %bb8
160   %I_addr.0.sum = add i64 %14, -1                 ; <i64> [#uses=1]
161   %49 = getelementptr inbounds float, ptr %I, i64 %I_addr.0.sum ; <ptr> [#uses=1]
162   %50 = load <4 x float>, ptr %49, align 16           ; <<4 x float>> [#uses=1]
163   %tmp54 = add i64 %14, 16                        ; <i64> [#uses=1]
164   %tmp56 = add i64 %14, 3                         ; <i64> [#uses=1]
165   %tmp60 = add i64 %14, 7                         ; <i64> [#uses=1]
166   %tmp64 = add i64 %14, 11                        ; <i64> [#uses=1]
167   %tmp68 = add i64 %14, 15                        ; <i64> [#uses=1]
168   %tmp76 = add i64 %14, 4                         ; <i64> [#uses=1]
169   %tmp80 = add i64 %14, 8                         ; <i64> [#uses=1]
170   %tmp84 = add i64 %14, 12                        ; <i64> [#uses=1]
171   %tmp90 = add i64 %N, -16                        ; <i64> [#uses=1]
172   %tmp91 = sub i64 %tmp90, %14                    ; <i64> [#uses=1]
173   br label %bb9
175 bb9:                                              ; preds = %bb.nph, %bb9
176   %indvar = phi i64 [ 0, %bb.nph ], [ %indvar.next, %bb9 ] ; <i64> [#uses=3]
177   %vX3.125 = phi <4 x float> [ %34, %bb.nph ], [ %68, %bb9 ] ; <<4 x float>> [#uses=2]
178   %vX0.223 = phi <4 x float> [ %31, %bb.nph ], [ %64, %bb9 ] ; <<4 x float>> [#uses=2]
179   %vX2.121 = phi <4 x float> [ %33, %bb.nph ], [ %69, %bb9 ] ; <<4 x float>> [#uses=2]
180   %vX1.120 = phi <4 x float> [ %32, %bb.nph ], [ %70, %bb9 ] ; <<4 x float>> [#uses=2]
181   %vI0.019 = phi <4 x float> [ %50, %bb.nph ], [ %54, %bb9 ] ; <<4 x float>> [#uses=1]
182   %tmp51 = shl i64 %indvar, 4                     ; <i64> [#uses=9]
183   %tmp55 = add i64 %tmp54, %tmp51                 ; <i64> [#uses=2]
184   %tmp57 = add i64 %tmp56, %tmp51                 ; <i64> [#uses=1]
185   %scevgep58 = getelementptr float, ptr %I, i64 %tmp57 ; <ptr> [#uses=1]
186   %tmp61 = add i64 %tmp60, %tmp51                 ; <i64> [#uses=1]
187   %scevgep62 = getelementptr float, ptr %I, i64 %tmp61 ; <ptr> [#uses=1]
188   %tmp65 = add i64 %tmp64, %tmp51                 ; <i64> [#uses=1]
189   %scevgep66 = getelementptr float, ptr %I, i64 %tmp65 ; <ptr> [#uses=1]
190   %tmp69 = add i64 %tmp68, %tmp51                 ; <i64> [#uses=1]
191   %scevgep70 = getelementptr float, ptr %I, i64 %tmp69 ; <ptr> [#uses=1]
192   %tmp72 = add i64 %14, %tmp51                    ; <i64> [#uses=1]
193   %scevgep73 = getelementptr float, ptr %O, i64 %tmp72 ; <ptr> [#uses=1]
194   %tmp77 = add i64 %tmp76, %tmp51                 ; <i64> [#uses=1]
195   %scevgep78 = getelementptr float, ptr %O, i64 %tmp77 ; <ptr> [#uses=1]
196   %tmp81 = add i64 %tmp80, %tmp51                 ; <i64> [#uses=1]
197   %scevgep82 = getelementptr float, ptr %O, i64 %tmp81 ; <ptr> [#uses=1]
198   %tmp85 = add i64 %tmp84, %tmp51                 ; <i64> [#uses=1]
199   %scevgep86 = getelementptr float, ptr %O, i64 %tmp85 ; <ptr> [#uses=1]
200   %tmp88 = mul i64 %indvar, -16                   ; <i64> [#uses=1]
201   %tmp92 = add i64 %tmp91, %tmp88                 ; <i64> [#uses=2]
202   %51 = load <4 x float>, ptr %scevgep58, align 16  ; <<4 x float>> [#uses=2]
203   %52 = load <4 x float>, ptr %scevgep62, align 16  ; <<4 x float>> [#uses=2]
204   %53 = load <4 x float>, ptr %scevgep66, align 16  ; <<4 x float>> [#uses=2]
205   %54 = load <4 x float>, ptr %scevgep70, align 16  ; <<4 x float>> [#uses=2]
206   %55 = shufflevector <4 x float> %vI0.019, <4 x float> %51, <4 x i32> <i32 4, i32 1, i32 2, i32 3> ; <<4 x float>> [#uses=1]
207   %56 = shufflevector <4 x float> %55, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0> ; <<4 x float>> [#uses=1]
208   %57 = shufflevector <4 x float> %51, <4 x float> %52, <4 x i32> <i32 4, i32 1, i32 2, i32 3> ; <<4 x float>> [#uses=1]
209   %58 = shufflevector <4 x float> %57, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0> ; <<4 x float>> [#uses=1]
210   %59 = shufflevector <4 x float> %52, <4 x float> %53, <4 x i32> <i32 4, i32 1, i32 2, i32 3> ; <<4 x float>> [#uses=1]
211   %60 = shufflevector <4 x float> %59, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0> ; <<4 x float>> [#uses=1]
212   %61 = shufflevector <4 x float> %53, <4 x float> %54, <4 x i32> <i32 4, i32 1, i32 2, i32 3> ; <<4 x float>> [#uses=1]
213   %62 = shufflevector <4 x float> %61, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0> ; <<4 x float>> [#uses=1]
214   %63 = fmul <4 x float> %56, %vX0.223            ; <<4 x float>> [#uses=1]
215   %64 = fadd <4 x float> %vX0.223, %asmtmp.i18    ; <<4 x float>> [#uses=2]
216   %65 = fmul <4 x float> %58, %vX1.120            ; <<4 x float>> [#uses=1]
217   %66 = fmul <4 x float> %60, %vX2.121            ; <<4 x float>> [#uses=1]
218   %67 = fmul <4 x float> %62, %vX3.125            ; <<4 x float>> [#uses=1]
219   store <4 x float> %63, ptr %scevgep73, align 16
220   store <4 x float> %65, ptr %scevgep78, align 16
221   store <4 x float> %66, ptr %scevgep82, align 16
222   store <4 x float> %67, ptr %scevgep86, align 16
223   %68 = fadd <4 x float> %vX3.125, %asmtmp.i18    ; <<4 x float>> [#uses=1]
224   %69 = fadd <4 x float> %vX2.121, %asmtmp.i18    ; <<4 x float>> [#uses=1]
225   %70 = fadd <4 x float> %vX1.120, %asmtmp.i18    ; <<4 x float>> [#uses=1]
226   %71 = icmp sgt i64 %tmp92, 15                   ; <i1> [#uses=1]
227   %indvar.next = add i64 %indvar, 1               ; <i64> [#uses=1]
228   br i1 %71, label %bb9, label %bb10.bb11.loopexit_crit_edge
230 bb10.bb11.loopexit_crit_edge:                     ; preds = %bb9
231   %scevgep = getelementptr float, ptr %I, i64 %tmp55  ; <ptr> [#uses=1]
232   %scevgep75 = getelementptr float, ptr %O, i64 %tmp55 ; <ptr> [#uses=1]
233   br label %bb11
235 bb11:                                             ; preds = %bb8, %bb10.bb11.loopexit_crit_edge, %bb7
236   %N_addr.2 = phi i64 [ %N_addr.1.lcssa, %bb7 ], [ %tmp92, %bb10.bb11.loopexit_crit_edge ], [ %N_addr.0, %bb8 ] ; <i64> [#uses=2]
237   %vX0.1 = phi <4 x float> [ %vX0.0.lcssa, %bb7 ], [ %64, %bb10.bb11.loopexit_crit_edge ], [ %31, %bb8 ] ; <<4 x float>> [#uses=1]
238   %O_addr.2 = phi ptr [ %O_addr.1.lcssa, %bb7 ], [ %scevgep75, %bb10.bb11.loopexit_crit_edge ], [ %O_addr.0, %bb8 ] ; <ptr> [#uses=1]
239   %I_addr.2 = phi ptr [ %I_addr.1.lcssa, %bb7 ], [ %scevgep, %bb10.bb11.loopexit_crit_edge ], [ %I_addr.0, %bb8 ] ; <ptr> [#uses=1]
240   %72 = extractelement <4 x float> %vX0.1, i32 0  ; <float> [#uses=2]
241   %73 = icmp sgt i64 %N_addr.2, 0                 ; <i1> [#uses=1]
242   br i1 %73, label %bb12, label %bb14
244 bb12:                                             ; preds = %bb11, %bb12
245   %indvar94 = phi i64 [ %indvar.next95, %bb12 ], [ 0, %bb11 ] ; <i64> [#uses=3]
246   %x.130 = phi float [ %76, %bb12 ], [ %72, %bb11 ] ; <float> [#uses=2]
247   %I_addr.433 = getelementptr float, ptr %I_addr.2, i64 %indvar94 ; <ptr> [#uses=1]
248   %O_addr.432 = getelementptr float, ptr %O_addr.2, i64 %indvar94 ; <ptr> [#uses=1]
249   %74 = load float, ptr %I_addr.433, align 4          ; <float> [#uses=1]
250   %75 = fmul float %74, %x.130                    ; <float> [#uses=1]
251   store float %75, ptr %O_addr.432, align 4
252   %76 = fadd float %x.130, %0                     ; <float> [#uses=2]
253   %indvar.next95 = add i64 %indvar94, 1           ; <i64> [#uses=2]
254   %exitcond = icmp eq i64 %indvar.next95, %N_addr.2 ; <i1> [#uses=1]
255   br i1 %exitcond, label %bb14, label %bb12
257 bb14:                                             ; preds = %bb12, %bb11
258   %x.1.lcssa = phi float [ %72, %bb11 ], [ %76, %bb12 ] ; <float> [#uses=1]
259   store float %x.1.lcssa, ptr %Start, align 4
260   ret void
262 return:                                           ; preds = %entry
263   ret void
266 ; Codegen shouldn't crash on this testcase.
268 define void @bar(i32 %a, i32 %b) nounwind {
269 entry:                           ; preds = %bb1, %entry, %for.end204
270   br label %outer
272 outer:                                     ; preds = %bb1, %entry
273   %i6 = phi i32 [ %storemerge171, %bb1 ], [ %a, %entry ] ; <i32> [#uses=2]
274   %storemerge171 = add i32 %i6, 1      ; <i32> [#uses=1]
275   br label %inner
277 inner:                                       ; preds = %bb0, %if.end275
278   %i8 = phi i32 [ %a, %outer ], [ %indvar.next159, %bb0 ] ; <i32> [#uses=2]
279   %t338 = load i32, ptr undef                     ; <i32> [#uses=1]
280   %t191 = mul i32 %i8, %t338        ; <i32> [#uses=1]
281   %t179 = add i32 %i6, %t191        ; <i32> [#uses=1]
282   br label %bb0
284 bb0:                                     ; preds = %for.body332
285   %indvar.next159 = add i32 %i8, 1     ; <i32> [#uses=1]
286   br i1 undef, label %bb1, label %inner
288 bb1:                                     ; preds = %bb0, %outer
289   %midx.4 = phi i32 [ %t179, %bb0 ] ; <i32> [#uses=0]
290   br label %outer