[llvm] r317016 - [IndVarSimplify] Extract wrapper around SE-.isLoopInvariantPredicate [NFC]

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 1 12:35:37 PDT 2017


FYI - I've gotten a report that this change has introduced a miscompile 
in a stage2 clang build.  I'm about to revert this and the following 
patch due to lack of time to investigate fully.


On 10/31/2017 11:04 AM, Philip Reames via llvm-commits wrote:
> Author: reames
> Date: Tue Oct 31 11:04:57 2017
> New Revision: 317016
>
> URL: http://llvm.org/viewvc/llvm-project?rev=317016&view=rev
> Log:
> [IndVarSimplify] Extract wrapper around SE-.isLoopInvariantPredicate [NFC]
>
> This an intermediate state, the next patch will re-inline the markLoopInvariantPredicate function to reduce code duplication.
>
>
> Modified:
>      llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp
>
> Modified: llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp?rev=317016&r1=317015&r2=317016&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp Tue Oct 31 11:04:57 2017
> @@ -83,6 +83,11 @@ namespace {
>   
>       bool eliminateOverflowIntrinsic(CallInst *CI);
>       bool eliminateIVUser(Instruction *UseInst, Instruction *IVOperand);
> +    bool isCheapLoopInvariantPredicate(ICmpInst::Predicate Pred,
> +           const SCEV *LHS, const SCEV *RHS, const Loop *L,
> +           const SmallDenseMap<const SCEV*, Value*> &FreeExpansions,
> +           ICmpInst::Predicate &InvariantPred,
> +           Value *&LHSV, Value *& RHSV);
>       bool makeIVComparisonInvariant(ICmpInst *ICmp, Value *IVOperand);
>       void eliminateIVComparison(ICmpInst *ICmp, Value *IVOperand);
>       void simplifyIVRemainder(BinaryOperator *Rem, Value *IVOperand,
> @@ -162,6 +167,26 @@ Value *SimplifyIndvar::foldIVUser(Instru
>     return IVSrc;
>   }
>   
> +bool SimplifyIndvar::isCheapLoopInvariantPredicate(ICmpInst::Predicate Pred,
> +           const SCEV *LHS, const SCEV *RHS, const Loop *L,
> +           const SmallDenseMap<const SCEV*, Value*> &FreeExpansions,
> +           ICmpInst::Predicate &InvariantPred,
> +           Value *&LHSV, Value *& RHSV) {
> +
> +  const SCEV *InvariantLHS, *InvariantRHS;
> +  if (!SE->isLoopInvariantPredicate(Pred, LHS, RHS, L, InvariantPred,
> +                                    InvariantLHS, InvariantRHS))
> +    return false;
> +
> +  // Rewrite the comparison to a loop invariant comparison if it can be done
> +  // cheaply, where cheaply means "we don't need to emit any new
> +  // instructions".
> +  LHSV = FreeExpansions.lookup(InvariantLHS);
> +  RHSV = FreeExpansions.lookup(InvariantRHS);
> +
> +  return (LHSV && RHSV);
> +}
> +
>   bool SimplifyIndvar::makeIVComparisonInvariant(ICmpInst *ICmp,
>                                                  Value *IVOperand) {
>     unsigned IVOperIdx = 0;
> @@ -179,19 +204,9 @@ bool SimplifyIndvar::makeIVComparisonInv
>     const SCEV *S = SE->getSCEVAtScope(ICmp->getOperand(IVOperIdx), ICmpLoop);
>     const SCEV *X = SE->getSCEVAtScope(ICmp->getOperand(1 - IVOperIdx), ICmpLoop);
>   
> -  ICmpInst::Predicate InvariantPredicate;
> -  const SCEV *InvariantLHS, *InvariantRHS;
> -
>     auto *PN = dyn_cast<PHINode>(IVOperand);
>     if (!PN)
>       return false;
> -  if (!SE->isLoopInvariantPredicate(Pred, S, X, L, InvariantPredicate,
> -                                    InvariantLHS, InvariantRHS))
> -    return false;
> -
> -  // Rewrite the comparison to a loop invariant comparison if it can be done
> -  // cheaply, where cheaply means "we don't need to emit any new
> -  // instructions".
>   
>     SmallDenseMap<const SCEV*, Value*> CheapExpansions;
>     CheapExpansions[S] = ICmp->getOperand(IVOperIdx);
> @@ -204,17 +219,18 @@ bool SimplifyIndvar::makeIVComparisonInv
>       const SCEV *IncomingS = SE->getSCEV(Incoming);
>       CheapExpansions[IncomingS] = Incoming;
>     }
> -  Value *NewLHS = CheapExpansions[InvariantLHS];
> -  Value *NewRHS = CheapExpansions[InvariantRHS];
>   
> -  if (!NewLHS || !NewRHS)
> -    // We could not find an existing value to replace either LHS or RHS.
> -    // Generating new instructions has subtler tradeoffs, so avoid doing that
> -    // for now.
> +  ICmpInst::Predicate NewPred;
> +  Value *NewLHS = nullptr, *NewRHS = nullptr;
> +
> +  if (!isCheapLoopInvariantPredicate(Pred, S, X, L, CheapExpansions,
> +                                     NewPred, NewLHS, NewRHS))
>       return false;
> +
> +  assert(NewLHS && NewRHS);
>   
>     DEBUG(dbgs() << "INDVARS: Simplified comparison: " << *ICmp << '\n');
> -  ICmp->setPredicate(InvariantPredicate);
> +  ICmp->setPredicate(NewPred);
>     ICmp->setOperand(0, NewLHS);
>     ICmp->setOperand(1, NewRHS);
>     return true;
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list