1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 04:02:41 +01:00

- instcombine demorgan's law: and (not A), (not B) == not (or A, B)

llvm-svn: 3495
This commit is contained in:
Chris Lattner 2002-08-23 18:32:43 +00:00
parent 21c1619f4a
commit 66b1127636

View File

@ -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;
}