[llvm-commits] CVS: llvm/lib/Transforms/Scalar/PredicateSimplifier.cpp

Nick Lewycky nicholas at mxc.ca
Fri Apr 6 21:49:30 PDT 2007



Changes in directory llvm/lib/Transforms/Scalar:

PredicateSimplifier.cpp updated: 1.64 -> 1.65
---
Log message:

Support NE inequality in ValueRanges.


---
Diffs of the changes:  (+58 -3)

 PredicateSimplifier.cpp |   61 +++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 58 insertions(+), 3 deletions(-)


Index: llvm/lib/Transforms/Scalar/PredicateSimplifier.cpp
diff -u llvm/lib/Transforms/Scalar/PredicateSimplifier.cpp:1.64 llvm/lib/Transforms/Scalar/PredicateSimplifier.cpp:1.65
--- llvm/lib/Transforms/Scalar/PredicateSimplifier.cpp:1.64	Fri Apr  6 22:36:51 2007
+++ llvm/lib/Transforms/Scalar/PredicateSimplifier.cpp	Fri Apr  6 23:49:12 2007
@@ -949,6 +949,60 @@
       update(V, CR, Subtree);
     }
 
+    void addNotEquals(Value *V1, Value *V2, ETNode *Subtree, VRPSolver *VRP) {
+      uint32_t W = typeToWidth(V1->getType());
+      if (!W) return;
+
+      ConstantRange CR1 = rangeFromValue(V1, Subtree, W);
+      ConstantRange CR2 = rangeFromValue(V2, Subtree, W);
+
+      if (const APInt *I = CR1.getSingleElement()) {
+        if (CR2.isFullSet()) {
+          ConstantRange NewCR2(CR1.getUpper(), CR1.getLower());
+          applyRange(V2, NewCR2, Subtree, VRP);
+        } else if (*I == CR2.getLower()) {
+          APInt NewLower = CR2.getLower() + 1,
+                NewUpper = CR2.getUpper();
+          if (NewLower == NewUpper)
+            NewLower = NewUpper = APInt::getMinValue(W);
+
+          ConstantRange NewCR2(NewLower, NewUpper);
+          applyRange(V2, NewCR2, Subtree, VRP);
+        } else if (*I == CR2.getUpper() - 1) {
+          APInt NewLower = CR2.getLower(),
+                NewUpper = CR2.getUpper() - 1;
+          if (NewLower == NewUpper)
+            NewLower = NewUpper = APInt::getMinValue(W);
+
+          ConstantRange NewCR2(NewLower, NewUpper);
+          applyRange(V2, NewCR2, Subtree, VRP);
+        }
+      }
+
+      if (const APInt *I = CR2.getSingleElement()) {
+        if (CR1.isFullSet()) {
+          ConstantRange NewCR1(CR2.getUpper(), CR2.getLower());
+          applyRange(V1, NewCR1, Subtree, VRP);
+        } else if (*I == CR1.getLower()) {
+          APInt NewLower = CR1.getLower() + 1,
+                NewUpper = CR1.getUpper();
+          if (NewLower == NewUpper)
+            NewLower = NewUpper = APInt::getMinValue(W);
+
+          ConstantRange NewCR1(NewLower, NewUpper);
+          applyRange(V1, NewCR1, Subtree, VRP);
+        } else if (*I == CR1.getUpper() - 1) {
+          APInt NewLower = CR1.getLower(),
+                NewUpper = CR1.getUpper() - 1;
+          if (NewLower == NewUpper)
+            NewLower = NewUpper = APInt::getMinValue(W);
+
+          ConstantRange NewCR1(NewLower, NewUpper);
+          applyRange(V1, NewCR1, Subtree, VRP);
+        }
+      }
+    }
+
     void addInequality(Value *V1, Value *V2, ETNode *Subtree, LatticeVal LV,
                        VRPSolver *VRP) {
       assert(!isRelatedBy(V1, V2, Subtree, LV) && "Asked to do useless work.");
@@ -956,9 +1010,10 @@
       assert(isCanonical(V1, Subtree, VRP) && "Value not canonical.");
       assert(isCanonical(V2, Subtree, VRP) && "Value not canonical.");
 
-      if (LV == NE) return; // we can't represent those.
-      // XXX: except in the case where isSingleElement and equal to either
-      // Lower or Upper. That's probably not profitable. (Type::Int1Ty?)
+      if (LV == NE) {
+        addNotEquals(V1, V2, Subtree, VRP);
+        return;
+      }
 
       uint32_t W = typeToWidth(V1->getType());
       if (!W) return;






More information about the llvm-commits mailing list