Remove -enable-lsr-nested in time for 3.1.

Tests cases have been removed but attached to open PR12330.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153286 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Andrew Trick 2012-03-22 22:42:45 +00:00
parent ee5a53d21e
commit bd618f1b7f
6 changed files with 10 additions and 1167 deletions

View File

@ -77,9 +77,6 @@
#include <algorithm>
using namespace llvm;
static cl::opt<bool> EnableNested(
"enable-lsr-nested", cl::Hidden, cl::desc("Enable LSR on nested loops"));
static cl::opt<bool> EnableRetry(
"enable-lsr-retry", cl::Hidden, cl::desc("Enable LSR retry"));
@ -824,36 +821,20 @@ void Cost::RateRegister(const SCEV *Reg,
const Loop *L,
ScalarEvolution &SE, DominatorTree &DT) {
if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(Reg)) {
if (AR->getLoop() == L)
AddRecCost += 1; /// TODO: This should be a function of the stride.
// If this is an addrec for another loop, don't second-guess its addrec phi
// nodes. LSR isn't currently smart enough to reason about more than one
// loop at a time. LSR has either already run on inner loops, will not run
// on other loops, and cannot be expected to change sibling loops. If the
// AddRec exists, consider it's register free and leave it alone. Otherwise,
// do not consider this formula at all.
else if (!EnableNested || L->contains(AR->getLoop()) ||
(!AR->getLoop()->contains(L) &&
DT.dominates(L->getHeader(), AR->getLoop()->getHeader()))) {
// loop at a time. LSR has already run on inner loops, will not run on outer
// loops, and cannot be expected to change sibling loops.
if (AR->getLoop() != L) {
// If the AddRec exists, consider it's register free and leave it alone.
if (isExistingPhi(AR, SE))
return;
// For !EnableNested, never rewrite IVs in other loops.
if (!EnableNested) {
Loose();
return;
}
// If this isn't one of the addrecs that the loop already has, it
// would require a costly new phi and add. TODO: This isn't
// precisely modeled right now.
++NumBaseAdds;
if (!Regs.count(AR->getStart())) {
RateRegister(AR->getStart(), Regs, L, SE, DT);
if (isLoser())
return;
}
// Otherwise, do not consider this formula at all.
Loose();
return;
}
AddRecCost += 1; /// TODO: This should be a function of the stride.
// Add the step value register, if it needs one.
// TODO: The non-affine case isn't precisely modeled here.
@ -2193,7 +2174,7 @@ void LSRInstance::CollectInterestingTypesAndFactors() {
do {
const SCEV *S = Worklist.pop_back_val();
if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S)) {
if (EnableNested || AR->getLoop() == L)
if (AR->getLoop() == L)
Strides.insert(AR->getStepRecurrence(SE));
Worklist.push_back(AR->getStart());
} else if (const SCEVAddExpr *Add = dyn_cast<SCEVAddExpr>(S)) {
@ -4566,7 +4547,7 @@ LSRInstance::LSRInstance(const TargetLowering *tli, Loop *l, Pass *P)
if (IU.empty()) return;
// Skip nested loops until we can model them better with formulae.
if (!EnableNested && !L->empty()) {
if (!L->empty()) {
DEBUG(dbgs() << "LSR skipping outer loop " << *L << "\n");
return;
}

View File

@ -1,640 +0,0 @@
; RUN: llc -mtriple=thumbv7-apple-darwin10 -mcpu=cortex-a8 -enable-lsr-nested < %s | FileCheck %s
; LSR should recognize that this is an unrolled loop which can use
; constant offset addressing, so that each of the following stores
; uses the same register.
; CHECK: vstr s{{.*}}, [{{(r[0-9]+)|(lr)}}, #32]
; CHECK: vstr s{{.*}}, [{{(r[0-9]+)|(lr)}}, #64]
; CHECK: vstr s{{.*}}, [{{(r[0-9]+)|(lr)}}, #96]
; We can also save a register in the outer loop, but that requires
; performing LSR on the outer loop.
target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32-n32"
%0 = type { %1*, %3*, %6*, i8*, i32, i32, %8*, i32, i32, i32, i32, i32, i32, i32, double, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i8**, i32, i32, i32, i32, i32, [64 x i32]*, [4 x %9*], [4 x %10*], [4 x %10*], i32, %11*, i32, i32, [16 x i8], [16 x i8], [16 x i8], i32, i32, i8, i8, i8, i16, i16, i32, i8, i32, %12*, i32, i32, i32, i32, i8*, i32, [4 x %11*], i32, i32, i32, [10 x i32], i32, i32, i32, i32, i32, %13*, %14*, %15*, %16*, %17*, %18*, %19*, %20*, %21*, %22*, %23* }
%1 = type { void (%2*)*, void (%2*, i32)*, void (%2*)*, void (%2*, i8*)*, void (%2*)*, i32, %7, i32, i32, i8**, i32, i8**, i32, i32 }
%2 = type { %1*, %3*, %6*, i8*, i32, i32 }
%3 = type { i8* (%2*, i32, i32)*, i8* (%2*, i32, i32)*, i8** (%2*, i32, i32, i32)*, [64 x i16]** (%2*, i32, i32, i32)*, %4* (%2*, i32, i32, i32, i32, i32)*, %5* (%2*, i32, i32, i32, i32, i32)*, void (%2*)*, i8** (%2*, %4*, i32, i32, i32)*, [64 x i16]** (%2*, %5*, i32, i32, i32)*, void (%2*, i32)*, void (%2*)*, i32, i32 }
%4 = type opaque
%5 = type opaque
%6 = type { void (%2*)*, i32, i32, i32, i32 }
%7 = type { [8 x i32], [12 x i32] }
%8 = type { i8*, i32, void (%0*)*, i32 (%0*)*, void (%0*, i32)*, i32 (%0*, i32)*, void (%0*)* }
%9 = type { [64 x i16], i32 }
%10 = type { [17 x i8], [256 x i8], i32 }
%11 = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, %9*, i8* }
%12 = type { %12*, i8, i32, i32, i8* }
%13 = type { void (%0*)*, void (%0*)*, i32 }
%14 = type { void (%0*, i32)*, void (%0*, i8**, i32*, i32)* }
%15 = type { void (%0*)*, i32 (%0*)*, void (%0*)*, i32 (%0*, i8***)*, %5** }
%16 = type { void (%0*, i32)*, void (%0*, i8***, i32*, i32, i8**, i32*, i32)* }
%17 = type { i32 (%0*)*, void (%0*)*, void (%0*)*, void (%0*)*, i32, i32 }
%18 = type { void (%0*)*, i32 (%0*)*, i32 (%0*)*, i32, i32, i32, i32 }
%19 = type { void (%0*)*, i32 (%0*, [64 x i16]**)*, i32 }
%20 = type { void (%0*)*, [10 x void (%0*, %11*, i16*, i8**, i32)*] }
%21 = type { void (%0*)*, void (%0*, i8***, i32*, i32, i8**, i32*, i32)*, i32 }
%22 = type { void (%0*)*, void (%0*, i8***, i32, i8**, i32)* }
%23 = type { void (%0*, i32)*, void (%0*, i8**, i8**, i32)*, void (%0*)*, void (%0*)* }
define void @test(%0* nocapture %a0, %11* nocapture %a1, i16* nocapture %a2, i8** nocapture %a3, i32 %a4) nounwind {
bb:
%t = alloca [64 x float], align 4
%t5 = getelementptr inbounds %0* %a0, i32 0, i32 65
%t6 = load i8** %t5, align 4
%t7 = getelementptr inbounds %11* %a1, i32 0, i32 20
%t8 = load i8** %t7, align 4
br label %bb9
bb9:
%t10 = phi i32 [ 0, %bb ], [ %t157, %bb156 ]
%t11 = add i32 %t10, 8
%t12 = getelementptr [64 x float]* %t, i32 0, i32 %t11
%t13 = add i32 %t10, 16
%t14 = getelementptr [64 x float]* %t, i32 0, i32 %t13
%t15 = add i32 %t10, 24
%t16 = getelementptr [64 x float]* %t, i32 0, i32 %t15
%t17 = add i32 %t10, 32
%t18 = getelementptr [64 x float]* %t, i32 0, i32 %t17
%t19 = add i32 %t10, 40
%t20 = getelementptr [64 x float]* %t, i32 0, i32 %t19
%t21 = add i32 %t10, 48
%t22 = getelementptr [64 x float]* %t, i32 0, i32 %t21
%t23 = add i32 %t10, 56
%t24 = getelementptr [64 x float]* %t, i32 0, i32 %t23
%t25 = getelementptr [64 x float]* %t, i32 0, i32 %t10
%t26 = shl i32 %t10, 5
%t27 = or i32 %t26, 8
%t28 = getelementptr i8* %t8, i32 %t27
%t29 = bitcast i8* %t28 to float*
%t30 = or i32 %t26, 16
%t31 = getelementptr i8* %t8, i32 %t30
%t32 = bitcast i8* %t31 to float*
%t33 = or i32 %t26, 24
%t34 = getelementptr i8* %t8, i32 %t33
%t35 = bitcast i8* %t34 to float*
%t36 = or i32 %t26, 4
%t37 = getelementptr i8* %t8, i32 %t36
%t38 = bitcast i8* %t37 to float*
%t39 = or i32 %t26, 12
%t40 = getelementptr i8* %t8, i32 %t39
%t41 = bitcast i8* %t40 to float*
%t42 = or i32 %t26, 20
%t43 = getelementptr i8* %t8, i32 %t42
%t44 = bitcast i8* %t43 to float*
%t45 = or i32 %t26, 28
%t46 = getelementptr i8* %t8, i32 %t45
%t47 = bitcast i8* %t46 to float*
%t48 = getelementptr i8* %t8, i32 %t26
%t49 = bitcast i8* %t48 to float*
%t50 = shl i32 %t10, 3
%t51 = or i32 %t50, 1
%t52 = getelementptr i16* %a2, i32 %t51
%t53 = or i32 %t50, 2
%t54 = getelementptr i16* %a2, i32 %t53
%t55 = or i32 %t50, 3
%t56 = getelementptr i16* %a2, i32 %t55
%t57 = or i32 %t50, 4
%t58 = getelementptr i16* %a2, i32 %t57
%t59 = or i32 %t50, 5
%t60 = getelementptr i16* %a2, i32 %t59
%t61 = or i32 %t50, 6
%t62 = getelementptr i16* %a2, i32 %t61
%t63 = or i32 %t50, 7
%t64 = getelementptr i16* %a2, i32 %t63
%t65 = getelementptr i16* %a2, i32 %t50
%t66 = load i16* %t52, align 2
%t67 = icmp eq i16 %t66, 0
%t68 = load i16* %t54, align 2
%t69 = icmp eq i16 %t68, 0
%t70 = and i1 %t67, %t69
br i1 %t70, label %bb71, label %bb91
bb71:
%t72 = load i16* %t56, align 2
%t73 = icmp eq i16 %t72, 0
br i1 %t73, label %bb74, label %bb91
bb74:
%t75 = load i16* %t58, align 2
%t76 = icmp eq i16 %t75, 0
br i1 %t76, label %bb77, label %bb91
bb77:
%t78 = load i16* %t60, align 2
%t79 = icmp eq i16 %t78, 0
br i1 %t79, label %bb80, label %bb91
bb80:
%t81 = load i16* %t62, align 2
%t82 = icmp eq i16 %t81, 0
br i1 %t82, label %bb83, label %bb91
bb83:
%t84 = load i16* %t64, align 2
%t85 = icmp eq i16 %t84, 0
br i1 %t85, label %bb86, label %bb91
bb86:
%t87 = load i16* %t65, align 2
%t88 = sitofp i16 %t87 to float
%t89 = load float* %t49, align 4
%t90 = fmul float %t88, %t89
store float %t90, float* %t25, align 4
store float %t90, float* %t12, align 4
store float %t90, float* %t14, align 4
store float %t90, float* %t16, align 4
store float %t90, float* %t18, align 4
store float %t90, float* %t20, align 4
store float %t90, float* %t22, align 4
store float %t90, float* %t24, align 4
br label %bb156
bb91:
%t92 = load i16* %t65, align 2
%t93 = sitofp i16 %t92 to float
%t94 = load float* %t49, align 4
%t95 = fmul float %t93, %t94
%t96 = sitofp i16 %t68 to float
%t97 = load float* %t29, align 4
%t98 = fmul float %t96, %t97
%t99 = load i16* %t58, align 2
%t100 = sitofp i16 %t99 to float
%t101 = load float* %t32, align 4
%t102 = fmul float %t100, %t101
%t103 = load i16* %t62, align 2
%t104 = sitofp i16 %t103 to float
%t105 = load float* %t35, align 4
%t106 = fmul float %t104, %t105
%t107 = fadd float %t95, %t102
%t108 = fsub float %t95, %t102
%t109 = fadd float %t98, %t106
%t110 = fsub float %t98, %t106
%t111 = fmul float %t110, 0x3FF6A09E60000000
%t112 = fsub float %t111, %t109
%t113 = fadd float %t107, %t109
%t114 = fsub float %t107, %t109
%t115 = fadd float %t108, %t112
%t116 = fsub float %t108, %t112
%t117 = sitofp i16 %t66 to float
%t118 = load float* %t38, align 4
%t119 = fmul float %t117, %t118
%t120 = load i16* %t56, align 2
%t121 = sitofp i16 %t120 to float
%t122 = load float* %t41, align 4
%t123 = fmul float %t121, %t122
%t124 = load i16* %t60, align 2
%t125 = sitofp i16 %t124 to float
%t126 = load float* %t44, align 4
%t127 = fmul float %t125, %t126
%t128 = load i16* %t64, align 2
%t129 = sitofp i16 %t128 to float
%t130 = load float* %t47, align 4
%t131 = fmul float %t129, %t130
%t132 = fadd float %t127, %t123
%t133 = fsub float %t127, %t123
%t134 = fadd float %t119, %t131
%t135 = fsub float %t119, %t131
%t136 = fadd float %t134, %t132
%t137 = fsub float %t134, %t132
%t138 = fmul float %t137, 0x3FF6A09E60000000
%t139 = fadd float %t133, %t135
%t140 = fmul float %t139, 0x3FFD906BC0000000
%t141 = fmul float %t135, 0x3FF1517A80000000
%t142 = fsub float %t141, %t140
%t143 = fmul float %t133, 0xC004E7AEA0000000
%t144 = fadd float %t143, %t140
%t145 = fsub float %t144, %t136
%t146 = fsub float %t138, %t145
%t147 = fadd float %t142, %t146
%t148 = fadd float %t113, %t136
store float %t148, float* %t25, align 4
%t149 = fsub float %t113, %t136
store float %t149, float* %t24, align 4
%t150 = fadd float %t115, %t145
store float %t150, float* %t12, align 4
%t151 = fsub float %t115, %t145
store float %t151, float* %t22, align 4
%t152 = fadd float %t116, %t146
store float %t152, float* %t14, align 4
%t153 = fsub float %t116, %t146
store float %t153, float* %t20, align 4
%t154 = fadd float %t114, %t147
store float %t154, float* %t18, align 4
%t155 = fsub float %t114, %t147
store float %t155, float* %t16, align 4
br label %bb156
bb156:
%t157 = add i32 %t10, 1
%t158 = icmp eq i32 %t157, 8
br i1 %t158, label %bb159, label %bb9
bb159:
%t160 = add i32 %a4, 7
%t161 = add i32 %a4, 1
%t162 = add i32 %a4, 6
%t163 = add i32 %a4, 2
%t164 = add i32 %a4, 5
%t165 = add i32 %a4, 4
%t166 = add i32 %a4, 3
br label %bb167
bb167:
%t168 = phi i32 [ 0, %bb159 ], [ %t293, %bb167 ]
%t169 = getelementptr i8** %a3, i32 %t168
%t170 = shl i32 %t168, 3
%t171 = or i32 %t170, 4
%t172 = getelementptr [64 x float]* %t, i32 0, i32 %t171
%t173 = or i32 %t170, 2
%t174 = getelementptr [64 x float]* %t, i32 0, i32 %t173
%t175 = or i32 %t170, 6
%t176 = getelementptr [64 x float]* %t, i32 0, i32 %t175
%t177 = or i32 %t170, 5
%t178 = getelementptr [64 x float]* %t, i32 0, i32 %t177
%t179 = or i32 %t170, 3
%t180 = getelementptr [64 x float]* %t, i32 0, i32 %t179
%t181 = or i32 %t170, 1
%t182 = getelementptr [64 x float]* %t, i32 0, i32 %t181
%t183 = or i32 %t170, 7
%t184 = getelementptr [64 x float]* %t, i32 0, i32 %t183
%t185 = getelementptr [64 x float]* %t, i32 0, i32 %t170
%t186 = load i8** %t169, align 4
%t187 = getelementptr inbounds i8* %t186, i32 %a4
%t188 = load float* %t185, align 4
%t189 = load float* %t172, align 4
%t190 = fadd float %t188, %t189
%t191 = fsub float %t188, %t189
%t192 = load float* %t174, align 4
%t193 = load float* %t176, align 4
%t194 = fadd float %t192, %t193
%t195 = fsub float %t192, %t193
%t196 = fmul float %t195, 0x3FF6A09E60000000
%t197 = fsub float %t196, %t194
%t198 = fadd float %t190, %t194
%t199 = fsub float %t190, %t194
%t200 = fadd float %t191, %t197
%t201 = fsub float %t191, %t197
%t202 = load float* %t178, align 4
%t203 = load float* %t180, align 4
%t204 = fadd float %t202, %t203
%t205 = fsub float %t202, %t203
%t206 = load float* %t182, align 4
%t207 = load float* %t184, align 4
%t208 = fadd float %t206, %t207
%t209 = fsub float %t206, %t207
%t210 = fadd float %t208, %t204
%t211 = fsub float %t208, %t204
%t212 = fmul float %t211, 0x3FF6A09E60000000
%t213 = fadd float %t205, %t209
%t214 = fmul float %t213, 0x3FFD906BC0000000
%t215 = fmul float %t209, 0x3FF1517A80000000
%t216 = fsub float %t215, %t214
%t217 = fmul float %t205, 0xC004E7AEA0000000
%t218 = fadd float %t217, %t214
%t219 = fsub float %t218, %t210
%t220 = fsub float %t212, %t219
%t221 = fadd float %t216, %t220
%t222 = fadd float %t198, %t210
%t223 = fptosi float %t222 to i32
%t224 = add nsw i32 %t223, 4
%t225 = lshr i32 %t224, 3
%t226 = and i32 %t225, 1023
%t227 = add i32 %t226, 128
%t228 = getelementptr inbounds i8* %t6, i32 %t227
%t229 = load i8* %t228, align 1
store i8 %t229, i8* %t187, align 1
%t230 = fsub float %t198, %t210
%t231 = fptosi float %t230 to i32
%t232 = add nsw i32 %t231, 4
%t233 = lshr i32 %t232, 3
%t234 = and i32 %t233, 1023
%t235 = add i32 %t234, 128
%t236 = getelementptr inbounds i8* %t6, i32 %t235
%t237 = load i8* %t236, align 1
%t238 = getelementptr inbounds i8* %t186, i32 %t160
store i8 %t237, i8* %t238, align 1
%t239 = fadd float %t200, %t219
%t240 = fptosi float %t239 to i32
%t241 = add nsw i32 %t240, 4
%t242 = lshr i32 %t241, 3
%t243 = and i32 %t242, 1023
%t244 = add i32 %t243, 128
%t245 = getelementptr inbounds i8* %t6, i32 %t244
%t246 = load i8* %t245, align 1
%t247 = getelementptr inbounds i8* %t186, i32 %t161
store i8 %t246, i8* %t247, align 1
%t248 = fsub float %t200, %t219
%t249 = fptosi float %t248 to i32
%t250 = add nsw i32 %t249, 4
%t251 = lshr i32 %t250, 3
%t252 = and i32 %t251, 1023
%t253 = add i32 %t252, 128
%t254 = getelementptr inbounds i8* %t6, i32 %t253
%t255 = load i8* %t254, align 1
%t256 = getelementptr inbounds i8* %t186, i32 %t162
store i8 %t255, i8* %t256, align 1
%t257 = fadd float %t201, %t220
%t258 = fptosi float %t257 to i32
%t259 = add nsw i32 %t258, 4
%t260 = lshr i32 %t259, 3
%t261 = and i32 %t260, 1023
%t262 = add i32 %t261, 128
%t263 = getelementptr inbounds i8* %t6, i32 %t262
%t264 = load i8* %t263, align 1
%t265 = getelementptr inbounds i8* %t186, i32 %t163
store i8 %t264, i8* %t265, align 1
%t266 = fsub float %t201, %t220
%t267 = fptosi float %t266 to i32
%t268 = add nsw i32 %t267, 4
%t269 = lshr i32 %t268, 3
%t270 = and i32 %t269, 1023
%t271 = add i32 %t270, 128
%t272 = getelementptr inbounds i8* %t6, i32 %t271
%t273 = load i8* %t272, align 1
%t274 = getelementptr inbounds i8* %t186, i32 %t164
store i8 %t273, i8* %t274, align 1
%t275 = fadd float %t199, %t221
%t276 = fptosi float %t275 to i32
%t277 = add nsw i32 %t276, 4
%t278 = lshr i32 %t277, 3
%t279 = and i32 %t278, 1023
%t280 = add i32 %t279, 128
%t281 = getelementptr inbounds i8* %t6, i32 %t280
%t282 = load i8* %t281, align 1
%t283 = getelementptr inbounds i8* %t186, i32 %t165
store i8 %t282, i8* %t283, align 1
%t284 = fsub float %t199, %t221
%t285 = fptosi float %t284 to i32
%t286 = add nsw i32 %t285, 4
%t287 = lshr i32 %t286, 3
%t288 = and i32 %t287, 1023
%t289 = add i32 %t288, 128
%t290 = getelementptr inbounds i8* %t6, i32 %t289
%t291 = load i8* %t290, align 1
%t292 = getelementptr inbounds i8* %t186, i32 %t166
store i8 %t291, i8* %t292, align 1
%t293 = add nsw i32 %t168, 1
%t294 = icmp eq i32 %t293, 8
br i1 %t294, label %bb295, label %bb167
bb295:
ret void
}
%struct.ct_data_s = type { %union.anon, %union.anon }
%struct.gz_header = type { i32, i32, i32, i32, i8*, i32, i32, i8*, i32, i8*, i32, i32, i32 }
%struct.internal_state = type { %struct.z_stream*, i32, i8*, i32, i8*, i32, i32, %struct.gz_header*, i32, i8, i32, i32, i32, i32, i8*, i32, i16*, i16*, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [573 x %struct.ct_data_s], [61 x %struct.ct_data_s], [39 x %struct.ct_data_s], %struct.tree_desc_s, %struct.tree_desc_s, %struct.tree_desc_s, [16 x i16], [573 x i32], i32, i32, [573 x i8], i8*, i32, i32, i16*, i32, i32, i32, i32, i16, i32 }
%struct.static_tree_desc = type { i32 }
%struct.tree_desc_s = type { %struct.ct_data_s*, i32, %struct.static_tree_desc* }
%struct.z_stream = type { i8*, i32, i32, i8*, i32, i32, i8*, %struct.internal_state*, i8* (i8*, i32, i32)*, void (i8*, i8*)*, i8*, i32, i32, i32 }
%union.anon = type { i16 }
define i32 @longest_match(%struct.internal_state* %s, i32 %cur_match) nounwind optsize {
entry:
%0 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 31 ; <i32*> [#uses=1]
%1 = load i32* %0, align 4 ; <i32> [#uses=2]
%2 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 14 ; <i8**> [#uses=1]
%3 = load i8** %2, align 4 ; <i8*> [#uses=27]
%4 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 27 ; <i32*> [#uses=1]
%5 = load i32* %4, align 4 ; <i32> [#uses=17]
%6 = getelementptr inbounds i8* %3, i32 %5 ; <i8*> [#uses=1]
%7 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 30 ; <i32*> [#uses=1]
%8 = load i32* %7, align 4 ; <i32> [#uses=4]
%9 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 36 ; <i32*> [#uses=1]
%10 = load i32* %9, align 4 ; <i32> [#uses=2]
%11 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 11 ; <i32*> [#uses=1]
%12 = load i32* %11, align 4 ; <i32> [#uses=2]
%13 = add i32 %12, -262 ; <i32> [#uses=1]
%14 = icmp ugt i32 %5, %13 ; <i1> [#uses=1]
br i1 %14, label %bb, label %bb2
bb: ; preds = %entry
%15 = add i32 %5, 262 ; <i32> [#uses=1]
%16 = sub i32 %15, %12 ; <i32> [#uses=1]
br label %bb2
bb2: ; preds = %bb, %entry
%iftmp.48.0 = phi i32 [ %16, %bb ], [ 0, %entry ] ; <i32> [#uses=1]
%17 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 16 ; <i16**> [#uses=1]
%18 = load i16** %17, align 4 ; <i16*> [#uses=1]
%19 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 13 ; <i32*> [#uses=1]
%20 = load i32* %19, align 4 ; <i32> [#uses=1]
%.sum = add i32 %5, 258 ; <i32> [#uses=2]
%21 = getelementptr inbounds i8* %3, i32 %.sum ; <i8*> [#uses=1]
%22 = add nsw i32 %5, -1 ; <i32> [#uses=1]
%.sum30 = add i32 %22, %8 ; <i32> [#uses=1]
%23 = getelementptr inbounds i8* %3, i32 %.sum30 ; <i8*> [#uses=1]
%24 = load i8* %23, align 1 ; <i8> [#uses=1]
%.sum31 = add i32 %8, %5 ; <i32> [#uses=1]
%25 = getelementptr inbounds i8* %3, i32 %.sum31 ; <i8*> [#uses=1]
%26 = load i8* %25, align 1 ; <i8> [#uses=1]
%27 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 35 ; <i32*> [#uses=1]
%28 = load i32* %27, align 4 ; <i32> [#uses=1]
%29 = lshr i32 %1, 2 ; <i32> [#uses=1]
%30 = icmp ult i32 %8, %28 ; <i1> [#uses=1]
%. = select i1 %30, i32 %1, i32 %29 ; <i32> [#uses=1]
%31 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 29 ; <i32*> [#uses=1]
%32 = load i32* %31, align 4 ; <i32> [#uses=4]
%33 = icmp ugt i32 %10, %32 ; <i1> [#uses=1]
%nice_match.0.ph = select i1 %33, i32 %32, i32 %10 ; <i32> [#uses=1]
%34 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 28 ; <i32*> [#uses=1]
%35 = ptrtoint i8* %21 to i32 ; <i32> [#uses=1]
%36 = add nsw i32 %5, 257 ; <i32> [#uses=1]
%tmp81 = add i32 %., -1 ; <i32> [#uses=1]
br label %bb6
bb6: ; preds = %bb24, %bb2
%indvar78 = phi i32 [ 0, %bb2 ], [ %indvar.next79, %bb24 ] ; <i32> [#uses=2]
%best_len.2 = phi i32 [ %8, %bb2 ], [ %best_len.0, %bb24 ] ; <i32> [#uses=8]
%scan_end1.1 = phi i8 [ %24, %bb2 ], [ %scan_end1.0, %bb24 ] ; <i8> [#uses=6]
%cur_match_addr.0 = phi i32 [ %cur_match, %bb2 ], [ %90, %bb24 ] ; <i32> [#uses=14]
%scan_end.1 = phi i8 [ %26, %bb2 ], [ %scan_end.0, %bb24 ] ; <i8> [#uses=6]
%37 = getelementptr inbounds i8* %3, i32 %cur_match_addr.0 ; <i8*> [#uses=1]
%.sum32 = add i32 %cur_match_addr.0, %best_len.2 ; <i32> [#uses=1]
%38 = getelementptr inbounds i8* %3, i32 %.sum32 ; <i8*> [#uses=1]
%39 = load i8* %38, align 1 ; <i8> [#uses=1]
%40 = icmp eq i8 %39, %scan_end.1 ; <i1> [#uses=1]
br i1 %40, label %bb7, label %bb23
bb7: ; preds = %bb6
%41 = add nsw i32 %best_len.2, -1 ; <i32> [#uses=1]
%.sum33 = add i32 %41, %cur_match_addr.0 ; <i32> [#uses=1]
%42 = getelementptr inbounds i8* %3, i32 %.sum33 ; <i8*> [#uses=1]
%43 = load i8* %42, align 1 ; <i8> [#uses=1]
%44 = icmp eq i8 %43, %scan_end1.1 ; <i1> [#uses=1]
br i1 %44, label %bb8, label %bb23
bb8: ; preds = %bb7
%45 = load i8* %37, align 1 ; <i8> [#uses=1]
%46 = load i8* %6, align 1 ; <i8> [#uses=1]
%47 = icmp eq i8 %45, %46 ; <i1> [#uses=1]
br i1 %47, label %bb9, label %bb23
bb9: ; preds = %bb8
%.sum34 = add i32 %cur_match_addr.0, 1 ; <i32> [#uses=1]
%48 = getelementptr inbounds i8* %3, i32 %.sum34 ; <i8*> [#uses=1]
%49 = load i8* %48, align 1 ; <i8> [#uses=1]
%.sum88 = add i32 %5, 1 ; <i32> [#uses=1]
%50 = getelementptr inbounds i8* %3, i32 %.sum88 ; <i8*> [#uses=1]
%51 = load i8* %50, align 1 ; <i8> [#uses=1]
%52 = icmp eq i8 %49, %51 ; <i1> [#uses=1]
br i1 %52, label %bb10, label %bb23
bb10: ; preds = %bb9
%tmp39 = add i32 %cur_match_addr.0, 10 ; <i32> [#uses=1]
%tmp41 = add i32 %cur_match_addr.0, 9 ; <i32> [#uses=1]
%tmp44 = add i32 %cur_match_addr.0, 8 ; <i32> [#uses=1]
%tmp47 = add i32 %cur_match_addr.0, 7 ; <i32> [#uses=1]
%tmp50 = add i32 %cur_match_addr.0, 6 ; <i32> [#uses=1]
%tmp53 = add i32 %cur_match_addr.0, 5 ; <i32> [#uses=1]
%tmp56 = add i32 %cur_match_addr.0, 4 ; <i32> [#uses=1]
%tmp59 = add i32 %cur_match_addr.0, 3 ; <i32> [#uses=1]
br label %bb11
bb11: ; preds = %bb18, %bb10
%indvar = phi i32 [ %indvar.next, %bb18 ], [ 0, %bb10 ] ; <i32> [#uses=2]
%tmp = shl i32 %indvar, 3 ; <i32> [#uses=16]
%tmp40 = add i32 %tmp39, %tmp ; <i32> [#uses=1]
%scevgep = getelementptr i8* %3, i32 %tmp40 ; <i8*> [#uses=1]
%tmp42 = add i32 %tmp41, %tmp ; <i32> [#uses=1]
%scevgep43 = getelementptr i8* %3, i32 %tmp42 ; <i8*> [#uses=1]
%tmp45 = add i32 %tmp44, %tmp ; <i32> [#uses=1]
%scevgep46 = getelementptr i8* %3, i32 %tmp45 ; <i8*> [#uses=1]
%tmp48 = add i32 %tmp47, %tmp ; <i32> [#uses=1]
%scevgep49 = getelementptr i8* %3, i32 %tmp48 ; <i8*> [#uses=1]
%tmp51 = add i32 %tmp50, %tmp ; <i32> [#uses=1]
%scevgep52 = getelementptr i8* %3, i32 %tmp51 ; <i8*> [#uses=1]
%tmp54 = add i32 %tmp53, %tmp ; <i32> [#uses=1]
%scevgep55 = getelementptr i8* %3, i32 %tmp54 ; <i8*> [#uses=1]
%tmp60 = add i32 %tmp59, %tmp ; <i32> [#uses=1]
%scevgep61 = getelementptr i8* %3, i32 %tmp60 ; <i8*> [#uses=1]
%tmp62 = add i32 %tmp, 10 ; <i32> [#uses=1]
%.sum89 = add i32 %5, %tmp62 ; <i32> [#uses=2]
%scevgep63 = getelementptr i8* %3, i32 %.sum89 ; <i8*> [#uses=2]
%tmp64 = add i32 %tmp, 9 ; <i32> [#uses=1]
%.sum90 = add i32 %5, %tmp64 ; <i32> [#uses=1]
%scevgep65 = getelementptr i8* %3, i32 %.sum90 ; <i8*> [#uses=2]
%tmp66 = add i32 %tmp, 8 ; <i32> [#uses=1]
%.sum91 = add i32 %5, %tmp66 ; <i32> [#uses=1]
%scevgep67 = getelementptr i8* %3, i32 %.sum91 ; <i8*> [#uses=2]
%tmp6883 = or i32 %tmp, 7 ; <i32> [#uses=1]
%.sum92 = add i32 %5, %tmp6883 ; <i32> [#uses=1]
%scevgep69 = getelementptr i8* %3, i32 %.sum92 ; <i8*> [#uses=2]
%tmp7084 = or i32 %tmp, 6 ; <i32> [#uses=1]
%.sum93 = add i32 %5, %tmp7084 ; <i32> [#uses=1]
%scevgep71 = getelementptr i8* %3, i32 %.sum93 ; <i8*> [#uses=2]
%tmp7285 = or i32 %tmp, 5 ; <i32> [#uses=1]
%.sum94 = add i32 %5, %tmp7285 ; <i32> [#uses=1]
%scevgep73 = getelementptr i8* %3, i32 %.sum94 ; <i8*> [#uses=2]
%tmp7486 = or i32 %tmp, 4 ; <i32> [#uses=1]
%.sum95 = add i32 %5, %tmp7486 ; <i32> [#uses=1]
%scevgep75 = getelementptr i8* %3, i32 %.sum95 ; <i8*> [#uses=2]
%tmp7687 = or i32 %tmp, 3 ; <i32> [#uses=1]
%.sum96 = add i32 %5, %tmp7687 ; <i32> [#uses=1]
%scevgep77 = getelementptr i8* %3, i32 %.sum96 ; <i8*> [#uses=2]
%53 = load i8* %scevgep77, align 1 ; <i8> [#uses=1]
%54 = load i8* %scevgep61, align 1 ; <i8> [#uses=1]
%55 = icmp eq i8 %53, %54 ; <i1> [#uses=1]
br i1 %55, label %bb12, label %bb20
bb12: ; preds = %bb11
%tmp57 = add i32 %tmp56, %tmp ; <i32> [#uses=1]
%scevgep58 = getelementptr i8* %3, i32 %tmp57 ; <i8*> [#uses=1]
%56 = load i8* %scevgep75, align 1 ; <i8> [#uses=1]
%57 = load i8* %scevgep58, align 1 ; <i8> [#uses=1]
%58 = icmp eq i8 %56, %57 ; <i1> [#uses=1]
br i1 %58, label %bb13, label %bb20
bb13: ; preds = %bb12
%59 = load i8* %scevgep73, align 1 ; <i8> [#uses=1]
%60 = load i8* %scevgep55, align 1 ; <i8> [#uses=1]
%61 = icmp eq i8 %59, %60 ; <i1> [#uses=1]
br i1 %61, label %bb14, label %bb20
bb14: ; preds = %bb13
%62 = load i8* %scevgep71, align 1 ; <i8> [#uses=1]
%63 = load i8* %scevgep52, align 1 ; <i8> [#uses=1]
%64 = icmp eq i8 %62, %63 ; <i1> [#uses=1]
br i1 %64, label %bb15, label %bb20
bb15: ; preds = %bb14
%65 = load i8* %scevgep69, align 1 ; <i8> [#uses=1]
%66 = load i8* %scevgep49, align 1 ; <i8> [#uses=1]
%67 = icmp eq i8 %65, %66 ; <i1> [#uses=1]
br i1 %67, label %bb16, label %bb20
bb16: ; preds = %bb15
%68 = load i8* %scevgep67, align 1 ; <i8> [#uses=1]
%69 = load i8* %scevgep46, align 1 ; <i8> [#uses=1]
%70 = icmp eq i8 %68, %69 ; <i1> [#uses=1]
br i1 %70, label %bb17, label %bb20
bb17: ; preds = %bb16
%71 = load i8* %scevgep65, align 1 ; <i8> [#uses=1]
%72 = load i8* %scevgep43, align 1 ; <i8> [#uses=1]
%73 = icmp eq i8 %71, %72 ; <i1> [#uses=1]
br i1 %73, label %bb18, label %bb20
bb18: ; preds = %bb17
%74 = load i8* %scevgep63, align 1 ; <i8> [#uses=1]
%75 = load i8* %scevgep, align 1 ; <i8> [#uses=1]
%76 = icmp eq i8 %74, %75 ; <i1> [#uses=1]
%77 = icmp slt i32 %.sum89, %.sum ; <i1> [#uses=1]
%or.cond = and i1 %76, %77 ; <i1> [#uses=1]
%indvar.next = add i32 %indvar, 1 ; <i32> [#uses=1]
br i1 %or.cond, label %bb11, label %bb20
bb20: ; preds = %bb18, %bb17, %bb16, %bb15, %bb14, %bb13, %bb12, %bb11
%scan.3 = phi i8* [ %scevgep77, %bb11 ], [ %scevgep75, %bb12 ], [ %scevgep73, %bb13 ], [ %scevgep71, %bb14 ], [ %scevgep69, %bb15 ], [ %scevgep67, %bb16 ], [ %scevgep65, %bb17 ], [ %scevgep63, %bb18 ] ; <i8*> [#uses=1]
%78 = ptrtoint i8* %scan.3 to i32 ; <i32> [#uses=1]
%79 = sub nsw i32 %78, %35 ; <i32> [#uses=2]
%80 = add i32 %79, 258 ; <i32> [#uses=5]
%81 = icmp sgt i32 %80, %best_len.2 ; <i1> [#uses=1]
br i1 %81, label %bb21, label %bb23
bb21: ; preds = %bb20
store i32 %cur_match_addr.0, i32* %34, align 4
%82 = icmp slt i32 %80, %nice_match.0.ph ; <i1> [#uses=1]
br i1 %82, label %bb22, label %bb25
bb22: ; preds = %bb21
%.sum37 = add i32 %36, %79 ; <i32> [#uses=1]
%83 = getelementptr inbounds i8* %3, i32 %.sum37 ; <i8*> [#uses=1]
%84 = load i8* %83, align 1 ; <i8> [#uses=1]
%.sum38 = add i32 %80, %5 ; <i32> [#uses=1]
%85 = getelementptr inbounds i8* %3, i32 %.sum38 ; <i8*> [#uses=1]
%86 = load i8* %85, align 1 ; <i8> [#uses=1]
br label %bb23
bb23: ; preds = %bb22, %bb20, %bb9, %bb8, %bb7, %bb6
%best_len.0 = phi i32 [ %best_len.2, %bb6 ], [ %best_len.2, %bb7 ], [ %best_len.2, %bb8 ], [ %best_len.2, %bb9 ], [ %80, %bb22 ], [ %best_len.2, %bb20 ] ; <i32> [#uses=3]
%scan_end1.0 = phi i8 [ %scan_end1.1, %bb6 ], [ %scan_end1.1, %bb7 ], [ %scan_end1.1, %bb8 ], [ %scan_end1.1, %bb9 ], [ %84, %bb22 ], [ %scan_end1.1, %bb20 ] ; <i8> [#uses=1]
%scan_end.0 = phi i8 [ %scan_end.1, %bb6 ], [ %scan_end.1, %bb7 ], [ %scan_end.1, %bb8 ], [ %scan_end.1, %bb9 ], [ %86, %bb22 ], [ %scan_end.1, %bb20 ] ; <i8> [#uses=1]
%87 = and i32 %cur_match_addr.0, %20 ; <i32> [#uses=1]
%88 = getelementptr inbounds i16* %18, i32 %87 ; <i16*> [#uses=1]
%89 = load i16* %88, align 2 ; <i16> [#uses=1]
%90 = zext i16 %89 to i32 ; <i32> [#uses=2]
%91 = icmp ugt i32 %90, %iftmp.48.0 ; <i1> [#uses=1]
br i1 %91, label %bb24, label %bb25
bb24: ; preds = %bb23
; LSR should use count-down iteration to avoid requiring the trip count
; in a register.
; CHECK: @ %bb24
; CHECK: subs{{.*}} {{(r[0-9]+)|(lr)}}, #1
; CHECK: bne.w
%92 = icmp eq i32 %tmp81, %indvar78 ; <i1> [#uses=1]
%indvar.next79 = add i32 %indvar78, 1 ; <i32> [#uses=1]
br i1 %92, label %bb25, label %bb6
bb25: ; preds = %bb24, %bb23, %bb21
%best_len.1 = phi i32 [ %best_len.0, %bb23 ], [ %best_len.0, %bb24 ], [ %80, %bb21 ] ; <i32> [#uses=2]
%93 = icmp ugt i32 %best_len.1, %32 ; <i1> [#uses=1]
%merge = select i1 %93, i32 %32, i32 %best_len.1 ; <i32> [#uses=1]
ret i32 %merge
}

View File

@ -1,83 +0,0 @@
; RUN: llc < %s -march=x86 -enable-lsr-nested | FileCheck %s
;
; Nested LSR is required to optimize this case.
; We do not expect to see this form of IR without -enable-iv-rewrite.
define void @borf(i8* nocapture %in, i8* nocapture %out) nounwind {
; CHECK: borf:
; CHECK-NOT: inc
; CHECK-NOT: leal 1(
; CHECK-NOT: leal -1(
; CHECK: decl
; CHECK-NEXT: cmpl $-478
; CHECK: ret
bb4.thread:
br label %bb2.outer
bb2.outer: ; preds = %bb4, %bb4.thread
%indvar18 = phi i32 [ 0, %bb4.thread ], [ %indvar.next28, %bb4 ] ; <i32> [#uses=3]
%tmp34 = mul i32 %indvar18, 65535 ; <i32> [#uses=1]
%i.0.reg2mem.0.ph = add i32 %tmp34, 639 ; <i32> [#uses=1]
%0 = and i32 %i.0.reg2mem.0.ph, 65535 ; <i32> [#uses=1]
%1 = mul i32 %0, 480 ; <i32> [#uses=1]
%tmp20 = mul i32 %indvar18, -478 ; <i32> [#uses=1]
br label %bb2
bb2: ; preds = %bb2, %bb2.outer
%indvar = phi i32 [ 0, %bb2.outer ], [ %indvar.next, %bb2 ] ; <i32> [#uses=3]
%ctg2 = getelementptr i8* %out, i32 %tmp20 ; <i8*> [#uses=1]
%tmp21 = ptrtoint i8* %ctg2 to i32 ; <i32> [#uses=1]
%tmp23 = sub i32 %tmp21, %indvar ; <i32> [#uses=1]
%out_addr.0.reg2mem.0 = inttoptr i32 %tmp23 to i8* ; <i8*> [#uses=1]
%tmp25 = mul i32 %indvar, 65535 ; <i32> [#uses=1]
%j.0.reg2mem.0 = add i32 %tmp25, 479 ; <i32> [#uses=1]
%2 = and i32 %j.0.reg2mem.0, 65535 ; <i32> [#uses=1]
%3 = add i32 %1, %2 ; <i32> [#uses=9]
%4 = add i32 %3, -481 ; <i32> [#uses=1]
%5 = getelementptr i8* %in, i32 %4 ; <i8*> [#uses=1]
%6 = load i8* %5, align 1 ; <i8> [#uses=1]
%7 = add i32 %3, -480 ; <i32> [#uses=1]
%8 = getelementptr i8* %in, i32 %7 ; <i8*> [#uses=1]
%9 = load i8* %8, align 1 ; <i8> [#uses=1]
%10 = add i32 %3, -479 ; <i32> [#uses=1]
%11 = getelementptr i8* %in, i32 %10 ; <i8*> [#uses=1]
%12 = load i8* %11, align 1 ; <i8> [#uses=1]
%13 = add i32 %3, -1 ; <i32> [#uses=1]
%14 = getelementptr i8* %in, i32 %13 ; <i8*> [#uses=1]
%15 = load i8* %14, align 1 ; <i8> [#uses=1]
%16 = getelementptr i8* %in, i32 %3 ; <i8*> [#uses=1]
%17 = load i8* %16, align 1 ; <i8> [#uses=1]
%18 = add i32 %3, 1 ; <i32> [#uses=1]
%19 = getelementptr i8* %in, i32 %18 ; <i8*> [#uses=1]
%20 = load i8* %19, align 1 ; <i8> [#uses=1]
%21 = add i32 %3, 481 ; <i32> [#uses=1]
%22 = getelementptr i8* %in, i32 %21 ; <i8*> [#uses=1]
%23 = load i8* %22, align 1 ; <i8> [#uses=1]
%24 = add i32 %3, 480 ; <i32> [#uses=1]
%25 = getelementptr i8* %in, i32 %24 ; <i8*> [#uses=1]
%26 = load i8* %25, align 1 ; <i8> [#uses=1]
%27 = add i32 %3, 479 ; <i32> [#uses=1]
%28 = getelementptr i8* %in, i32 %27 ; <i8*> [#uses=1]
%29 = load i8* %28, align 1 ; <i8> [#uses=1]
%30 = add i8 %9, %6 ; <i8> [#uses=1]
%31 = add i8 %30, %12 ; <i8> [#uses=1]
%32 = add i8 %31, %15 ; <i8> [#uses=1]
%33 = add i8 %32, %17 ; <i8> [#uses=1]
%34 = add i8 %33, %20 ; <i8> [#uses=1]
%35 = add i8 %34, %23 ; <i8> [#uses=1]
%36 = add i8 %35, %26 ; <i8> [#uses=1]
%37 = add i8 %36, %29 ; <i8> [#uses=1]
store i8 %37, i8* %out_addr.0.reg2mem.0, align 1
%indvar.next = add i32 %indvar, 1 ; <i32> [#uses=2]
%exitcond = icmp eq i32 %indvar.next, 478 ; <i1> [#uses=1]
br i1 %exitcond, label %bb4, label %bb2
bb4: ; preds = %bb2
%indvar.next28 = add i32 %indvar18, 1 ; <i32> [#uses=2]
%exitcond29 = icmp eq i32 %indvar.next28, 638 ; <i1> [#uses=1]
br i1 %exitcond29, label %return, label %bb2.outer
return: ; preds = %bb4
ret void
}

View File

@ -1,299 +0,0 @@
; RUN: llc < %s -mcpu=generic -march=x86-64 -enable-lsr-nested -o %t
; RUN: not grep inc %t
; RUN: grep dec %t | count 2
; RUN: grep addq %t | count 12
; RUN: not grep addb %t
; RUN: not grep leal %t
; RUN: not grep movq %t
; IV users in each of the loops from other loops shouldn't cause LSR
; to insert new induction variables. Previously it would create a
; flood of new induction variables.
; Also, the loop reversal should kick in once.
;
; In this example, performing LSR on the entire loop nest,
; as opposed to only the inner loop can further reduce induction variables,
; and their related instructions and registers.
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"
target triple = "x86_64-unknown-linux-gnu"
define void @foo(float* %A, i32 %IA, float* %B, i32 %IB, float* nocapture %C, i32 %N) nounwind {
entry:
%0 = xor i32 %IA, 1 ; <i32> [#uses=1]
%1 = xor i32 %IB, 1 ; <i32> [#uses=1]
%2 = or i32 %1, %0 ; <i32> [#uses=1]
%3 = icmp eq i32 %2, 0 ; <i1> [#uses=1]
br i1 %3, label %bb2, label %bb13
bb: ; preds = %bb3
%4 = load float* %A_addr.0, align 4 ; <float> [#uses=1]
%5 = load float* %B_addr.0, align 4 ; <float> [#uses=1]
%6 = fmul float %4, %5 ; <float> [#uses=1]
%7 = fadd float %6, %Sum0.0 ; <float> [#uses=1]
%indvar.next154 = add i64 %B_addr.0.rec, 1 ; <i64> [#uses=1]
br label %bb2
bb2: ; preds = %entry, %bb
%B_addr.0.rec = phi i64 [ %indvar.next154, %bb ], [ 0, %entry ] ; <i64> [#uses=14]
%Sum0.0 = phi float [ %7, %bb ], [ 0.000000e+00, %entry ] ; <float> [#uses=5]
%indvar146 = trunc i64 %B_addr.0.rec to i32 ; <i32> [#uses=1]
%N_addr.0 = sub i32 %N, %indvar146 ; <i32> [#uses=6]
%A_addr.0 = getelementptr float* %A, i64 %B_addr.0.rec ; <float*> [#uses=4]
%B_addr.0 = getelementptr float* %B, i64 %B_addr.0.rec ; <float*> [#uses=4]
%8 = icmp sgt i32 %N_addr.0, 0 ; <i1> [#uses=1]
br i1 %8, label %bb3, label %bb4
bb3: ; preds = %bb2
%9 = ptrtoint float* %A_addr.0 to i64 ; <i64> [#uses=1]
%10 = and i64 %9, 15 ; <i64> [#uses=1]
%11 = icmp eq i64 %10, 0 ; <i1> [#uses=1]
br i1 %11, label %bb4, label %bb
bb4: ; preds = %bb3, %bb2
%12 = ptrtoint float* %B_addr.0 to i64 ; <i64> [#uses=1]
%13 = and i64 %12, 15 ; <i64> [#uses=1]
%14 = icmp eq i64 %13, 0 ; <i1> [#uses=1]
%15 = icmp sgt i32 %N_addr.0, 15 ; <i1> [#uses=2]
br i1 %14, label %bb6.preheader, label %bb10.preheader
bb10.preheader: ; preds = %bb4
br i1 %15, label %bb9, label %bb12.loopexit
bb6.preheader: ; preds = %bb4
br i1 %15, label %bb5, label %bb8.loopexit
bb5: ; preds = %bb5, %bb6.preheader
%indvar143 = phi i64 [ 0, %bb6.preheader ], [ %indvar.next144, %bb5 ] ; <i64> [#uses=3]
%vSum0.072 = phi <4 x float> [ zeroinitializer, %bb6.preheader ], [ %21, %bb5 ] ; <<4 x float>> [#uses=1]
%vSum1.070 = phi <4 x float> [ zeroinitializer, %bb6.preheader ], [ %29, %bb5 ] ; <<4 x float>> [#uses=1]
%vSum2.069 = phi <4 x float> [ zeroinitializer, %bb6.preheader ], [ %37, %bb5 ] ; <<4 x float>> [#uses=1]
%vSum3.067 = phi <4 x float> [ zeroinitializer, %bb6.preheader ], [ %45, %bb5 ] ; <<4 x float>> [#uses=1]
%indvar145 = trunc i64 %indvar143 to i32 ; <i32> [#uses=1]
%tmp150 = mul i32 %indvar145, -16 ; <i32> [#uses=1]
%N_addr.268 = add i32 %tmp150, %N_addr.0 ; <i32> [#uses=1]
%A_addr.273.rec = shl i64 %indvar143, 4 ; <i64> [#uses=5]
%B_addr.0.sum180 = add i64 %B_addr.0.rec, %A_addr.273.rec ; <i64> [#uses=2]
%B_addr.271 = getelementptr float* %B, i64 %B_addr.0.sum180 ; <float*> [#uses=1]
%A_addr.273 = getelementptr float* %A, i64 %B_addr.0.sum180 ; <float*> [#uses=1]
tail call void asm sideeffect ";# foo", "~{dirflag},~{fpsr},~{flags}"() nounwind
%16 = bitcast float* %A_addr.273 to <4 x float>* ; <<4 x float>*> [#uses=1]
%17 = load <4 x float>* %16, align 16 ; <<4 x float>> [#uses=1]
%18 = bitcast float* %B_addr.271 to <4 x float>* ; <<4 x float>*> [#uses=1]
%19 = load <4 x float>* %18, align 16 ; <<4 x float>> [#uses=1]
%20 = fmul <4 x float> %17, %19 ; <<4 x float>> [#uses=1]
%21 = fadd <4 x float> %20, %vSum0.072 ; <<4 x float>> [#uses=2]
%A_addr.273.sum163 = or i64 %A_addr.273.rec, 4 ; <i64> [#uses=1]
%A_addr.0.sum175 = add i64 %B_addr.0.rec, %A_addr.273.sum163 ; <i64> [#uses=2]
%22 = getelementptr float* %A, i64 %A_addr.0.sum175 ; <float*> [#uses=1]
%23 = bitcast float* %22 to <4 x float>* ; <<4 x float>*> [#uses=1]
%24 = load <4 x float>* %23, align 16 ; <<4 x float>> [#uses=1]
%25 = getelementptr float* %B, i64 %A_addr.0.sum175 ; <float*> [#uses=1]
%26 = bitcast float* %25 to <4 x float>* ; <<4 x float>*> [#uses=1]
%27 = load <4 x float>* %26, align 16 ; <<4 x float>> [#uses=1]
%28 = fmul <4 x float> %24, %27 ; <<4 x float>> [#uses=1]
%29 = fadd <4 x float> %28, %vSum1.070 ; <<4 x float>> [#uses=2]
%A_addr.273.sum161 = or i64 %A_addr.273.rec, 8 ; <i64> [#uses=1]
%A_addr.0.sum174 = add i64 %B_addr.0.rec, %A_addr.273.sum161 ; <i64> [#uses=2]
%30 = getelementptr float* %A, i64 %A_addr.0.sum174 ; <float*> [#uses=1]
%31 = bitcast float* %30 to <4 x float>* ; <<4 x float>*> [#uses=1]
%32 = load <4 x float>* %31, align 16 ; <<4 x float>> [#uses=1]
%33 = getelementptr float* %B, i64 %A_addr.0.sum174 ; <float*> [#uses=1]
%34 = bitcast float* %33 to <4 x float>* ; <<4 x float>*> [#uses=1]
%35 = load <4 x float>* %34, align 16 ; <<4 x float>> [#uses=1]
%36 = fmul <4 x float> %32, %35 ; <<4 x float>> [#uses=1]
%37 = fadd <4 x float> %36, %vSum2.069 ; <<4 x float>> [#uses=2]
%A_addr.273.sum159 = or i64 %A_addr.273.rec, 12 ; <i64> [#uses=1]
%A_addr.0.sum173 = add i64 %B_addr.0.rec, %A_addr.273.sum159 ; <i64> [#uses=2]
%38 = getelementptr float* %A, i64 %A_addr.0.sum173 ; <float*> [#uses=1]
%39 = bitcast float* %38 to <4 x float>* ; <<4 x float>*> [#uses=1]
%40 = load <4 x float>* %39, align 16 ; <<4 x float>> [#uses=1]
%41 = getelementptr float* %B, i64 %A_addr.0.sum173 ; <float*> [#uses=1]
%42 = bitcast float* %41 to <4 x float>* ; <<4 x float>*> [#uses=1]
%43 = load <4 x float>* %42, align 16 ; <<4 x float>> [#uses=1]
%44 = fmul <4 x float> %40, %43 ; <<4 x float>> [#uses=1]
%45 = fadd <4 x float> %44, %vSum3.067 ; <<4 x float>> [#uses=2]
%.rec83 = add i64 %A_addr.273.rec, 16 ; <i64> [#uses=1]
%A_addr.0.sum172 = add i64 %B_addr.0.rec, %.rec83 ; <i64> [#uses=2]
%46 = getelementptr float* %A, i64 %A_addr.0.sum172 ; <float*> [#uses=1]
%47 = getelementptr float* %B, i64 %A_addr.0.sum172 ; <float*> [#uses=1]
%48 = add i32 %N_addr.268, -16 ; <i32> [#uses=2]
%49 = icmp sgt i32 %48, 15 ; <i1> [#uses=1]
%indvar.next144 = add i64 %indvar143, 1 ; <i64> [#uses=1]
br i1 %49, label %bb5, label %bb8.loopexit
bb7: ; preds = %bb7, %bb8.loopexit
%indvar130 = phi i64 [ 0, %bb8.loopexit ], [ %indvar.next131, %bb7 ] ; <i64> [#uses=3]
%vSum0.260 = phi <4 x float> [ %vSum0.0.lcssa, %bb8.loopexit ], [ %55, %bb7 ] ; <<4 x float>> [#uses=1]
%indvar132 = trunc i64 %indvar130 to i32 ; <i32> [#uses=1]
%tmp133 = mul i32 %indvar132, -4 ; <i32> [#uses=1]
%N_addr.358 = add i32 %tmp133, %N_addr.2.lcssa ; <i32> [#uses=1]
%A_addr.361.rec = shl i64 %indvar130, 2 ; <i64> [#uses=3]
%B_addr.359 = getelementptr float* %B_addr.2.lcssa, i64 %A_addr.361.rec ; <float*> [#uses=1]
%A_addr.361 = getelementptr float* %A_addr.2.lcssa, i64 %A_addr.361.rec ; <float*> [#uses=1]
%50 = bitcast float* %A_addr.361 to <4 x float>* ; <<4 x float>*> [#uses=1]
%51 = load <4 x float>* %50, align 16 ; <<4 x float>> [#uses=1]
%52 = bitcast float* %B_addr.359 to <4 x float>* ; <<4 x float>*> [#uses=1]
%53 = load <4 x float>* %52, align 16 ; <<4 x float>> [#uses=1]
%54 = fmul <4 x float> %51, %53 ; <<4 x float>> [#uses=1]
%55 = fadd <4 x float> %54, %vSum0.260 ; <<4 x float>> [#uses=2]
%.rec85 = add i64 %A_addr.361.rec, 4 ; <i64> [#uses=2]
%56 = getelementptr float* %A_addr.2.lcssa, i64 %.rec85 ; <float*> [#uses=1]
%57 = getelementptr float* %B_addr.2.lcssa, i64 %.rec85 ; <float*> [#uses=1]
%58 = add i32 %N_addr.358, -4 ; <i32> [#uses=2]
%59 = icmp sgt i32 %58, 3 ; <i1> [#uses=1]
%indvar.next131 = add i64 %indvar130, 1 ; <i64> [#uses=1]
br i1 %59, label %bb7, label %bb13
bb8.loopexit: ; preds = %bb5, %bb6.preheader
%A_addr.2.lcssa = phi float* [ %A_addr.0, %bb6.preheader ], [ %46, %bb5 ] ; <float*> [#uses=3]
%vSum0.0.lcssa = phi <4 x float> [ zeroinitializer, %bb6.preheader ], [ %21, %bb5 ] ; <<4 x float>> [#uses=2]
%B_addr.2.lcssa = phi float* [ %B_addr.0, %bb6.preheader ], [ %47, %bb5 ] ; <float*> [#uses=3]
%vSum1.0.lcssa = phi <4 x float> [ zeroinitializer, %bb6.preheader ], [ %29, %bb5 ] ; <<4 x float>> [#uses=2]
%vSum2.0.lcssa = phi <4 x float> [ zeroinitializer, %bb6.preheader ], [ %37, %bb5 ] ; <<4 x float>> [#uses=2]
%N_addr.2.lcssa = phi i32 [ %N_addr.0, %bb6.preheader ], [ %48, %bb5 ] ; <i32> [#uses=3]
%vSum3.0.lcssa = phi <4 x float> [ zeroinitializer, %bb6.preheader ], [ %45, %bb5 ] ; <<4 x float>> [#uses=2]
%60 = icmp sgt i32 %N_addr.2.lcssa, 3 ; <i1> [#uses=1]
br i1 %60, label %bb7, label %bb13
bb9: ; preds = %bb9, %bb10.preheader
%indvar106 = phi i64 [ 0, %bb10.preheader ], [ %indvar.next107, %bb9 ] ; <i64> [#uses=3]
%vSum0.339 = phi <4 x float> [ zeroinitializer, %bb10.preheader ], [ %75, %bb9 ] ; <<4 x float>> [#uses=1]
%vSum1.237 = phi <4 x float> [ zeroinitializer, %bb10.preheader ], [ %80, %bb9 ] ; <<4 x float>> [#uses=1]
%vSum2.236 = phi <4 x float> [ zeroinitializer, %bb10.preheader ], [ %85, %bb9 ] ; <<4 x float>> [#uses=1]
%vSum3.234 = phi <4 x float> [ zeroinitializer, %bb10.preheader ], [ %90, %bb9 ] ; <<4 x float>> [#uses=1]
%indvar108 = trunc i64 %indvar106 to i32 ; <i32> [#uses=1]
%tmp113 = mul i32 %indvar108, -16 ; <i32> [#uses=1]
%N_addr.435 = add i32 %tmp113, %N_addr.0 ; <i32> [#uses=1]
%A_addr.440.rec = shl i64 %indvar106, 4 ; <i64> [#uses=5]
%B_addr.0.sum = add i64 %B_addr.0.rec, %A_addr.440.rec ; <i64> [#uses=2]
%B_addr.438 = getelementptr float* %B, i64 %B_addr.0.sum ; <float*> [#uses=1]
%A_addr.440 = getelementptr float* %A, i64 %B_addr.0.sum ; <float*> [#uses=1]
%61 = bitcast float* %B_addr.438 to <4 x float>* ; <i8*> [#uses=1]
%62 = load <4 x float>* %61, align 1
%B_addr.438.sum169 = or i64 %A_addr.440.rec, 4 ; <i64> [#uses=1]
%B_addr.0.sum187 = add i64 %B_addr.0.rec, %B_addr.438.sum169 ; <i64> [#uses=2]
%63 = getelementptr float* %B, i64 %B_addr.0.sum187 ; <float*> [#uses=1]
%64 = bitcast float* %63 to <4 x float>* ; <i8*> [#uses=1]
%65 = load <4 x float>* %64, align 1
%B_addr.438.sum168 = or i64 %A_addr.440.rec, 8 ; <i64> [#uses=1]
%B_addr.0.sum186 = add i64 %B_addr.0.rec, %B_addr.438.sum168 ; <i64> [#uses=2]
%66 = getelementptr float* %B, i64 %B_addr.0.sum186 ; <float*> [#uses=1]
%67 = bitcast float* %66 to <4 x float>* ; <i8*> [#uses=1]
%68 = load <4 x float>* %67, align 1
%B_addr.438.sum167 = or i64 %A_addr.440.rec, 12 ; <i64> [#uses=1]
%B_addr.0.sum185 = add i64 %B_addr.0.rec, %B_addr.438.sum167 ; <i64> [#uses=2]
%69 = getelementptr float* %B, i64 %B_addr.0.sum185 ; <float*> [#uses=1]
%70 = bitcast float* %69 to <4 x float>* ; <i8*> [#uses=1]
%71 = load <4 x float>* %70, align 1
%72 = bitcast float* %A_addr.440 to <4 x float>* ; <<4 x float>*> [#uses=1]
%73 = load <4 x float>* %72, align 16 ; <<4 x float>> [#uses=1]
%74 = fmul <4 x float> %73, %62 ; <<4 x float>> [#uses=1]
%75 = fadd <4 x float> %74, %vSum0.339 ; <<4 x float>> [#uses=2]
%76 = getelementptr float* %A, i64 %B_addr.0.sum187 ; <float*> [#uses=1]
%77 = bitcast float* %76 to <4 x float>* ; <<4 x float>*> [#uses=1]
%78 = load <4 x float>* %77, align 16 ; <<4 x float>> [#uses=1]
%79 = fmul <4 x float> %78, %65 ; <<4 x float>> [#uses=1]
%80 = fadd <4 x float> %79, %vSum1.237 ; <<4 x float>> [#uses=2]
%81 = getelementptr float* %A, i64 %B_addr.0.sum186 ; <float*> [#uses=1]
%82 = bitcast float* %81 to <4 x float>* ; <<4 x float>*> [#uses=1]
%83 = load <4 x float>* %82, align 16 ; <<4 x float>> [#uses=1]
%84 = fmul <4 x float> %83, %68 ; <<4 x float>> [#uses=1]
%85 = fadd <4 x float> %84, %vSum2.236 ; <<4 x float>> [#uses=2]
%86 = getelementptr float* %A, i64 %B_addr.0.sum185 ; <float*> [#uses=1]
%87 = bitcast float* %86 to <4 x float>* ; <<4 x float>*> [#uses=1]
%88 = load <4 x float>* %87, align 16 ; <<4 x float>> [#uses=1]
%89 = fmul <4 x float> %88, %71 ; <<4 x float>> [#uses=1]
%90 = fadd <4 x float> %89, %vSum3.234 ; <<4 x float>> [#uses=2]
%.rec89 = add i64 %A_addr.440.rec, 16 ; <i64> [#uses=1]
%A_addr.0.sum170 = add i64 %B_addr.0.rec, %.rec89 ; <i64> [#uses=2]
%91 = getelementptr float* %A, i64 %A_addr.0.sum170 ; <float*> [#uses=1]
%92 = getelementptr float* %B, i64 %A_addr.0.sum170 ; <float*> [#uses=1]
%93 = add i32 %N_addr.435, -16 ; <i32> [#uses=2]
%94 = icmp sgt i32 %93, 15 ; <i1> [#uses=1]
%indvar.next107 = add i64 %indvar106, 1 ; <i64> [#uses=1]
br i1 %94, label %bb9, label %bb12.loopexit
bb11: ; preds = %bb11, %bb12.loopexit
%indvar = phi i64 [ 0, %bb12.loopexit ], [ %indvar.next, %bb11 ] ; <i64> [#uses=3]
%vSum0.428 = phi <4 x float> [ %vSum0.3.lcssa, %bb12.loopexit ], [ %100, %bb11 ] ; <<4 x float>> [#uses=1]
%indvar96 = trunc i64 %indvar to i32 ; <i32> [#uses=1]
%tmp = mul i32 %indvar96, -4 ; <i32> [#uses=1]
%N_addr.526 = add i32 %tmp, %N_addr.4.lcssa ; <i32> [#uses=1]
%A_addr.529.rec = shl i64 %indvar, 2 ; <i64> [#uses=3]
%B_addr.527 = getelementptr float* %B_addr.4.lcssa, i64 %A_addr.529.rec ; <float*> [#uses=1]
%A_addr.529 = getelementptr float* %A_addr.4.lcssa, i64 %A_addr.529.rec ; <float*> [#uses=1]
%95 = bitcast float* %B_addr.527 to <4 x float>* ; <i8*> [#uses=1]
%96 = load <4 x float>* %95, align 1
%97 = bitcast float* %A_addr.529 to <4 x float>* ; <<4 x float>*> [#uses=1]
%98 = load <4 x float>* %97, align 16 ; <<4 x float>> [#uses=1]
%99 = fmul <4 x float> %98, %96 ; <<4 x float>> [#uses=1]
%100 = fadd <4 x float> %99, %vSum0.428 ; <<4 x float>> [#uses=2]
%.rec91 = add i64 %A_addr.529.rec, 4 ; <i64> [#uses=2]
%101 = getelementptr float* %A_addr.4.lcssa, i64 %.rec91 ; <float*> [#uses=1]
%102 = getelementptr float* %B_addr.4.lcssa, i64 %.rec91 ; <float*> [#uses=1]
%103 = add i32 %N_addr.526, -4 ; <i32> [#uses=2]
%104 = icmp sgt i32 %103, 3 ; <i1> [#uses=1]
%indvar.next = add i64 %indvar, 1 ; <i64> [#uses=1]
br i1 %104, label %bb11, label %bb13
bb12.loopexit: ; preds = %bb9, %bb10.preheader
%A_addr.4.lcssa = phi float* [ %A_addr.0, %bb10.preheader ], [ %91, %bb9 ] ; <float*> [#uses=3]
%vSum0.3.lcssa = phi <4 x float> [ zeroinitializer, %bb10.preheader ], [ %75, %bb9 ] ; <<4 x float>> [#uses=2]
%B_addr.4.lcssa = phi float* [ %B_addr.0, %bb10.preheader ], [ %92, %bb9 ] ; <float*> [#uses=3]
%vSum1.2.lcssa = phi <4 x float> [ zeroinitializer, %bb10.preheader ], [ %80, %bb9 ] ; <<4 x float>> [#uses=2]
%vSum2.2.lcssa = phi <4 x float> [ zeroinitializer, %bb10.preheader ], [ %85, %bb9 ] ; <<4 x float>> [#uses=2]
%N_addr.4.lcssa = phi i32 [ %N_addr.0, %bb10.preheader ], [ %93, %bb9 ] ; <i32> [#uses=3]
%vSum3.2.lcssa = phi <4 x float> [ zeroinitializer, %bb10.preheader ], [ %90, %bb9 ] ; <<4 x float>> [#uses=2]
%105 = icmp sgt i32 %N_addr.4.lcssa, 3 ; <i1> [#uses=1]
br i1 %105, label %bb11, label %bb13
bb13: ; preds = %bb12.loopexit, %bb11, %bb8.loopexit, %bb7, %entry
%Sum0.1 = phi float [ 0.000000e+00, %entry ], [ %Sum0.0, %bb7 ], [ %Sum0.0, %bb8.loopexit ], [ %Sum0.0, %bb11 ], [ %Sum0.0, %bb12.loopexit ] ; <float> [#uses=1]
%vSum3.1 = phi <4 x float> [ zeroinitializer, %entry ], [ %vSum3.0.lcssa, %bb7 ], [ %vSum3.0.lcssa, %bb8.loopexit ], [ %vSum3.2.lcssa, %bb11 ], [ %vSum3.2.lcssa, %bb12.loopexit ] ; <<4 x float>> [#uses=1]
%N_addr.1 = phi i32 [ %N, %entry ], [ %N_addr.2.lcssa, %bb8.loopexit ], [ %58, %bb7 ], [ %N_addr.4.lcssa, %bb12.loopexit ], [ %103, %bb11 ] ; <i32> [#uses=2]
%vSum2.1 = phi <4 x float> [ zeroinitializer, %entry ], [ %vSum2.0.lcssa, %bb7 ], [ %vSum2.0.lcssa, %bb8.loopexit ], [ %vSum2.2.lcssa, %bb11 ], [ %vSum2.2.lcssa, %bb12.loopexit ] ; <<4 x float>> [#uses=1]
%vSum1.1 = phi <4 x float> [ zeroinitializer, %entry ], [ %vSum1.0.lcssa, %bb7 ], [ %vSum1.0.lcssa, %bb8.loopexit ], [ %vSum1.2.lcssa, %bb11 ], [ %vSum1.2.lcssa, %bb12.loopexit ] ; <<4 x float>> [#uses=1]
%B_addr.1 = phi float* [ %B, %entry ], [ %B_addr.2.lcssa, %bb8.loopexit ], [ %57, %bb7 ], [ %B_addr.4.lcssa, %bb12.loopexit ], [ %102, %bb11 ] ; <float*> [#uses=1]
%vSum0.1 = phi <4 x float> [ zeroinitializer, %entry ], [ %vSum0.0.lcssa, %bb8.loopexit ], [ %55, %bb7 ], [ %vSum0.3.lcssa, %bb12.loopexit ], [ %100, %bb11 ] ; <<4 x float>> [#uses=1]
%A_addr.1 = phi float* [ %A, %entry ], [ %A_addr.2.lcssa, %bb8.loopexit ], [ %56, %bb7 ], [ %A_addr.4.lcssa, %bb12.loopexit ], [ %101, %bb11 ] ; <float*> [#uses=1]
%106 = fadd <4 x float> %vSum0.1, %vSum2.1 ; <<4 x float>> [#uses=1]
%107 = fadd <4 x float> %vSum1.1, %vSum3.1 ; <<4 x float>> [#uses=1]
%108 = fadd <4 x float> %106, %107 ; <<4 x float>> [#uses=4]
%tmp23 = extractelement <4 x float> %108, i32 0 ; <float> [#uses=1]
%tmp21 = extractelement <4 x float> %108, i32 1 ; <float> [#uses=1]
%109 = fadd float %tmp23, %tmp21 ; <float> [#uses=1]
%tmp19 = extractelement <4 x float> %108, i32 2 ; <float> [#uses=1]
%tmp17 = extractelement <4 x float> %108, i32 3 ; <float> [#uses=1]
%110 = fadd float %tmp19, %tmp17 ; <float> [#uses=1]
%111 = fadd float %109, %110 ; <float> [#uses=1]
%Sum0.254 = fadd float %111, %Sum0.1 ; <float> [#uses=2]
%112 = icmp sgt i32 %N_addr.1, 0 ; <i1> [#uses=1]
br i1 %112, label %bb.nph56, label %bb16
bb.nph56: ; preds = %bb13
%tmp. = zext i32 %N_addr.1 to i64 ; <i64> [#uses=1]
br label %bb14
bb14: ; preds = %bb14, %bb.nph56
%indvar117 = phi i64 [ 0, %bb.nph56 ], [ %indvar.next118, %bb14 ] ; <i64> [#uses=3]
%Sum0.255 = phi float [ %Sum0.254, %bb.nph56 ], [ %Sum0.2, %bb14 ] ; <float> [#uses=1]
%tmp.122 = sext i32 %IB to i64 ; <i64> [#uses=1]
%B_addr.652.rec = mul i64 %indvar117, %tmp.122 ; <i64> [#uses=1]
%tmp.124 = sext i32 %IA to i64 ; <i64> [#uses=1]
%A_addr.653.rec = mul i64 %indvar117, %tmp.124 ; <i64> [#uses=1]
%B_addr.652 = getelementptr float* %B_addr.1, i64 %B_addr.652.rec ; <float*> [#uses=1]
%A_addr.653 = getelementptr float* %A_addr.1, i64 %A_addr.653.rec ; <float*> [#uses=1]
%113 = load float* %A_addr.653, align 4 ; <float> [#uses=1]
%114 = load float* %B_addr.652, align 4 ; <float> [#uses=1]
%115 = fmul float %113, %114 ; <float> [#uses=1]
%Sum0.2 = fadd float %115, %Sum0.255 ; <float> [#uses=2]
%indvar.next118 = add i64 %indvar117, 1 ; <i64> [#uses=2]
%exitcond = icmp eq i64 %indvar.next118, %tmp. ; <i1> [#uses=1]
br i1 %exitcond, label %bb16, label %bb14
bb16: ; preds = %bb14, %bb13
%Sum0.2.lcssa = phi float [ %Sum0.254, %bb13 ], [ %Sum0.2, %bb14 ] ; <float> [#uses=1]
store float %Sum0.2.lcssa, float* %C, align 4
ret void
}

View File

@ -1,37 +0,0 @@
; RUN: llc < %s -march=x86 -enable-lsr-nested | grep cmp | grep 240
; RUN: llc < %s -march=x86 -enable-lsr-nested | grep inc | count 1
define i32 @foo(i32 %A, i32 %B, i32 %C, i32 %D) nounwind {
entry:
%tmp2955 = icmp sgt i32 %C, 0 ; <i1> [#uses=1]
br i1 %tmp2955, label %bb26.outer.us, label %bb40.split
bb26.outer.us: ; preds = %bb26.bb32_crit_edge.us, %entry
%i.044.0.ph.us = phi i32 [ 0, %entry ], [ %indvar.next57, %bb26.bb32_crit_edge.us ] ; <i32> [#uses=2]
%k.1.ph.us = phi i32 [ 0, %entry ], [ %k.0.us, %bb26.bb32_crit_edge.us ] ; <i32> [#uses=1]
%tmp3.us = mul i32 %i.044.0.ph.us, 6 ; <i32> [#uses=1]
br label %bb1.us
bb1.us: ; preds = %bb1.us, %bb26.outer.us
%j.053.us = phi i32 [ 0, %bb26.outer.us ], [ %tmp25.us, %bb1.us ] ; <i32> [#uses=2]
%k.154.us = phi i32 [ %k.1.ph.us, %bb26.outer.us ], [ %k.0.us, %bb1.us ] ; <i32> [#uses=1]
%tmp5.us = add i32 %tmp3.us, %j.053.us ; <i32> [#uses=1]
%tmp7.us = shl i32 %D, %tmp5.us ; <i32> [#uses=2]
%tmp9.us = icmp eq i32 %tmp7.us, %B ; <i1> [#uses=1]
%tmp910.us = zext i1 %tmp9.us to i32 ; <i32> [#uses=1]
%tmp12.us = and i32 %tmp7.us, %A ; <i32> [#uses=1]
%tmp19.us = and i32 %tmp12.us, %tmp910.us ; <i32> [#uses=1]
%k.0.us = add i32 %tmp19.us, %k.154.us ; <i32> [#uses=3]
%tmp25.us = add i32 %j.053.us, 1 ; <i32> [#uses=2]
%tmp29.us = icmp slt i32 %tmp25.us, %C ; <i1> [#uses=1]
br i1 %tmp29.us, label %bb1.us, label %bb26.bb32_crit_edge.us
bb26.bb32_crit_edge.us: ; preds = %bb1.us
%indvar.next57 = add i32 %i.044.0.ph.us, 1 ; <i32> [#uses=2]
%exitcond = icmp eq i32 %indvar.next57, 40 ; <i1> [#uses=1]
br i1 %exitcond, label %bb40.split, label %bb26.outer.us
bb40.split: ; preds = %bb26.bb32_crit_edge.us, %entry
%k.1.lcssa.lcssa.us-lcssa = phi i32 [ %k.0.us, %bb26.bb32_crit_edge.us ], [ 0, %entry ] ; <i32> [#uses=1]
ret i32 %k.1.lcssa.lcssa.us-lcssa
}

View File

@ -1,79 +0,0 @@
; RUN: llc < %s -march=x86 -stats -enable-lsr-nested |& grep {Number of spill slots allocated} | grep 1
; PR3495
;
; Note: this should not spill at all with either good LSR or good regalloc.
target triple = "i386-pc-linux-gnu"
@x = external global [8 x i32], align 32 ; <[8 x i32]*> [#uses=1]
@rows = external global [8 x i32], align 32 ; <[8 x i32]*> [#uses=2]
@up = external global [15 x i32], align 32 ; <[15 x i32]*> [#uses=2]
@down = external global [15 x i32], align 32 ; <[15 x i32]*> [#uses=1]
define i32 @queens(i32 %c) nounwind {
entry:
%tmp91 = add i32 %c, 1 ; <i32> [#uses=3]
%tmp135 = getelementptr [8 x i32]* @x, i32 0, i32 %tmp91 ; <i32*> [#uses=1]
br label %bb
bb: ; preds = %bb569, %entry
%r25.0.reg2mem.0 = phi i32 [ 0, %entry ], [ %indvar.next715, %bb569 ] ; <i32> [#uses=4]
%tmp27 = getelementptr [8 x i32]* @rows, i32 0, i32 %r25.0.reg2mem.0 ; <i32*> [#uses=1]
%tmp28 = load i32* %tmp27, align 4 ; <i32> [#uses=1]
%tmp29 = icmp eq i32 %tmp28, 0 ; <i1> [#uses=1]
br i1 %tmp29, label %bb569, label %bb31
bb31: ; preds = %bb
%tmp35 = sub i32 %r25.0.reg2mem.0, 0 ; <i32> [#uses=1]
%tmp36 = getelementptr [15 x i32]* @up, i32 0, i32 %tmp35 ; <i32*> [#uses=1]
%tmp37 = load i32* %tmp36, align 4 ; <i32> [#uses=1]
%tmp38 = icmp eq i32 %tmp37, 0 ; <i1> [#uses=1]
br i1 %tmp38, label %bb569, label %bb41
bb41: ; preds = %bb31
%tmp54 = sub i32 %r25.0.reg2mem.0, %c ; <i32> [#uses=1]
%tmp55 = add i32 %tmp54, 7 ; <i32> [#uses=1]
%tmp62 = getelementptr [15 x i32]* @up, i32 0, i32 %tmp55 ; <i32*> [#uses=2]
store i32 0, i32* %tmp62, align 4
br label %bb92
bb92: ; preds = %bb545, %bb41
%r20.0.reg2mem.0 = phi i32 [ 0, %bb41 ], [ %indvar.next711, %bb545 ] ; <i32> [#uses=5]
%tmp94 = getelementptr [8 x i32]* @rows, i32 0, i32 %r20.0.reg2mem.0 ; <i32*> [#uses=1]
%tmp95 = load i32* %tmp94, align 4 ; <i32> [#uses=0]
%tmp112 = add i32 %r20.0.reg2mem.0, %tmp91 ; <i32> [#uses=1]
%tmp113 = getelementptr [15 x i32]* @down, i32 0, i32 %tmp112 ; <i32*> [#uses=2]
%tmp114 = load i32* %tmp113, align 4 ; <i32> [#uses=1]
%tmp115 = icmp eq i32 %tmp114, 0 ; <i1> [#uses=1]
br i1 %tmp115, label %bb545, label %bb118
bb118: ; preds = %bb92
%tmp122 = sub i32 %r20.0.reg2mem.0, %tmp91 ; <i32> [#uses=0]
store i32 0, i32* %tmp113, align 4
store i32 %r20.0.reg2mem.0, i32* %tmp135, align 4
br label %bb142
bb142: ; preds = %bb142, %bb118
%k18.0.reg2mem.0 = phi i32 [ 0, %bb118 ], [ %indvar.next709, %bb142 ] ; <i32> [#uses=1]
%indvar.next709 = add i32 %k18.0.reg2mem.0, 1 ; <i32> [#uses=2]
%exitcond710 = icmp eq i32 %indvar.next709, 8 ; <i1> [#uses=1]
br i1 %exitcond710, label %bb155, label %bb142
bb155: ; preds = %bb142
%tmp156 = tail call i32 @putchar(i32 10) nounwind ; <i32> [#uses=0]
br label %bb545
bb545: ; preds = %bb155, %bb92
%indvar.next711 = add i32 %r20.0.reg2mem.0, 1 ; <i32> [#uses=2]
%exitcond712 = icmp eq i32 %indvar.next711, 8 ; <i1> [#uses=1]
br i1 %exitcond712, label %bb553, label %bb92
bb553: ; preds = %bb545
store i32 1, i32* %tmp62, align 4
br label %bb569
bb569: ; preds = %bb553, %bb31, %bb
%indvar.next715 = add i32 %r25.0.reg2mem.0, 1 ; <i32> [#uses=1]
br label %bb
}
declare i32 @putchar(i32)