Skip to content

Commit ad6af44

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

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
@@ -3165,6 +3165,26 @@ Instruction *InstCombinerImpl::foldICmpAddConstant(ICmpInst &Cmp,
31653165
Builder.CreateAdd(X, ConstantInt::get(Ty, *C2 - C - 1)),
31663166
ConstantInt::get(Ty, ~C));
31673167

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

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)