summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
diff options
context:
space:
mode:
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