[llvm] r357448 - [LoopPredication] Simplify widenable condition handling [NFC]

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 1 19:42:57 PDT 2019


Author: reames
Date: Mon Apr  1 19:42:57 2019
New Revision: 357448

URL: http://llvm.org/viewvc/llvm-project?rev=357448&view=rev
Log:
[LoopPredication] Simplify widenable condition handling [NFC]

The code doesn't actually need any of the information about the widenable condition at this level.  The only thing we need is to ensure the WC call is the last thing anded in, and even that is a quirk we should really look to remove.


Modified:
    llvm/trunk/lib/Transforms/Scalar/LoopPredication.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/LoopPredication.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopPredication.cpp?rev=357448&r1=357447&r2=357448&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopPredication.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopPredication.cpp Mon Apr  1 19:42:57 2019
@@ -594,6 +594,7 @@ unsigned LoopPredication::collectChecks(
   // 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(
       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(
     // 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::widenWidenableBran
   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::widenWidenableBran
       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);




More information about the llvm-commits mailing list