Skip to content

Commit 00d8f91

Browse files
committed
address more comments
1 parent ffdcb9b commit 00d8f91

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -574,12 +574,17 @@ static Value *foldSelectICmpMinMax(const ICmpInst *Cmp, Value *TVal,
574574
const SimplifyQuery &SQ) {
575575
const Value *CmpLHS = Cmp->getOperand(0);
576576
const Value *CmpRHS = Cmp->getOperand(1);
577-
const ICmpInst::Predicate Pred = Cmp->getPredicate();
577+
ICmpInst::Predicate Pred = Cmp->getPredicate();
578578

579579
// (X > Y) ? X : (Y - 1) ==> MIN(X, Y - 1)
580580
// (X < Y) ? X : (Y + 1) ==> MAX(X, Y + 1)
581581
// This transformation is valid when overflow corresponding to the sign of
582582
// the comparison is poison and we must drop the non-matching overflow flag.
583+
if (CmpRHS == TVal) {
584+
std::swap(CmpLHS, CmpRHS);
585+
Pred = CmpInst::getSwappedPredicate(Pred);
586+
}
587+
583588
if (CmpLHS == TVal) {
584589
if (Pred == CmpInst::ICMP_SGT &&
585590
match(FVal, m_NSWAddLike(m_Specific(CmpRHS), m_One()))) {

llvm/test/Transforms/InstCombine/minmax-fold.ll

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1647,6 +1647,54 @@ define i32 @test_umin_sub1_nuw(i32 %x, i32 range(i32 1, 0) %w) {
16471647
ret i32 %r
16481648
}
16491649

1650+
define i32 @test_smin_sub1_nsw_swapped(i32 %x, i32 %w) {
1651+
; CHECK-LABEL: @test_smin_sub1_nsw_swapped(
1652+
; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[W:%.*]], -1
1653+
; CHECK-NEXT: [[R:%.*]] = call i32 @llvm.smin.i32(i32 [[X:%.*]], i32 [[SUB]])
1654+
; CHECK-NEXT: ret i32 [[R]]
1655+
;
1656+
%cmp = icmp sgt i32 %w, %x
1657+
%sub = add nsw i32 %w, -1
1658+
%r = select i1 %cmp, i32 %x, i32 %sub
1659+
ret i32 %r
1660+
}
1661+
1662+
define i32 @test_smax_add1_nsw_swapped(i32 %x, i32 %w) {
1663+
; CHECK-LABEL: @test_smax_add1_nsw_swapped(
1664+
; CHECK-NEXT: [[X2:%.*]] = add nsw i32 [[W:%.*]], 1
1665+
; CHECK-NEXT: [[R:%.*]] = call i32 @llvm.smax.i32(i32 [[X:%.*]], i32 [[X2]])
1666+
; CHECK-NEXT: ret i32 [[R]]
1667+
;
1668+
%cmp = icmp slt i32 %w, %x
1669+
%add = add nsw i32 %w, 1
1670+
%r = select i1 %cmp, i32 %x, i32 %add
1671+
ret i32 %r
1672+
}
1673+
1674+
define i32 @test_umax_add1_nuw_swapped(i32 %x, i32 %w) {
1675+
; CHECK-LABEL: @test_umax_add1_nuw_swapped(
1676+
; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[W:%.*]], 1
1677+
; CHECK-NEXT: [[R:%.*]] = call i32 @llvm.umax.i32(i32 [[X:%.*]], i32 [[ADD]])
1678+
; CHECK-NEXT: ret i32 [[R]]
1679+
;
1680+
%cmp = icmp ult i32 %w, %x
1681+
%add = add nuw i32 %w, 1
1682+
%r = select i1 %cmp, i32 %x, i32 %add
1683+
ret i32 %r
1684+
}
1685+
1686+
define i32 @test_umin_sub1_nuw_swapped(i32 %x, i32 range(i32 1, 0) %w) {
1687+
; CHECK-LABEL: @test_umin_sub1_nuw_swapped(
1688+
; CHECK-NEXT: [[SUB:%.*]] = add i32 [[W:%.*]], -1
1689+
; CHECK-NEXT: [[R:%.*]] = call i32 @llvm.umin.i32(i32 [[X:%.*]], i32 [[SUB]])
1690+
; CHECK-NEXT: ret i32 [[R]]
1691+
;
1692+
%cmp = icmp ugt i32 %w, %x
1693+
%sub = add i32 %w, -1
1694+
%r = select i1 %cmp, i32 %x, i32 %sub
1695+
ret i32 %r
1696+
}
1697+
16501698
define <2 x i16> @test_smin_sub1_nsw_vec(<2 x i16> %x, <2 x i16> %w) {
16511699
; CHECK-LABEL: @test_smin_sub1_nsw_vec(
16521700
; CHECK-NEXT: [[SUB:%.*]] = add nsw <2 x i16> [[W:%.*]], splat (i16 -1)

0 commit comments

Comments
 (0)