diff options
| author | Nick Lewycky <nicholas@mxc.ca> | 2008-07-09 04:32:37 +0000 |
|---|---|---|
| committer | Nick Lewycky <nicholas@mxc.ca> | 2008-07-09 04:32:37 +0000 |
| commit | 0d3645e67357a72c93d9f6c3f93d58e4cdde15ca (patch) | |
| tree | 5420a9708668ad432bdd40dc83eee49b69ba2d0b /llvm/lib/Transforms/Scalar | |
| parent | a6ce3cee2f48bbd0b73f8fe88e144832a704340b (diff) | |
| download | bcm5719-llvm-0d3645e67357a72c93d9f6c3f93d58e4cdde15ca.tar.gz bcm5719-llvm-0d3645e67357a72c93d9f6c3f93d58e4cdde15ca.zip | |
Reduce x - y to -y when we know the 'x' part will get masked off anyways.
llvm-svn: 53271
Diffstat (limited to 'llvm/lib/Transforms/Scalar')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index f8ad98c5170..675f7ec5714 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -3461,6 +3461,17 @@ Instruction *InstCombiner::visitAnd(BinaryOperator &I) { // ((A ^ N) - B) & AndRHS -> (A - B) & AndRHS iff N&AndRHS == 0 if (Value *V = FoldLogicalPlusAnd(Op0LHS, Op0RHS, AndRHS, true, I)) return BinaryOperator::CreateAnd(V, AndRHS); + + // (A - N) & AndRHS -> -N & AndRHS where A & AndRHS == 0 + if (Op0I->hasOneUse() && MaskedValueIsZero(Op0LHS, AndRHSMask)) { + ConstantInt *A = dyn_cast<ConstantInt>(Op0LHS); + if (!A || !A->isZero()) { + Instruction *NewNeg = BinaryOperator::CreateNeg(Op0RHS); + InsertNewInstBefore(NewNeg, I); + return BinaryOperator::CreateAnd(NewNeg, AndRHS); + } + } + break; } @@ -3780,7 +3791,7 @@ Instruction *InstCombiner::visitAnd(BinaryOperator &I) { } } } - + return Changed ? &I : 0; } |

