Skip to content

Commit 49144f7

Browse files
authored
[InstCombine] Improve range computation in foldICmpAddConstant (#155096)
Address comment #110511 (comment).
1 parent 6ae0d95 commit 49144f7

File tree

3 files changed

+30
-37
lines changed

3 files changed

+30
-37
lines changed

llvm/include/llvm/IR/ConstantRange.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,7 @@ class [[nodiscard]] ConstantRange {
381381
/// strictly smaller than the current type. The returned range will
382382
/// correspond to the possible range of values if the source range had been
383383
/// truncated to the specified type with wrap type \p NoWrapKind.
384+
/// Note that the result of trunc nuw is exact.
384385
LLVM_ABI ConstantRange truncate(uint32_t BitWidth,
385386
unsigned NoWrapKind = 0) const;
386387

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3320,20 +3320,18 @@ Instruction *InstCombinerImpl::foldICmpAddConstant(ICmpInst &Cmp,
33203320
Type *NewCmpTy = V->getType();
33213321
unsigned NewCmpBW = NewCmpTy->getScalarSizeInBits();
33223322
if (shouldChangeType(Ty, NewCmpTy)) {
3323-
if (CR.getActiveBits() <= NewCmpBW) {
3324-
ConstantRange SrcCR = CR.truncate(NewCmpBW);
3325-
CmpInst::Predicate EquivPred;
3326-
APInt EquivInt;
3327-
APInt EquivOffset;
3328-
3329-
SrcCR.getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
3330-
return new ICmpInst(
3331-
EquivPred,
3332-
EquivOffset.isZero()
3333-
? V
3334-
: Builder.CreateAdd(V, ConstantInt::get(NewCmpTy, EquivOffset)),
3335-
ConstantInt::get(NewCmpTy, EquivInt));
3336-
}
3323+
ConstantRange SrcCR = CR.truncate(NewCmpBW, TruncInst::NoUnsignedWrap);
3324+
CmpInst::Predicate EquivPred;
3325+
APInt EquivInt;
3326+
APInt EquivOffset;
3327+
3328+
SrcCR.getEquivalentICmp(EquivPred, EquivInt, EquivOffset);
3329+
return new ICmpInst(
3330+
EquivPred,
3331+
EquivOffset.isZero()
3332+
? V
3333+
: Builder.CreateAdd(V, ConstantInt::get(NewCmpTy, EquivOffset)),
3334+
ConstantInt::get(NewCmpTy, EquivInt));
33373335
}
33383336
}
33393337

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

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3209,13 +3209,11 @@ entry:
32093209
ret i1 %cmp
32103210
}
32113211

3212-
; TODO: should be canonicalized to (x - 4) u> 2
32133212
define i1 @zext_range_check_ugt(i8 %x) {
32143213
; CHECK-LABEL: @zext_range_check_ugt(
32153214
; CHECK-NEXT: entry:
3216-
; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[X:%.*]] to i32
3217-
; CHECK-NEXT: [[TMP0:%.*]] = add nsw i32 [[CONV]], -7
3218-
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[TMP0]], -3
3215+
; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[X:%.*]], -7
3216+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[TMP0]], -3
32193217
; CHECK-NEXT: ret i1 [[CMP]]
32203218
;
32213219
entry:
@@ -3225,13 +3223,11 @@ entry:
32253223
ret i1 %cmp
32263224
}
32273225

3228-
; TODO: should be canonicalized to (x - 4) u> 2
32293226
define i1 @zext_range_check_ult_alter(i8 %x) {
32303227
; CHECK-LABEL: @zext_range_check_ult_alter(
32313228
; CHECK-NEXT: entry:
3232-
; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[X:%.*]] to i32
3233-
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[CONV]], -7
3234-
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[ADD]], -3
3229+
; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[X:%.*]], -7
3230+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[TMP0]], -3
32353231
; CHECK-NEXT: ret i1 [[CMP]]
32363232
;
32373233
entry:
@@ -3241,6 +3237,19 @@ entry:
32413237
ret i1 %cmp
32423238
}
32433239

3240+
define i1 @zext_range_check_ult_alter2(i8 %x) {
3241+
; CHECK-LABEL: @zext_range_check_ult_alter2(
3242+
; CHECK-NEXT: entry:
3243+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], 3
3244+
; CHECK-NEXT: ret i1 [[CMP]]
3245+
;
3246+
entry:
3247+
%conv = zext i8 %x to i32
3248+
%add = add i32 %conv, -4
3249+
%cmp = icmp ult i32 %add, 253
3250+
ret i1 %cmp
3251+
}
3252+
32443253
define i1 @zext_range_check_mergable(i8 %x) {
32453254
; CHECK-LABEL: @zext_range_check_mergable(
32463255
; CHECK-NEXT: [[COND:%.*]] = icmp slt i8 [[X:%.*]], 7
@@ -3286,21 +3295,6 @@ entry:
32863295
ret i1 %cmp
32873296
}
32883297

3289-
define i1 @zext_range_check_ult_range_check_failure(i8 %x) {
3290-
; CHECK-LABEL: @zext_range_check_ult_range_check_failure(
3291-
; CHECK-NEXT: entry:
3292-
; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[X:%.*]] to i32
3293-
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[CONV]], -4
3294-
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[ADD]], 253
3295-
; CHECK-NEXT: ret i1 [[CMP]]
3296-
;
3297-
entry:
3298-
%conv = zext i8 %x to i32
3299-
%add = add i32 %conv, -4
3300-
%cmp = icmp ult i32 %add, 253
3301-
ret i1 %cmp
3302-
}
3303-
33043298
; PR 152851
33053299

33063300
define i1 @val_is_aligend_const_pow2(i32 %num) {

0 commit comments

Comments
 (0)