From c2695eba5700c785c2ae144eede7e1a932e3f5f3 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Wed, 27 May 2009 21:10:47 +0000 Subject: [PATCH] Revert 72493 and replace it with a more conservative fix, for now: don't rewrite the comparison if there is any implicit extension or truncation on the induction variable. I'm planning for IVUsers to eventually take over some of the work of this code, and for it to be generalized. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@72496 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LoopStrengthReduce.cpp | 15 +++++------ .../change-compare-stride-trickiness-2.ll | 25 +++++++++++++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp index 834a95d7318..92270b5b647 100644 --- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -1993,6 +1993,12 @@ ICmpInst *LoopStrengthReduce::ChangeCompareStride(Loop *L, ICmpInst *Cond, ValidScale(!CommonExprs->isZero(), Scale, UsersToProcess)) continue; + // Avoid rewriting the compare instruction with an iv which has + // implicit extension or truncation built into it. + // TODO: This is over-conservative. + if (SE->getTypeSizeInBits(CondUse->getOffset()->getType()) != TyBits) + continue; + // If scale is negative, use swapped predicate unless it's testing // for equality. if (Scale < 0 && !Cond->isEquality()) @@ -2005,16 +2011,11 @@ ICmpInst *LoopStrengthReduce::ChangeCompareStride(Loop *L, ICmpInst *Cond, ConstantInt *CI = ConstantInt::get(NewCmpIntTy, NewCmpVal); NewCmpRHS = ConstantExpr::getIntToPtr(CI, NewCmpTy); } - NewOffset = CondUse->getOffset(); - if (CondUse->isSigned()) - NewOffset = SE->getNoopOrSignExtend(CondUse->getOffset(), NewCmpTy); - else - NewOffset = SE->getNoopOrZeroExtend(CondUse->getOffset(), NewCmpTy); NewOffset = TyBits == NewTyBits - ? SE->getMulExpr(NewOffset, + ? SE->getMulExpr(CondUse->getOffset(), SE->getConstant(ConstantInt::get(CmpTy, Scale))) : SE->getConstant(ConstantInt::get(NewCmpIntTy, - cast(NewOffset)->getValue() + cast(CondUse->getOffset())->getValue() ->getSExtValue()*Scale)); break; } diff --git a/test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness-2.ll b/test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness-2.ll index e3cb3a50953..f77aea39370 100644 --- a/test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness-2.ll +++ b/test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness-2.ll @@ -31,3 +31,28 @@ if.end52: ; preds = %for.cond.i.preheader %indvar.next689 = add i64 %indvar688, 1 ; [#uses=1] br i1 %phitmp654, label %for.cond.i.preheader, label %if.end } + +define void @promote(%struct.dumperinfo* %di) nounwind { +entry: + br label %if.end + +if.end: ; preds = %if.end52, %entry + br label %for.cond.i.preheader + +for.cond.i.preheader: ; preds = %if.end52, %if.end + %indvar688 = phi i32 [ 0, %if.end ], [ %indvar.next689, %if.end52 ] ; [#uses=3] + %tmp690 = shl i32 %indvar688, 12 ; [#uses=1] + %pa.0642 = add i32 %tmp690, 0 ; [#uses=1] + %tmp692693 = add i32 %indvar688, 1 ; [#uses=1] + %phitmp = sext i32 %tmp692693 to i64 ; [#uses=1] + br i1 false, label %if.end52, label %land.lhs.true.i + +land.lhs.true.i: ; preds = %for.cond.i.preheader + %shr2.i = lshr i32 %pa.0642, 18 ; [#uses=0] + unreachable + +if.end52: ; preds = %for.cond.i.preheader + %phitmp654 = icmp ult i64 %phitmp, 512 ; [#uses=1] + %indvar.next689 = add i32 %indvar688, 1 ; [#uses=1] + br i1 %phitmp654, label %for.cond.i.preheader, label %if.end +}