Skip to content

Commit e694c48

Browse files
committed
[InstCombine] Fold zext(X) + C2 u< C -> X + trunc(C2) u< trunc(C)
1 parent 910923a commit e694c48

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3168,6 +3168,26 @@ Instruction *InstCombinerImpl::foldICmpAddConstant(ICmpInst &Cmp,
31683168
Builder.CreateAdd(X, ConstantInt::get(Ty, *C2 - C - 1)),
31693169
ConstantInt::get(Ty, ~C));
31703170

3171+
// zext(V) + C2 <u C -> V + trunc(C2) <u trunc(C) iff C2 s<0 && C s>0
3172+
Value *V;
3173+
if (Pred == ICmpInst::ICMP_ULT && match(X, m_ZExt(m_Value(V)))) {
3174+
Type *NewCmpTy = V->getType();
3175+
unsigned NewCmpBW = NewCmpTy->getScalarSizeInBits();
3176+
if (shouldChangeType(Ty, NewCmpTy) &&
3177+
C2->getSignificantBits() <= NewCmpBW &&
3178+
C.getSignificantBits() <= NewCmpBW) {
3179+
APInt TruncatedOffset = C2->trunc(NewCmpBW);
3180+
APInt TruncatedRHS = C.trunc(NewCmpBW);
3181+
if (TruncatedOffset.isNegative() && TruncatedRHS.isNonNegative()) {
3182+
Value *TruncatedOffsetV = ConstantInt::get(NewCmpTy, TruncatedOffset);
3183+
Value *TruncatedRV = ConstantInt::get(NewCmpTy, TruncatedRHS);
3184+
return new ICmpInst(ICmpInst::ICMP_ULT,
3185+
Builder.CreateAdd(V, TruncatedOffsetV),
3186+
TruncatedRV);
3187+
}
3188+
}
3189+
}
3190+
31713191
return nullptr;
31723192
}
31733193

llvm/test/Transforms/InstCombine/icmp-add.ll

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3187,9 +3187,8 @@ define i1 @icmp_of_ucmp_plus_const_with_const(i32 %x, i32 %y) {
31873187
define i1 @zext_range_check_ult(i8 %x) {
31883188
; CHECK-LABEL: @zext_range_check_ult(
31893189
; CHECK-NEXT: entry:
3190-
; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[X:%.*]] to i32
3191-
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[CONV]], -4
3192-
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[ADD]], 3
3190+
; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[X:%.*]], -4
3191+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[TMP0]], 3
31933192
; CHECK-NEXT: ret i1 [[CMP]]
31943193
;
31953194
entry:
@@ -3233,11 +3232,7 @@ entry:
32333232

32343233
define i1 @zext_range_check_mergable(i8 %x) {
32353234
; CHECK-LABEL: @zext_range_check_mergable(
3236-
; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[X:%.*]] to i32
3237-
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[CONV]], -4
3238-
; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i32 [[ADD]], 3
3239-
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i8 [[X]], 4
3240-
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP2]], i1 true, i1 [[CMP1]]
3235+
; CHECK-NEXT: [[COND:%.*]] = icmp slt i8 [[X:%.*]], 7
32413236
; CHECK-NEXT: ret i1 [[COND]]
32423237
;
32433238
%conv = zext i8 %x to i32

0 commit comments

Comments
 (0)