Skip to content

Commit 4c1c96e

Browse files
committed
Revert "[InstCombine] Fold icmp eq/ne min|max(X, Y), Z (#67087)"
Details in https://reviews.llvm.org/D156238 This reverts commit d2abe8d.
1 parent 56c3b8e commit 4c1c96e

File tree

6 files changed

+64
-67
lines changed

6 files changed

+64
-67
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 13 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5022,12 +5022,6 @@ InstCombinerImpl::foldICmpWithMinMaxImpl(Instruction &I,
50225022
std::swap(CmpXZ, CmpYZ);
50235023
}
50245024

5025-
auto FoldIntoCmpYZ = [&]() -> Instruction * {
5026-
if (CmpYZ.has_value())
5027-
return replaceInstUsesWith(I, ConstantInt::getBool(I.getType(), *CmpYZ));
5028-
return ICmpInst::Create(Instruction::ICmp, Pred, Y, Z);
5029-
};
5030-
50315025
switch (Pred) {
50325026
case ICmpInst::ICMP_EQ:
50335027
case ICmpInst::ICMP_NE: {
@@ -5044,32 +5038,12 @@ InstCombinerImpl::foldICmpWithMinMaxImpl(Instruction &I,
50445038
NewPred = ICmpInst::getInversePredicate(NewPred);
50455039
return ICmpInst::Create(Instruction::ICmp, NewPred, X, Y);
50465040
}
5047-
// Otherwise (X != Z):
5048-
ICmpInst::Predicate NewPred = MinMax->getPredicate();
5049-
auto MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5050-
if (!MinMaxCmpXZ.has_value()) {
5051-
std::swap(X, Y);
5052-
std::swap(CmpXZ, CmpYZ);
5053-
MinMaxCmpXZ = IsCondKnownTrue(simplifyICmpInst(NewPred, X, Z, Q));
5054-
}
5055-
if (!MinMaxCmpXZ.has_value())
5056-
break;
5057-
if (*MinMaxCmpXZ) {
5058-
// Expr Fact Result
5059-
// min(X, Y) == Z X < Z false
5060-
// max(X, Y) == Z X > Z false
5061-
// min(X, Y) != Z X < Z true
5062-
// max(X, Y) != Z X > Z true
5063-
return replaceInstUsesWith(
5064-
I, ConstantInt::getBool(I.getType(), Pred == ICmpInst::ICMP_NE));
5065-
} else {
5066-
// Expr Fact Result
5067-
// min(X, Y) == Z X > Z Y == Z
5068-
// max(X, Y) == Z X < Z Y == Z
5069-
// min(X, Y) != Z X > Z Y != Z
5070-
// max(X, Y) != Z X < Z Y != Z
5071-
return FoldIntoCmpYZ();
5072-
}
5041+
// Otherwise (X != Z, nofold):
5042+
// Expr Result
5043+
// min(X, Y) == Z X > Y || Y == Z
5044+
// max(X, Y) == Z X < Y || Y == Z
5045+
// min(X, Y) != Z X <= Y && Y != Z
5046+
// max(X, Y) != Z X >= Y && Y != Z
50735047
break;
50745048
}
50755049
case ICmpInst::ICMP_SLT:
@@ -5080,6 +5054,13 @@ InstCombinerImpl::foldICmpWithMinMaxImpl(Instruction &I,
50805054
case ICmpInst::ICMP_UGT:
50815055
case ICmpInst::ICMP_SGE:
50825056
case ICmpInst::ICMP_UGE: {
5057+
auto FoldIntoCmpYZ = [&]() -> Instruction * {
5058+
if (CmpYZ.has_value())
5059+
return replaceInstUsesWith(I,
5060+
ConstantInt::getBool(I.getType(), *CmpYZ));
5061+
return ICmpInst::Create(Instruction::ICmp, Pred, Y, Z);
5062+
};
5063+
50835064
bool IsSame = MinMax->getPredicate() == ICmpInst::getStrictPredicate(Pred);
50845065
if (*CmpXZ) {
50855066
if (IsSame) {

llvm/test/Transforms/InstCombine/pr21199.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ define void @test(i32 %len) {
1010
; CHECK-LABEL: @test(
1111
; CHECK-NEXT: entry:
1212
; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.umin.i32(i32 [[LEN:%.*]], i32 8)
13-
; CHECK-NEXT: [[CMP11_NOT:%.*]] = icmp eq i32 [[LEN]], 0
13+
; CHECK-NEXT: [[CMP11_NOT:%.*]] = icmp eq i32 [[COND]], 0
1414
; CHECK-NEXT: br i1 [[CMP11_NOT]], label [[FOR_END:%.*]], label [[FOR_BODY:%.*]]
1515
; CHECK: for.body:
1616
; CHECK-NEXT: [[I_02:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -370,9 +370,9 @@ define void @slt_smax_contextual(i32 %x, i32 %y, i32 %z) {
370370
; CHECK-NEXT: call void @use(i1 [[CMP7]])
371371
; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
372372
; CHECK-NEXT: call void @use(i1 [[CMP8]])
373-
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[Y]], [[Z]]
373+
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
374374
; CHECK-NEXT: call void @use(i1 [[CMP9]])
375-
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[Y]], [[Z]]
375+
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
376376
; CHECK-NEXT: call void @use(i1 [[CMP10]])
377377
; CHECK-NEXT: ret void
378378
; CHECK: end:
@@ -429,9 +429,9 @@ define void @slt_smax_contextual_commuted(i32 %x, i32 %y, i32 %z) {
429429
; CHECK-NEXT: call void @use(i1 [[CMP7]])
430430
; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
431431
; CHECK-NEXT: call void @use(i1 [[CMP8]])
432-
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[Y]], [[Z]]
432+
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
433433
; CHECK-NEXT: call void @use(i1 [[CMP9]])
434-
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[Y]], [[Z]]
434+
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
435435
; CHECK-NEXT: call void @use(i1 [[CMP10]])
436436
; CHECK-NEXT: ret void
437437
; CHECK: end:
@@ -602,8 +602,10 @@ define void @sgt_smax_contextual(i32 %x, i32 %y, i32 %z) {
602602
; CHECK-NEXT: call void @use(i1 [[CMP7]])
603603
; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
604604
; CHECK-NEXT: call void @use(i1 [[CMP8]])
605-
; CHECK-NEXT: call void @use(i1 false)
606-
; CHECK-NEXT: call void @use(i1 true)
605+
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
606+
; CHECK-NEXT: call void @use(i1 [[CMP9]])
607+
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
608+
; CHECK-NEXT: call void @use(i1 [[CMP10]])
607609
; CHECK-NEXT: ret void
608610
; CHECK: end:
609611
; CHECK-NEXT: ret void
@@ -655,8 +657,10 @@ define void @sgt_smax_contextual_commuted(i32 %x, i32 %y, i32 %z) {
655657
; CHECK-NEXT: call void @use(i1 [[CMP7]])
656658
; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
657659
; CHECK-NEXT: call void @use(i1 [[CMP8]])
658-
; CHECK-NEXT: call void @use(i1 false)
659-
; CHECK-NEXT: call void @use(i1 true)
660+
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
661+
; CHECK-NEXT: call void @use(i1 [[CMP9]])
662+
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
663+
; CHECK-NEXT: call void @use(i1 [[CMP10]])
660664
; CHECK-NEXT: ret void
661665
; CHECK: end:
662666
; CHECK-NEXT: ret void

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

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -465,8 +465,10 @@ define void @slt_smin_contextual(i32 %x, i32 %y, i32 %z) {
465465
; CHECK-NEXT: call void @use(i1 [[CMP7]])
466466
; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
467467
; CHECK-NEXT: call void @use(i1 [[CMP8]])
468-
; CHECK-NEXT: call void @use(i1 false)
469-
; CHECK-NEXT: call void @use(i1 true)
468+
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
469+
; CHECK-NEXT: call void @use(i1 [[CMP9]])
470+
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
471+
; CHECK-NEXT: call void @use(i1 [[CMP10]])
470472
; CHECK-NEXT: ret void
471473
; CHECK: end:
472474
; CHECK-NEXT: ret void
@@ -518,8 +520,10 @@ define void @slt_smin_contextual_commuted(i32 %x, i32 %y, i32 %z) {
518520
; CHECK-NEXT: call void @use(i1 [[CMP7]])
519521
; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
520522
; CHECK-NEXT: call void @use(i1 [[CMP8]])
521-
; CHECK-NEXT: call void @use(i1 false)
522-
; CHECK-NEXT: call void @use(i1 true)
523+
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
524+
; CHECK-NEXT: call void @use(i1 [[CMP9]])
525+
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
526+
; CHECK-NEXT: call void @use(i1 [[CMP10]])
523527
; CHECK-NEXT: ret void
524528
; CHECK: end:
525529
; CHECK-NEXT: ret void
@@ -689,9 +693,9 @@ define void @sgt_smin_contextual(i32 %x, i32 %y, i32 %z) {
689693
; CHECK-NEXT: call void @use(i1 [[CMP7]])
690694
; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
691695
; CHECK-NEXT: call void @use(i1 [[CMP8]])
692-
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[Y]], [[Z]]
696+
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
693697
; CHECK-NEXT: call void @use(i1 [[CMP9]])
694-
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[Y]], [[Z]]
698+
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
695699
; CHECK-NEXT: call void @use(i1 [[CMP10]])
696700
; CHECK-NEXT: ret void
697701
; CHECK: end:
@@ -748,9 +752,9 @@ define void @sgt_smin_contextual_commuted(i32 %x, i32 %y, i32 %z) {
748752
; CHECK-NEXT: call void @use(i1 [[CMP7]])
749753
; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
750754
; CHECK-NEXT: call void @use(i1 [[CMP8]])
751-
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[Y]], [[Z]]
755+
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
752756
; CHECK-NEXT: call void @use(i1 [[CMP9]])
753-
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[Y]], [[Z]]
757+
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
754758
; CHECK-NEXT: call void @use(i1 [[CMP10]])
755759
; CHECK-NEXT: ret void
756760
; CHECK: end:
@@ -1113,9 +1117,9 @@ define void @sgt_smin_v2i32_constant(<2 x i32> %y) {
11131117
; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP7]])
11141118
; CHECK-NEXT: [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], <i32 9, i32 9>
11151119
; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP8]])
1116-
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq <2 x i32> [[Y]], <i32 10, i32 10>
1120+
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq <2 x i32> [[COND]], <i32 10, i32 10>
11171121
; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP9]])
1118-
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne <2 x i32> [[Y]], <i32 10, i32 10>
1122+
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne <2 x i32> [[COND]], <i32 10, i32 10>
11191123
; CHECK-NEXT: call void @use_v2i1(<2 x i1> [[CMP10]])
11201124
; CHECK-NEXT: ret void
11211125
;

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -370,9 +370,9 @@ define void @ult_umax_contextual(i32 %x, i32 %y, i32 %z) {
370370
; CHECK-NEXT: call void @use(i1 [[CMP7]])
371371
; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[Y]], [[Z]]
372372
; CHECK-NEXT: call void @use(i1 [[CMP8]])
373-
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[Y]], [[Z]]
373+
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
374374
; CHECK-NEXT: call void @use(i1 [[CMP9]])
375-
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[Y]], [[Z]]
375+
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
376376
; CHECK-NEXT: call void @use(i1 [[CMP10]])
377377
; CHECK-NEXT: ret void
378378
; CHECK: end:
@@ -429,9 +429,9 @@ define void @ult_umax_contextual_commuted(i32 %x, i32 %y, i32 %z) {
429429
; CHECK-NEXT: call void @use(i1 [[CMP7]])
430430
; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[Y]], [[Z]]
431431
; CHECK-NEXT: call void @use(i1 [[CMP8]])
432-
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[Y]], [[Z]]
432+
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
433433
; CHECK-NEXT: call void @use(i1 [[CMP9]])
434-
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[Y]], [[Z]]
434+
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
435435
; CHECK-NEXT: call void @use(i1 [[CMP10]])
436436
; CHECK-NEXT: ret void
437437
; CHECK: end:
@@ -602,8 +602,10 @@ define void @ugt_umax_contextual(i32 %x, i32 %y, i32 %z) {
602602
; CHECK-NEXT: call void @use(i1 false)
603603
; CHECK-NEXT: call void @use(i1 true)
604604
; CHECK-NEXT: call void @use(i1 true)
605-
; CHECK-NEXT: call void @use(i1 false)
606-
; CHECK-NEXT: call void @use(i1 true)
605+
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
606+
; CHECK-NEXT: call void @use(i1 [[CMP9]])
607+
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
608+
; CHECK-NEXT: call void @use(i1 [[CMP10]])
607609
; CHECK-NEXT: ret void
608610
; CHECK: end:
609611
; CHECK-NEXT: ret void
@@ -655,8 +657,10 @@ define void @ugt_umax_contextual_commuted(i32 %x, i32 %y, i32 %z) {
655657
; CHECK-NEXT: call void @use(i1 false)
656658
; CHECK-NEXT: call void @use(i1 true)
657659
; CHECK-NEXT: call void @use(i1 true)
658-
; CHECK-NEXT: call void @use(i1 false)
659-
; CHECK-NEXT: call void @use(i1 true)
660+
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
661+
; CHECK-NEXT: call void @use(i1 [[CMP9]])
662+
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
663+
; CHECK-NEXT: call void @use(i1 [[CMP10]])
660664
; CHECK-NEXT: ret void
661665
; CHECK: end:
662666
; CHECK-NEXT: ret void

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -366,8 +366,10 @@ define void @ult_umin_contextual(i32 %x, i32 %y, i32 %z) {
366366
; CHECK-NEXT: call void @use(i1 true)
367367
; CHECK-NEXT: call void @use(i1 false)
368368
; CHECK-NEXT: call void @use(i1 false)
369-
; CHECK-NEXT: call void @use(i1 false)
370-
; CHECK-NEXT: call void @use(i1 true)
369+
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
370+
; CHECK-NEXT: call void @use(i1 [[CMP9]])
371+
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
372+
; CHECK-NEXT: call void @use(i1 [[CMP10]])
371373
; CHECK-NEXT: ret void
372374
; CHECK: end:
373375
; CHECK-NEXT: ret void
@@ -419,8 +421,10 @@ define void @ult_umin_contextual_commuted(i32 %x, i32 %y, i32 %z) {
419421
; CHECK-NEXT: call void @use(i1 true)
420422
; CHECK-NEXT: call void @use(i1 false)
421423
; CHECK-NEXT: call void @use(i1 false)
422-
; CHECK-NEXT: call void @use(i1 false)
423-
; CHECK-NEXT: call void @use(i1 true)
424+
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
425+
; CHECK-NEXT: call void @use(i1 [[CMP9]])
426+
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
427+
; CHECK-NEXT: call void @use(i1 [[CMP10]])
424428
; CHECK-NEXT: ret void
425429
; CHECK: end:
426430
; CHECK-NEXT: ret void
@@ -590,9 +594,9 @@ define void @ugt_umin_contextual(i32 %x, i32 %y, i32 %z) {
590594
; CHECK-NEXT: call void @use(i1 [[CMP7]])
591595
; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[Y]], [[Z]]
592596
; CHECK-NEXT: call void @use(i1 [[CMP8]])
593-
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[Y]], [[Z]]
597+
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
594598
; CHECK-NEXT: call void @use(i1 [[CMP9]])
595-
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[Y]], [[Z]]
599+
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
596600
; CHECK-NEXT: call void @use(i1 [[CMP10]])
597601
; CHECK-NEXT: ret void
598602
; CHECK: end:
@@ -649,9 +653,9 @@ define void @ugt_umin_contextual_commuted(i32 %x, i32 %y, i32 %z) {
649653
; CHECK-NEXT: call void @use(i1 [[CMP7]])
650654
; CHECK-NEXT: [[CMP8:%.*]] = icmp uge i32 [[Y]], [[Z]]
651655
; CHECK-NEXT: call void @use(i1 [[CMP8]])
652-
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[Y]], [[Z]]
656+
; CHECK-NEXT: [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
653657
; CHECK-NEXT: call void @use(i1 [[CMP9]])
654-
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[Y]], [[Z]]
658+
; CHECK-NEXT: [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
655659
; CHECK-NEXT: call void @use(i1 [[CMP10]])
656660
; CHECK-NEXT: ret void
657661
; CHECK: end:

0 commit comments

Comments
 (0)