From: Yi Jiang Date: Wed, 29 Oct 2014 20:19:47 +0000 (+0000) Subject: Do not simplifyLatch for loops where hoisting increments couldresult in extra live... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=a5ca5d9f8250c3fc1809d8821fb28b545ab01ae7;p=oota-llvm.git Do not simplifyLatch for loops where hoisting increments couldresult in extra live range interferance git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220872 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/LoopRotation.cpp b/lib/Transforms/Scalar/LoopRotation.cpp index ddb53926ff7..afd2eca598e 100644 --- a/lib/Transforms/Scalar/LoopRotation.cpp +++ b/lib/Transforms/Scalar/LoopRotation.cpp @@ -194,8 +194,13 @@ static void RewriteUsesOfClonedInstructions(BasicBlock *OrigHeader, /// heuristics. We handle a single arithmetic instruction along with any type /// conversions. static bool shouldSpeculateInstrs(BasicBlock::iterator Begin, - BasicBlock::iterator End) { + BasicBlock::iterator End, Loop *L) { bool seenIncrement = false; + bool MultiExitLoop = false; + + if (!L->getExitingBlock()) + MultiExitLoop = true; + for (BasicBlock::iterator I = Begin; I != End; ++I) { if (!isSafeToSpeculativelyExecute(I)) @@ -219,11 +224,33 @@ static bool shouldSpeculateInstrs(BasicBlock::iterator Begin, case Instruction::Xor: case Instruction::Shl: case Instruction::LShr: - case Instruction::AShr: + case Instruction::AShr: { + Value *IVOpnd = nullptr; + if (isa(I->getOperand(0))) + IVOpnd = I->getOperand(1); + + if (isa(I->getOperand(1))) { + if (IVOpnd) + return false; + + IVOpnd = I->getOperand(0); + } + + // If increment operand is used outside of the loop, this speculation + // could cause extra live range interference. + if (MultiExitLoop && IVOpnd) { + for (User *UseI : IVOpnd->users()) { + auto *UserInst = cast(UseI); + if (!L->contains(UserInst)) + return false; + } + } + if (seenIncrement) return false; seenIncrement = true; break; + } case Instruction::Trunc: case Instruction::ZExt: case Instruction::SExt: @@ -259,7 +286,7 @@ bool LoopRotate::simplifyLoopLatch(Loop *L) { if (!BI) return false; - if (!shouldSpeculateInstrs(Latch->begin(), Jmp)) + if (!shouldSpeculateInstrs(Latch->begin(), Jmp, L)) return false; DEBUG(dbgs() << "Folding loop latch " << Latch->getName() << " into " diff --git a/test/Transforms/LoopRotate/dbgvalue.ll b/test/Transforms/LoopRotate/dbgvalue.ll index e90065609aa..4da0776d6c8 100644 --- a/test/Transforms/LoopRotate/dbgvalue.ll +++ b/test/Transforms/LoopRotate/dbgvalue.ll @@ -46,9 +46,9 @@ define void @FindFreeHorzSeg(i64 %startCol, i64 %row, i64* %rowStart) { ; CHECK-LABEL: define void @FindFreeHorzSeg( ; CHECK: %dec = add ; CHECK-NEXT: tail call void @llvm.dbg.value -; CHECK-NEXT: br i1 %tobool, label %for.cond, label %[[LOOP_EXIT:[^,]*]] -; CHECK: [[LOOP_EXIT]]: -; CHECK-NEXT: phi i64 [ %{{[^,]*}}, %{{[^,]*}} ] +; CHECK: %cmp = icmp +; CHECK: br i1 %cmp +; CHECK: phi i64 [ %{{[^,]*}}, %{{[^,]*}} ] ; CHECK-NEXT: br label %for.end diff --git a/test/Transforms/LoopRotate/simplifylatch.ll b/test/Transforms/LoopRotate/simplifylatch.ll index d646cb9d6cb..62e5b1ae11d 100644 --- a/test/Transforms/LoopRotate/simplifylatch.ll +++ b/test/Transforms/LoopRotate/simplifylatch.ll @@ -4,7 +4,7 @@ @mode_table = global [4 x i32] zeroinitializer ; <[4 x i32]*> [#uses=1] ; CHECK-LABEL: @f( -; CHECK-NOT: bb4 +; CHECK-NOT: bb: define i8 @f() { entry: tail call i32 @fegetround( ) ; :0 [#uses=1]