Strengthen icmp snuggling by doing 'compare-or-equal-to' to 'compare'
authorNick Lewycky <nicholas@mxc.ca>
Sat, 7 Apr 2007 02:30:14 +0000 (02:30 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Sat, 7 Apr 2007 02:30:14 +0000 (02:30 +0000)
first and then range testing second.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35715 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/PredicateSimplifier.cpp

index 6ac309a8af0e936a1c78b2126902e34c091118cd..ac8ceb260cc65bd6eb174b3c95d36ac417bd0f1d 100644 (file)
@@ -2182,11 +2182,33 @@ namespace {
     // Eg., if x = [0, 4) and we're being asked icmp uge %x, 3 then change
     // the predicate to eq.
 
+    // XXX: once we do full PHI handling, modifying the instruction in the
+    // Forwards visitor will cause missed optimizations.
+
     ICmpInst::Predicate Pred = IC.getPredicate();
 
+    switch (Pred) {
+      default: break;
+      case ICmpInst::ICMP_ULE: Pred = ICmpInst::ICMP_ULT; break;
+      case ICmpInst::ICMP_UGE: Pred = ICmpInst::ICMP_UGT; break;
+      case ICmpInst::ICMP_SLE: Pred = ICmpInst::ICMP_SLT; break;
+      case ICmpInst::ICMP_SGE: Pred = ICmpInst::ICMP_SGT; break;
+    }
+    if (Pred != IC.getPredicate()) {
+      VRPSolver VRP(IG, UB, VR, PS->Forest, PS->modified, &IC);
+      if (VRP.isRelatedBy(IC.getOperand(1), IC.getOperand(0),
+                          ICmpInst::ICMP_NE)) {
+        ++NumSnuggle;
+        PS->modified = true;
+        IC.setPredicate(Pred);
+      }
+    }
+
+    Pred = IC.getPredicate();
+
     if (ConstantInt *Op1 = dyn_cast<ConstantInt>(IC.getOperand(1))) {
       ConstantInt *NextVal = 0;
-      switch(Pred) {
+      switch (Pred) {
         default: break;
         case ICmpInst::ICMP_SLT:
         case ICmpInst::ICMP_ULT:
@@ -2214,24 +2236,9 @@ namespace {
           IC.eraseFromParent();
           ++NumSnuggle;
           PS->modified = true;
-          return;
         }
       }
     }
-
-    switch(Pred) {
-      default: return;
-      case ICmpInst::ICMP_ULE: Pred = ICmpInst::ICMP_ULT; break;
-      case ICmpInst::ICMP_UGE: Pred = ICmpInst::ICMP_UGT; break;
-      case ICmpInst::ICMP_SLE: Pred = ICmpInst::ICMP_SLT; break;
-      case ICmpInst::ICMP_SGE: Pred = ICmpInst::ICMP_SGT; break;
-    }
-    VRPSolver VRP(IG, UB, VR, PS->Forest, PS->modified, &IC);
-    if (VRP.isRelatedBy(IC.getOperand(1), IC.getOperand(0), Pred)) {
-      ++NumSnuggle;
-      PS->modified = true;
-      IC.setPredicate(Pred);
-    }
   }
 
   RegisterPass<PredicateSimplifier> X("predsimplify",