forked from OSchip/llvm-project
[InstCombine] foldUnsignedUnderflowCheck(): one last pattern with 'sub' (PR43251)
https://rise4fun.com/Alive/0j9 llvm-svn: 372930
This commit is contained in:
parent
ca524621d1
commit
a2fa03af3a
|
@ -1128,6 +1128,16 @@ static Value *foldUnsignedUnderflowCheck(ICmpInst *ZeroICmp,
|
|||
EqPred == ICmpInst::ICMP_EQ && !IsAnd)
|
||||
return Builder.CreateICmpULE(Base, Offset);
|
||||
|
||||
// Base <= Offset && (Base - Offset) != 0 --> Base < Offset
|
||||
if (UnsignedPred == ICmpInst::ICMP_ULE && EqPred == ICmpInst::ICMP_NE &&
|
||||
IsAnd)
|
||||
return Builder.CreateICmpULT(Base, Offset);
|
||||
|
||||
// Base > Offset || (Base - Offset) == 0 --> Base >= Offset
|
||||
if (UnsignedPred == ICmpInst::ICMP_UGT && EqPred == ICmpInst::ICMP_EQ &&
|
||||
!IsAnd)
|
||||
return Builder.CreateICmpUGE(Base, Offset);
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
|
|
@ -404,10 +404,8 @@ define i1 @base_ult_offset(i8 %base, i8 %offset) {
|
|||
; CHECK-LABEL: @base_ult_offset(
|
||||
; CHECK-NEXT: [[ADJUSTED:%.*]] = sub i8 [[BASE:%.*]], [[OFFSET:%.*]]
|
||||
; CHECK-NEXT: call void @use8(i8 [[ADJUSTED]])
|
||||
; CHECK-NEXT: [[NOT_NULL:%.*]] = icmp ne i8 [[ADJUSTED]], 0
|
||||
; CHECK-NEXT: [[NO_UNDERFLOW:%.*]] = icmp ule i8 [[BASE]], [[OFFSET]]
|
||||
; CHECK-NEXT: [[R:%.*]] = and i1 [[NO_UNDERFLOW]], [[NOT_NULL]]
|
||||
; CHECK-NEXT: ret i1 [[R]]
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i8 [[BASE]], [[OFFSET]]
|
||||
; CHECK-NEXT: ret i1 [[TMP1]]
|
||||
;
|
||||
%adjusted = sub i8 %base, %offset
|
||||
call void @use8(i8 %adjusted)
|
||||
|
@ -420,10 +418,8 @@ define i1 @base_uge_offset(i8 %base, i8 %offset) {
|
|||
; CHECK-LABEL: @base_uge_offset(
|
||||
; CHECK-NEXT: [[ADJUSTED:%.*]] = sub i8 [[BASE:%.*]], [[OFFSET:%.*]]
|
||||
; CHECK-NEXT: call void @use8(i8 [[ADJUSTED]])
|
||||
; CHECK-NEXT: [[NOT_NULL:%.*]] = icmp eq i8 [[ADJUSTED]], 0
|
||||
; CHECK-NEXT: [[NO_UNDERFLOW:%.*]] = icmp ugt i8 [[BASE]], [[OFFSET]]
|
||||
; CHECK-NEXT: [[R:%.*]] = or i1 [[NO_UNDERFLOW]], [[NOT_NULL]]
|
||||
; CHECK-NEXT: ret i1 [[R]]
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = icmp uge i8 [[BASE]], [[OFFSET]]
|
||||
; CHECK-NEXT: ret i1 [[TMP1]]
|
||||
;
|
||||
%adjusted = sub i8 %base, %offset
|
||||
call void @use8(i8 %adjusted)
|
||||
|
|
Loading…
Reference in New Issue