Combine not (not X) -> X
authorChris Lattner <sabre@nondot.org>
Mon, 6 May 2002 17:03:21 +0000 (17:03 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 6 May 2002 17:03:21 +0000 (17:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2493 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index 9679a2b6aabc2b3d59fdfbce759b05107b43be71..0c089120eadb056fcb2e0d65ea8a14191df9e477 100644 (file)
@@ -57,7 +57,7 @@ namespace {
     //     I          - Change was made, I is still valid
     //   otherwise    - Change was made, replace I with returned instruction
     //   
-
+    Instruction *visitNot(UnaryOperator *I);
     Instruction *visitAdd(BinaryOperator *I);
     Instruction *visitSub(BinaryOperator *I);
     Instruction *visitMul(BinaryOperator *I);
@@ -78,6 +78,19 @@ namespace {
 }
 
 
+Instruction *InstCombiner::visitNot(UnaryOperator *I) {
+  if (I->use_empty()) return 0;       // Don't fix dead instructions...
+
+  // not (not X) = X
+  if (Instruction *Op = dyn_cast<Instruction>(I->getOperand(0)))
+    if (Op->getOpcode() == Instruction::Not) {
+      AddUsesToWorkList(I);         // Add all modified instrs to worklist
+      I->replaceAllUsesWith(Op->getOperand(0));
+      return I;
+    }
+  return 0;
+}
+
 
 // Make sure that this instruction has a constant on the right hand side if it
 // has any constant arguments.  If not, fix it an return true.