292 lines · plain
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 %s2; rdar://72362133;4; The scheduler's 2-address hack has been disabled, so there is5; currently no good guarantee that this test will pass until the6; machine scheduler develops an equivalent heuristic.7 8; CodeGen shouldn't require any lea instructions inside the marked loop.9; It should properly set up post-increment uses and do coalescing for10; the induction variables.11 12; CHECK: # Start13; CHECK-NOT: lea14; CHECK: # Stop15 16target 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 18define void @foo(ptr %I, i64 %IS, ptr nocapture %Start, ptr nocapture %Step, ptr %O, i64 %OS, i64 %N) nounwind {19entry: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 %return35 36bb: ; preds = %entry37 %10 = load float, ptr %Start, align 4 ; <float> [#uses=1]38 br label %bb239 40bb1: ; preds = %bb341 %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 444 %13 = fadd float %x.0, %0 ; <float> [#uses=1]45 %indvar.next53 = add i64 %14, 1 ; <i64> [#uses=1]46 br label %bb247 48bb2: ; preds = %bb1, %bb49 %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 %bb356 57bb3: ; preds = %bb258 %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 %bb162 63bb4: ; preds = %bb3, %bb264 %19 = fmul float %0, 4.000000e+00 ; <float> [#uses=1]65 store float %19, ptr %times4, align 466 %20 = fmul float %0, 1.600000e+01 ; <float> [#uses=1]67 store float %20, ptr %timesN, align 468 %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 %bb886 87bb6.preheader: ; preds = %bb488 br i1 %35, label %bb.nph43, label %bb789 90bb.nph43: ; preds = %bb6.preheader91 %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}"() nounwind98 br label %bb599 100bb5: ; preds = %bb.nph43, %bb5101 %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 16132 store <4 x float> %42, ptr %scevgep126, align 16133 store <4 x float> %43, ptr %scevgep128, align 16134 store <4 x float> %44, ptr %scevgep130, align 16135 %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_edge141 142bb6.bb7_crit_edge: ; preds = %bb5143 call void asm sideeffect "# Stop.", "~{dirflag},~{fpsr},~{flags}"() nounwind144 %scevgep110 = getelementptr float, ptr %I, i64 %tmp109 ; <ptr> [#uses=1]145 %scevgep125 = getelementptr float, ptr %O, i64 %tmp109 ; <ptr> [#uses=1]146 br label %bb7147 148bb7: ; preds = %bb6.bb7_crit_edge, %bb6.preheader149 %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 %bb11155 156bb8: ; preds = %bb4157 br i1 %35, label %bb.nph, label %bb11158 159bb.nph: ; preds = %bb8160 %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 %bb9174 175bb9: ; preds = %bb.nph, %bb9176 %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 16220 store <4 x float> %65, ptr %scevgep78, align 16221 store <4 x float> %66, ptr %scevgep82, align 16222 store <4 x float> %67, ptr %scevgep86, align 16223 %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_edge229 230bb10.bb11.loopexit_crit_edge: ; preds = %bb9231 %scevgep = getelementptr float, ptr %I, i64 %tmp55 ; <ptr> [#uses=1]232 %scevgep75 = getelementptr float, ptr %O, i64 %tmp55 ; <ptr> [#uses=1]233 br label %bb11234 235bb11: ; preds = %bb8, %bb10.bb11.loopexit_crit_edge, %bb7236 %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 %bb14243 244bb12: ; preds = %bb11, %bb12245 %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 4252 %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 %bb12256 257bb14: ; preds = %bb12, %bb11258 %x.1.lcssa = phi float [ %72, %bb11 ], [ %76, %bb12 ] ; <float> [#uses=1]259 store float %x.1.lcssa, ptr %Start, align 4260 ret void261 262return: ; preds = %entry263 ret void264}265 266; Codegen shouldn't crash on this testcase.267 268define void @bar(i32 %a, i32 %b, i1 %arg) nounwind {269entry: ; preds = %bb1, %entry, %for.end204270 br label %outer271 272outer: ; preds = %bb1, %entry273 %i6 = phi i32 [ %storemerge171, %bb1 ], [ %a, %entry ] ; <i32> [#uses=2]274 %storemerge171 = add i32 %i6, 1 ; <i32> [#uses=1]275 br label %inner276 277inner: ; preds = %bb0, %if.end275278 %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 %bb0283 284bb0: ; preds = %for.body332285 %indvar.next159 = add i32 %i8, 1 ; <i32> [#uses=1]286 br i1 %arg, label %bb1, label %inner287 288bb1: ; preds = %bb0, %outer289 %midx.4 = phi i32 [ %t179, %bb0 ] ; <i32> [#uses=0]290 br label %outer291}292