From 298c45e845e1743f86b060cd280e8729cd4ba468 Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Sun, 12 Sep 2010 06:09:23 +0000 Subject: Revert 113679, it was causing an infinite loop in a testcase that I've sent on to Owen. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@113720 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/InstCombine/InstCombineAndOrXor.cpp | 35 ++++------------------ 1 file changed, 5 insertions(+), 30 deletions(-) (limited to 'lib/Transforms') diff --git a/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp index d30655f985..3dc8779879 100644 --- a/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp +++ b/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp @@ -207,26 +207,12 @@ Instruction *InstCombiner::OptAndOp(Instruction *Op, } break; case Instruction::Or: - if (Op->hasOneUse()){ - if (Together != OpRHS) { - // (X | C1) & C2 --> (X | (C1&C2)) & C2 - Value *Or = Builder->CreateOr(X, Together); - Or->takeName(Op); - return BinaryOperator::CreateAnd(Or, AndRHS); - } - - ConstantInt *TogetherCI = dyn_cast(Together); - if (TogetherCI && !TogetherCI->isZero()){ - // (X | C1) & C2 --> (X & (C2^(C1&C2))) | C1 - // NOTE: This reduces the number of bits set in the & mask, which - // can expose opportunities for store narrowing. - Together = ConstantExpr::getXor(AndRHS, Together); - Value *And = Builder->CreateAnd(X, Together); - And->takeName(Op); - return BinaryOperator::CreateOr(And, OpRHS); - } + if (Op->hasOneUse() && Together != OpRHS) { + // (X | C1) & C2 --> (X | (C1&C2)) & C2 + Value *Or = Builder->CreateOr(X, Together); + Or->takeName(Op); + return BinaryOperator::CreateAnd(Or, AndRHS); } - break; case Instruction::Add: if (Op->hasOneUse()) { @@ -1957,17 +1943,6 @@ Instruction *InstCombiner::visitOr(BinaryOperator &I) { } } - // Note: If we've gotten to the point of visiting the outer OR, then the - // inner one couldn't be simplified. If it was a constant, then it won't - // be simplified by a later pass either, so we try swapping the inner/outer - // ORs in the hopes that we'll be able to simplify it this way. - // (X|C) | V --> (X|V) | C - if (Op0->hasOneUse() && match(Op0, m_Or(m_Value(A), m_ConstantInt(C1)))) { - Value *Inner = Builder->CreateOr(Op0, Op1); - Inner->takeName(Op0); - return BinaryOperator::CreateOr(Inner, C1); - } - return Changed ? &I : 0; } -- cgit v1.2.3