Skip to content

Commit 7411424

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 7411424

File tree

2 files changed

+9
-2
lines changed

2 files changed

+9
-2
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "llvm/IR/InstrTypes.h"
2929
#include "llvm/IR/Instructions.h"
3030
#include "llvm/IR/IntrinsicInst.h"
31+
#include "llvm/IR/IntrinsicsX86.h"
3132
#include "llvm/IR/PatternMatch.h"
3233
#include "llvm/Support/KnownBits.h"
3334
#include "llvm/Transforms/InstCombine/InstCombiner.h"
@@ -3189,6 +3190,13 @@ Instruction *InstCombinerImpl::foldICmpAddConstant(ICmpInst &Cmp,
31893190
return new ICmpInst(ICmpInst::getSignedPredicate(Pred), X,
31903191
ConstantInt::get(Ty, C - *C2));
31913192

3193+
// Fold icmp samesign u{gt/ge/lt/le} (add nsw X, C2), C
3194+
// -> icmp s{gt/ge/lt/le} X, (C - C2)
3195+
CmpPredicate CP(Pred, Cmp.hasSameSign());
3196+
if (CP.hasSameSign() && Add->hasNoSignedWrap())
3197+
return new ICmpInst(CP.getPreferredSignedPredicate(), X,
3198+
ConstantInt::get(Ty, C - *C2));
3199+
31923200
auto CR = ConstantRange::makeExactICmpRegion(Pred, C).subtract(*C2);
31933201
const APInt &Upper = CR.getUpper();
31943202
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)