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

Chris Lattner lattner at cs.uiuc.edu
Wed Jul 23 14:27:00 PDT 2003


Changes in directory llvm/lib/Transforms/Scalar:

InstructionCombining.cpp updated: 1.102 -> 1.103

---
Log message:

  - InstCombine: (X | C1) & C2 --> X & C2 iff C1 & C1 == 0
  - InstCombine: (X | C) & C --> C
  - InstCombine: (X | C1) & C2 --> (X | (C1&C2)) & C2


---
Diffs of the changes:

Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.102 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.103
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.102	Wed Jul 23 13:29:44 2003
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp	Wed Jul 23 14:25:52 2003
@@ -497,16 +497,39 @@
     if (RHS->isAllOnesValue())
       return ReplaceInstUsesWith(I, Op0);
 
-    // (X ^ C1) & C2 --> (X & C2) ^ (C1&C2)
-    if (Instruction *Op0I = dyn_cast<Instruction>(Op0))
-      if (Op0I->getOpcode() == Instruction::Xor && isOnlyUse(Op0))
-        if (ConstantInt *Op0CI = dyn_cast<ConstantInt>(Op0I->getOperand(1))) {
-          std::string Op0Name = Op0I->getName(); Op0I->setName("");
-          Instruction *And = BinaryOperator::create(Instruction::And,
-                                                    Op0I->getOperand(0), RHS,
-                                                   Op0Name);
-          InsertNewInstBefore(And, I);
-          return BinaryOperator::create(Instruction::Xor, And, *RHS & *Op0CI);
+    if (BinaryOperator *Op0I = dyn_cast<BinaryOperator>(Op0))
+      if (ConstantInt *Op0CI = dyn_cast<ConstantInt>(Op0I->getOperand(1)))
+        if (Op0I->getOpcode() == Instruction::Xor) {
+          if (isOnlyUse(Op0)) {
+            // (X ^ C1) & C2 --> (X & C2) ^ (C1&C2)
+            std::string Op0Name = Op0I->getName(); Op0I->setName("");
+            Instruction *And = BinaryOperator::create(Instruction::And,
+                                                      Op0I->getOperand(0), RHS,
+                                                      Op0Name);
+            InsertNewInstBefore(And, I);
+            return BinaryOperator::create(Instruction::Xor, And, *RHS & *Op0CI);
+          }
+        } else if (Op0I->getOpcode() == Instruction::Or) {
+          // (X | C1) & C2 --> X & C2 iff C1 & C1 == 0
+          if ((*RHS & *Op0CI)->isNullValue())
+            return BinaryOperator::create(Instruction::And, Op0I->getOperand(0),
+                                          RHS);
+
+          Constant *Together = *RHS & *Op0CI;
+          if (Together == RHS) // (X | C) & C --> C
+            return ReplaceInstUsesWith(I, RHS);
+
+          if (isOnlyUse(Op0)) {
+            if (Together != Op0CI) {
+              // (X | C1) & C2 --> (X | (C1&C2)) & C2
+              std::string Op0Name = Op0I->getName(); Op0I->setName("");
+              Instruction *Or = BinaryOperator::create(Instruction::Or,
+                                                        Op0I->getOperand(0),
+                                                        Together, Op0Name);
+              InsertNewInstBefore(Or, I);
+              return BinaryOperator::create(Instruction::And, Or, RHS);
+            }
+          }
         }
   }
 





More information about the llvm-commits mailing list