[llvm] r324450 - [LoopPrediction] Introduce utility function getLatchPredicateForGuard. NFC.

Serguei Katkov via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 6 22:53:37 PST 2018


Author: skatkov
Date: Tue Feb  6 22:53:37 2018
New Revision: 324450

URL: http://llvm.org/viewvc/llvm-project?rev=324450&view=rev
Log:
[LoopPrediction] Introduce utility function getLatchPredicateForGuard. NFC.

Factor out getting the predicate for latch condition in a guard to
utility function getLatchPredicateForGuard.

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=324450&r1=324449&r2=324450&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopPredication.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopPredication.cpp Tue Feb  6 22:53:37 2018
@@ -266,6 +266,11 @@ class LoopPredication {
   // Return the loopLatchCheck corresponding to the RangeCheckType if safe to do
   // so.
   Optional<LoopICmp> generateLoopLatchCheck(Type *RangeCheckType);
+
+  // Returns the latch predicate for guard. SGT -> SGE, UGT -> UGE, SGE -> SGT,
+  // UGE -> UGT, etc.
+  ICmpInst::Predicate getLatchPredicateForGuard(ICmpInst::Predicate Pred);
+
 public:
   LoopPredication(ScalarEvolution *SE) : SE(SE){};
   bool runOnLoop(Loop *L);
@@ -391,6 +396,30 @@ bool LoopPredication::CanExpand(const SC
   return SE->isLoopInvariant(S, L) && isSafeToExpand(S, *SE);
 }
 
+ICmpInst::Predicate
+LoopPredication::getLatchPredicateForGuard(ICmpInst::Predicate Pred) {
+  switch (LatchCheck.Pred) {
+  case ICmpInst::ICMP_ULT:
+    return ICmpInst::ICMP_ULE;
+  case ICmpInst::ICMP_ULE:
+    return ICmpInst::ICMP_ULT;
+  case ICmpInst::ICMP_SLT:
+    return ICmpInst::ICMP_SLE;
+  case ICmpInst::ICMP_SLE:
+    return ICmpInst::ICMP_SLT;
+  case ICmpInst::ICMP_UGT:
+    return ICmpInst::ICMP_UGE;
+  case ICmpInst::ICMP_UGE:
+    return ICmpInst::ICMP_UGT;
+  case ICmpInst::ICMP_SGT:
+    return ICmpInst::ICMP_SGE;
+  case ICmpInst::ICMP_SGE:
+    return ICmpInst::ICMP_SGT;
+  default:
+    llvm_unreachable("Unsupported loop latch!");
+  }
+}
+
 Optional<Value *> LoopPredication::widenICmpRangeCheckIncrementingLoop(
     LoopPredication::LoopICmp LatchCheck, LoopPredication::LoopICmp RangeCheck,
     SCEVExpander &Expander, IRBuilder<> &Builder) {
@@ -415,23 +444,7 @@ Optional<Value *> LoopPredication::widen
     DEBUG(dbgs() << "Can't expand limit check!\n");
     return None;
   }
-  ICmpInst::Predicate LimitCheckPred;
-  switch (LatchCheck.Pred) {
-  case ICmpInst::ICMP_ULT:
-    LimitCheckPred = ICmpInst::ICMP_ULE;
-    break;
-  case ICmpInst::ICMP_ULE:
-    LimitCheckPred = ICmpInst::ICMP_ULT;
-    break;
-  case ICmpInst::ICMP_SLT:
-    LimitCheckPred = ICmpInst::ICMP_SLE;
-    break;
-  case ICmpInst::ICMP_SLE:
-    LimitCheckPred = ICmpInst::ICMP_SLT;
-    break;
-  default:
-    llvm_unreachable("Unsupported loop latch!");
-  }
+  auto LimitCheckPred = getLatchPredicateForGuard(LatchCheck.Pred);
 
   DEBUG(dbgs() << "LHS: " << *LatchLimit << "\n");
   DEBUG(dbgs() << "RHS: " << *RHS << "\n");




More information about the llvm-commits mailing list