Skip to content

Commit 46fdc59

Browse files
committed
Fold icmp samesign u{gt/ge/lt/le} (add nsw X, C2), C -> icmp s{gt/ge/lt/le} X, (C - C2)
1 parent c0f9b14 commit 46fdc59

File tree

2 files changed

+8
-2
lines changed

2 files changed

+8
-2
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3189,6 +3189,13 @@ Instruction *InstCombinerImpl::foldICmpAddConstant(ICmpInst &Cmp,
31893189
return new ICmpInst(ICmpInst::getSignedPredicate(Pred), X,
31903190
ConstantInt::get(Ty, C - *C2));
31913191

3192+
// Fold icmp samesign u{gt/ge/lt/le} (add nsw X, C2), C
3193+
// -> icmp s{gt/ge/lt/le} X, (C - C2)
3194+
CmpPredicate CP(Pred, Cmp.hasSameSign());
3195+
if (CP.hasSameSign() && Add->hasNoSignedWrap())
3196+
return new ICmpInst(CP.getPreferredSignedPredicate(), X,
3197+
ConstantInt::get(Ty, C - *C2));
3198+
31923199
auto CR = ConstantRange::makeExactICmpRegion(Pred, C).subtract(*C2);
31933200
const APInt &Upper = CR.getUpper();
31943201
const APInt &Lower = CR.getLower();

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3444,8 +3444,7 @@ define i1 @val_is_aligend_pred_mismatch(i32 %num) {
34443444
define i1 @icmp_samesign_with_nsw_add(i32 %arg0) {
34453445
; CHECK-LABEL: @icmp_samesign_with_nsw_add(
34463446
; CHECK-NEXT: entry:
3447-
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[ARG0:%.*]], -26
3448-
; CHECK-NEXT: [[V1:%.*]] = icmp ult i32 [[TMP0]], -8
3447+
; CHECK-NEXT: [[V1:%.*]] = icmp sgt i32 [[ARG0:%.*]], 25
34493448
; CHECK-NEXT: ret i1 [[V1]]
34503449
;
34513450
entry:

0 commit comments

Comments
 (0)