diff options
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopPredication.cpp | 27 | 
1 files changed, 18 insertions, 9 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopPredication.cpp b/llvm/lib/Transforms/Scalar/LoopPredication.cpp index 2b031ba4184..8487278d3d6 100644 --- a/llvm/lib/Transforms/Scalar/LoopPredication.cpp +++ b/llvm/lib/Transforms/Scalar/LoopPredication.cpp @@ -594,6 +594,7 @@ unsigned LoopPredication::collectChecks(SmallVectorImpl<Value *> &Checks,    // resulting list of subconditions in Checks vector.    SmallVector<Value *, 4> Worklist(1, Condition);    SmallPtrSet<Value *, 4> Visited; +  Value *WideableCond = nullptr;    do {      Value *Condition = Worklist.pop_back_val();      if (!Visited.insert(Condition).second) @@ -607,6 +608,13 @@ unsigned LoopPredication::collectChecks(SmallVectorImpl<Value *> &Checks,        continue;      } +    if (match(Condition, +              m_Intrinsic<Intrinsic::experimental_widenable_condition>())) { +      // Pick any, we don't care which +      WideableCond = Condition; +      continue; +    } +      if (ICmpInst *ICI = dyn_cast<ICmpInst>(Condition)) {        if (auto NewRangeCheck = widenICmpRangeCheck(ICI, Expander,                                                     Builder)) { @@ -619,6 +627,12 @@ unsigned LoopPredication::collectChecks(SmallVectorImpl<Value *> &Checks,      // Save the condition as is if we can't widen it      Checks.push_back(Condition);    } while (!Worklist.empty()); +  // At the moment, our matching logic for wideable conditions implicitly +  // assumes we preserve the form: (br (and Cond, WC())).  FIXME +  // Note that if there were multiple calls to wideable condition in the +  // traversal, we only need to keep one, and which one is arbitrary. +  if (WideableCond) +    Checks.push_back(WideableCond);    return NumWidened;  } @@ -662,10 +676,8 @@ bool LoopPredication::widenWidenableBranchGuardConditions(    TotalConsidered++;    SmallVector<Value *, 4> Checks;    IRBuilder<> Builder(cast<Instruction>(Preheader->getTerminator())); -  Value *Condition = nullptr, *WidenableCondition = nullptr; -  BasicBlock *GBB = nullptr, *DBB = nullptr; -  parseWidenableBranch(BI, Condition, WidenableCondition, GBB, DBB); -  unsigned NumWidened = collectChecks(Checks, Condition, Expander, Builder); +  unsigned NumWidened = collectChecks(Checks, BI->getCondition(), +                                      Expander, Builder);    if (NumWidened == 0)      return false; @@ -679,11 +691,8 @@ bool LoopPredication::widenWidenableBranchGuardConditions(        LastCheck = Check;      else        LastCheck = Builder.CreateAnd(LastCheck, Check); -  // Make sure that the check contains widenable condition and therefore can be -  // further widened. -  LastCheck = Builder.CreateAnd(LastCheck, WidenableCondition); -  auto *OldCond = BI->getOperand(0); -  BI->setOperand(0, LastCheck); +  auto *OldCond = BI->getCondition(); +  BI->setCondition(LastCheck);    assert(isGuardAsWidenableBranch(BI) &&           "Stopped being a guard after transform?");    RecursivelyDeleteTriviallyDeadInstructions(OldCond);  | 

