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

Chris Lattner lattner at cs.uiuc.edu
Mon Mar 10 17:15:01 PST 2003


Changes in directory llvm/lib/Transforms/Scalar:

InstructionCombining.cpp updated: 1.75 -> 1.76

---
Log message:

Add new transformation: // (~A | ~B) == (~(A & B))


---
Diffs of the changes:

Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.75 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.76
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.75	Mon Mar 10 17:06:50 2003
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp	Mon Mar 10 17:13:59 2003
@@ -446,6 +446,7 @@
     Instruction *Or = BinaryOperator::create(Instruction::Or, Op0NotVal,
                                              Op1NotVal,I.getName()+".demorgan",
                                              &I);
+    WorkList.push_back(Or);
     return BinaryOperator::createNot(Or);
   }
 
@@ -470,15 +471,25 @@
     if (RHS->isAllOnesValue())
       return ReplaceInstUsesWith(I, Op1);
 
-  if (Value *X = dyn_castNotVal(Op0))   // ~A | A == -1
-    if (X == Op1)
-      return ReplaceInstUsesWith(I, 
-                            ConstantIntegral::getAllOnesValue(I.getType()));
-
-  if (Value *X = dyn_castNotVal(Op1))   // A | ~A == -1
-    if (X == Op0)
-      return ReplaceInstUsesWith(I, 
-                            ConstantIntegral::getAllOnesValue(I.getType()));
+  Value *Op0NotVal = dyn_castNotVal(Op0);
+  Value *Op1NotVal = dyn_castNotVal(Op1);
+
+  if (Op1 == Op0NotVal)   // ~A | A == -1
+    return ReplaceInstUsesWith(I, 
+                               ConstantIntegral::getAllOnesValue(I.getType()));
+
+  if (Op0 == Op1NotVal)   // A | ~A == -1
+    return ReplaceInstUsesWith(I, 
+                               ConstantIntegral::getAllOnesValue(I.getType()));
+
+  // (~A | ~B) == (~(A & B)) - Demorgan's Law
+  if (Op0NotVal && Op1NotVal && isOnlyUse(Op0) && isOnlyUse(Op1)) {
+    Instruction *And = BinaryOperator::create(Instruction::And, Op0NotVal,
+                                              Op1NotVal,I.getName()+".demorgan",
+                                              &I);
+    WorkList.push_back(And);
+    return BinaryOperator::createNot(And);
+  }
 
   return Changed ? &I : 0;
 }





More information about the llvm-commits mailing list