@@ -6749,22 +6749,19 @@ bool CombinerHelper::tryFoldBoolSelectToLogic(GSelect *Select,
6749
6749
return false ;
6750
6750
}
6751
6751
6752
- bool CombinerHelper::tryFoldSelectToIntMinMax (GSelect *Select,
6753
- BuildFnTy &MatchInfo) {
6752
+ bool CombinerHelper::matchSelectIMinMax (const MachineOperand &MO,
6753
+ BuildFnTy &MatchInfo) {
6754
+ GSelect *Select = cast<GSelect>(MRI.getVRegDef (MO.getReg ()));
6755
+ GICmp *Cmp = cast<GICmp>(MRI.getVRegDef (Select->getCondReg ()));
6756
+
6754
6757
Register DstReg = Select->getReg (0 );
6755
- Register Cond = Select->getCondReg ();
6756
6758
Register True = Select->getTrueReg ();
6757
6759
Register False = Select->getFalseReg ();
6758
6760
LLT DstTy = MRI.getType (DstReg);
6759
6761
6760
6762
if (DstTy.isPointer ())
6761
6763
return false ;
6762
6764
6763
- // We need an G_ICMP on the condition register.
6764
- GICmp *Cmp = getOpcodeDef<GICmp>(Cond, MRI);
6765
- if (!Cmp)
6766
- return false ;
6767
-
6768
6765
// We want to fold the icmp and replace the select.
6769
6766
if (!MRI.hasOneNonDBGUse (Cmp->getReg (0 )))
6770
6767
return false ;
@@ -6775,62 +6772,46 @@ bool CombinerHelper::tryFoldSelectToIntMinMax(GSelect *Select,
6775
6772
if (CmpInst::isEquality (Pred))
6776
6773
return false ;
6777
6774
6778
- Register CmpLHS = Cmp->getLHSReg ();
6779
- Register CmpRHS = Cmp->getRHSReg ();
6780
-
6781
- // We can swap CmpLHS and CmpRHS for higher hitrate.
6782
- if (True == CmpRHS && False == CmpLHS) {
6783
- std::swap (CmpLHS, CmpRHS);
6784
- Pred = CmpInst::getSwappedPredicate (Pred);
6785
- }
6775
+ [[maybe_unused]] Register CmpLHS = Cmp->getLHSReg ();
6776
+ [[maybe_unused]] Register CmpRHS = Cmp->getRHSReg ();
6786
6777
6787
6778
// (icmp X, Y) ? X : Y -> integer minmax.
6788
6779
// see matchSelectPattern in ValueTracking.
6789
6780
// Legality between G_SELECT and integer minmax can differ.
6790
- if (True == CmpLHS && False == CmpRHS) {
6791
- switch (Pred) {
6792
- case ICmpInst::ICMP_UGT:
6793
- case ICmpInst::ICMP_UGE: {
6794
- if (!isLegalOrBeforeLegalizer ({TargetOpcode::G_UMAX, DstTy}))
6795
- return false ;
6796
- MatchInfo = [=](MachineIRBuilder &B) {
6797
- B.buildUMax (DstReg, True, False);
6798
- };
6799
- return true ;
6800
- }
6801
- case ICmpInst::ICMP_SGT:
6802
- case ICmpInst::ICMP_SGE: {
6803
- if (!isLegalOrBeforeLegalizer ({TargetOpcode::G_SMAX, DstTy}))
6804
- return false ;
6805
- MatchInfo = [=](MachineIRBuilder &B) {
6806
- B.buildSMax (DstReg, True, False);
6807
- };
6808
- return true ;
6809
- }
6810
- case ICmpInst::ICMP_ULT:
6811
- case ICmpInst::ICMP_ULE: {
6812
- if (!isLegalOrBeforeLegalizer ({TargetOpcode::G_UMIN, DstTy}))
6813
- return false ;
6814
- MatchInfo = [=](MachineIRBuilder &B) {
6815
- B.buildUMin (DstReg, True, False);
6816
- };
6817
- return true ;
6818
- }
6819
- case ICmpInst::ICMP_SLT:
6820
- case ICmpInst::ICMP_SLE: {
6821
- if (!isLegalOrBeforeLegalizer ({TargetOpcode::G_SMIN, DstTy}))
6822
- return false ;
6823
- MatchInfo = [=](MachineIRBuilder &B) {
6824
- B.buildSMin (DstReg, True, False);
6825
- };
6826
- return true ;
6827
- }
6828
- default :
6781
+ assert (True == CmpLHS && False == CmpRHS && " unexpected MIR pattern" );
6782
+
6783
+ switch (Pred) {
6784
+ case ICmpInst::ICMP_UGT:
6785
+ case ICmpInst::ICMP_UGE: {
6786
+ if (!isLegalOrBeforeLegalizer ({TargetOpcode::G_UMAX, DstTy}))
6829
6787
return false ;
6830
- }
6788
+ MatchInfo = [=](MachineIRBuilder &B) { B.buildUMax (DstReg, True, False); };
6789
+ return true ;
6790
+ }
6791
+ case ICmpInst::ICMP_SGT:
6792
+ case ICmpInst::ICMP_SGE: {
6793
+ if (!isLegalOrBeforeLegalizer ({TargetOpcode::G_SMAX, DstTy}))
6794
+ return false ;
6795
+ MatchInfo = [=](MachineIRBuilder &B) { B.buildSMax (DstReg, True, False); };
6796
+ return true ;
6797
+ }
6798
+ case ICmpInst::ICMP_ULT:
6799
+ case ICmpInst::ICMP_ULE: {
6800
+ if (!isLegalOrBeforeLegalizer ({TargetOpcode::G_UMIN, DstTy}))
6801
+ return false ;
6802
+ MatchInfo = [=](MachineIRBuilder &B) { B.buildUMin (DstReg, True, False); };
6803
+ return true ;
6804
+ }
6805
+ case ICmpInst::ICMP_SLT:
6806
+ case ICmpInst::ICMP_SLE: {
6807
+ if (!isLegalOrBeforeLegalizer ({TargetOpcode::G_SMIN, DstTy}))
6808
+ return false ;
6809
+ MatchInfo = [=](MachineIRBuilder &B) { B.buildSMin (DstReg, True, False); };
6810
+ return true ;
6811
+ }
6812
+ default :
6813
+ return false ;
6831
6814
}
6832
-
6833
- return false ;
6834
6815
}
6835
6816
6836
6817
bool CombinerHelper::matchSelect (MachineInstr &MI, BuildFnTy &MatchInfo) {
@@ -6842,9 +6823,6 @@ bool CombinerHelper::matchSelect(MachineInstr &MI, BuildFnTy &MatchInfo) {
6842
6823
if (tryFoldBoolSelectToLogic (Select, MatchInfo))
6843
6824
return true ;
6844
6825
6845
- if (tryFoldSelectToIntMinMax (Select, MatchInfo))
6846
- return true ;
6847
-
6848
6826
return false ;
6849
6827
}
6850
6828
0 commit comments