diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2018-11-28 16:37:09 +0000 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2018-11-28 16:37:09 +0000 |
commit | 42f89989a1ccfa7df637a2ffb9c6aa0e249c70e6 (patch) | |
tree | 8181cc0bd8de96a83152a1fa92bd147d5b3c263f /llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | |
parent | cf596a8c26ba08c473e567f2f8382602851fe1db (diff) | |
download | bcm5719-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.cpp | 11 |
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; } |