summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2018-11-28 16:37:09 +0000
committerNikita Popov <nikita.ppv@gmail.com>2018-11-28 16:37:09 +0000
commit42f89989a1ccfa7df637a2ffb9c6aa0e249c70e6 (patch)
tree8181cc0bd8de96a83152a1fa92bd147d5b3c263f /llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
parentcf596a8c26ba08c473e567f2f8382602851fe1db (diff)
downloadbcm5719-llvm-42f89989a1ccfa7df637a2ffb9c6aa0e249c70e6.tar.gz
bcm5719-llvm-42f89989a1ccfa7df637a2ffb9c6aa0e249c70e6.zip
[InstCombine] Canonicalize ssub.sat to sadd.sat
Canonicalize ssub.sat(X, C) to ssub.sat(X, -C) if C is constant and not signed minimum. This will help further optimizations to apply. This change is part of https://reviews.llvm.org/D54534. llvm-svn: 347772
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp')
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index 2dc80b2947e..a6921d745e8 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -2102,6 +2102,17 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
return BinaryOperator::CreateNSWSub(Arg0, Arg1);
break;
}
+
+ // ssub.sat(X, C) -> sadd.sat(X, -C) if C != MIN
+ // TODO: Support non-splat C.
+ const APInt *C;
+ if (IID == Intrinsic::ssub_sat && match(Arg1, m_APInt(C)) &&
+ !C->isMinSignedValue()) {
+ Value *NegVal = ConstantInt::get(II->getType(), -*C);
+ return replaceInstUsesWith(
+ *II, Builder.CreateBinaryIntrinsic(
+ Intrinsic::sadd_sat, Arg0, NegVal));
+ }
break;
}
OpenPOWER on IntegriCloud