diff options
| author | Nikita Popov <nikita.ppv@gmail.com> | 2019-04-10 07:10:53 +0000 |
|---|---|---|
| committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-04-10 07:10:53 +0000 |
| commit | 09020ec2a7199fca2835e6dbbac9d89f9222a843 (patch) | |
| tree | 4f88088ed07b425ff6b33645a587a5d4efd6efd8 | |
| parent | 596cbeb7058b98518952612069e2bb0b13863ef8 (diff) | |
| download | llvm-09020ec2a7199fca2835e6dbbac9d89f9222a843.zip llvm-09020ec2a7199fca2835e6dbbac9d89f9222a843.tar.gz llvm-09020ec2a7199fca2835e6dbbac9d89f9222a843.tar.bz2 | |
[InstCombine] Handle usubo always overflow
Check AlwaysOverflow condition for usubo. The implementation is the
same as the existing handling for uaddo and umulo. Handling for saddo
and ssubo will follow (smulo doesn't have the necessary ValueTracking
support).
Differential Revision: https://reviews.llvm.org/D60483
llvm-svn: 358052
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 3 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/with_overflow.ll | 5 |
2 files changed, 6 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index e274d7e..7ec7535 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -3997,6 +3997,9 @@ bool InstCombiner::OptimizeOverflowCheck(OverflowCheckFlavor OCF, Value *LHS, if (OR == OverflowResult::NeverOverflows) return SetResult(Builder.CreateNUWSub(LHS, RHS), Builder.getFalse(), true); + + if (OR == OverflowResult::AlwaysOverflows) + return SetResult(Builder.CreateSub(LHS, RHS), Builder.getTrue(), true); } else { OR = computeOverflowForSignedSub(LHS, RHS, &OrigI); if (OR == OverflowResult::NeverOverflows) diff --git a/llvm/test/Transforms/InstCombine/with_overflow.ll b/llvm/test/Transforms/InstCombine/with_overflow.ll index d5854f4..d5a727e 100644 --- a/llvm/test/Transforms/InstCombine/with_overflow.ll +++ b/llvm/test/Transforms/InstCombine/with_overflow.ll @@ -544,8 +544,9 @@ define { i8, i1 } @uadd_always_overflow(i8 %x) nounwind { define { i8, i1 } @usub_always_overflow(i8 %x) nounwind { ; CHECK-LABEL: @usub_always_overflow( ; CHECK-NEXT: [[Y:%.*]] = or i8 [[X:%.*]], 64 -; CHECK-NEXT: [[A:%.*]] = call { i8, i1 } @llvm.usub.with.overflow.i8(i8 63, i8 [[Y]]) -; CHECK-NEXT: ret { i8, i1 } [[A]] +; CHECK-NEXT: [[A:%.*]] = sub nsw i8 63, [[Y]] +; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { i8, i1 } { i8 undef, i1 true }, i8 [[A]], 0 +; CHECK-NEXT: ret { i8, i1 } [[TMP1]] ; %y = or i8 %x, 64 %a = call { i8, i1 } @llvm.usub.with.overflow.i8(i8 63, i8 %y) |
