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