forked from OSchip/llvm-project
[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
This commit is contained in:
parent
596cbeb705
commit
09020ec2a7
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue