summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2018-09-03 18:21:59 +0000
committerSanjay Patel <spatel@rotateright.com>2018-09-03 18:21:59 +0000
commitd75064e6d502fb65265289a29468ff5dd7dd4685 (patch)
tree246ea4f777eaf890a3659ea12f78abf35ab753d4 /llvm/lib/Transforms
parent7a213d2f9b9c069293f6ffea6c8beaa508a5de31 (diff)
downloadbcm5719-llvm-d75064e6d502fb65265289a29468ff5dd7dd4685.tar.gz
bcm5719-llvm-d75064e6d502fb65265289a29468ff5dd7dd4685.zip
[InstCombine] allow add+not --> sub for arbitrary vector constants.
llvm-svn: 341335
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp9
1 files changed, 4 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index f34ec13f02e..9af5ad05ae5 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -2699,6 +2699,10 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) {
Constant *NotC = ConstantExpr::getNot(C);
return BinaryOperator::CreateAShr(NotC, Y);
}
+
+ // ~(X + C) --> -(C + 1) - X
+ if (match(Op0, m_Add(m_Value(X), m_Constant(C))))
+ return BinaryOperator::CreateSub(ConstantExpr::getNeg(AddOne(C)), X);
}
// not (cmp A, B) = !cmp A, B
@@ -2720,11 +2724,6 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) {
return BinaryOperator::CreateSub(NewC, X);
}
} else if (match(Op0, m_Add(m_Value(X), m_APInt(C)))) {
- // ~(X + C) --> (-C - 1) - X
- if (RHSC->isAllOnesValue()) {
- Constant *NewC = ConstantInt::get(I.getType(), -(*C) - 1);
- return BinaryOperator::CreateSub(NewC, X);
- }
if (RHSC->isSignMask()) {
// (X + C) ^ signmask -> (X + C + signmask)
Constant *NewC = ConstantInt::get(I.getType(), *C + *RHSC);
OpenPOWER on IntegriCloud