diff options
author | Chris Lattner <sabre@nondot.org> | 2002-08-23 18:32:43 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-08-23 18:32:43 +0000 |
commit | e6f9a91618224dea065a440f3627bbb6c744ccc3 (patch) | |
tree | 5b5903f67e0a1257092ed3c4161cbc820af0382a | |
parent | 31901f80f83de51de851335dda3a5a152d0ddf9d (diff) |
- instcombine demorgan's law: and (not A), (not B) == not (or A, B)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3495 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Scalar/InstructionCombining.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 0f8ae0c6bd..14a13fe363 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -81,6 +81,8 @@ namespace { // in the program. Add the new instruction to the worklist. // void InsertNewInstBefore(Instruction *New, Instruction &Old) { + assert(New && New->getParent() == 0 && + "New instruction already inserted into a basic block!"); BasicBlock *BB = Old.getParent(); BB->getInstList().insert(&Old, New); // Insert inst WorkList.push_back(New); // Add to worklist @@ -292,6 +294,16 @@ Instruction *InstCombiner::visitAnd(BinaryOperator &I) { if (RHS->isAllOnesValue()) return ReplaceInstUsesWith(I, Op0); + // and (not A), (not B) == not (or A, B) + if (Op0->use_size() == 1 && Op1->use_size() == 1) + if (Value *A = dyn_castNotInst(Op0)) + if (Value *B = dyn_castNotInst(Op1)) { + Instruction *Or = BinaryOperator::create(Instruction::Or, A, B, + I.getName()+".demorgan"); + InsertNewInstBefore(Or, I); + return BinaryOperator::createNot(Or, I.getName()); + } + return Changed ? &I : 0; } |