@@ -1716,14 +1716,9 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
1716
1716
case TargetOpcode::G_ICMP: {
1717
1717
Register LHS = MI.getOperand (2 ).getReg ();
1718
1718
LLT SrcTy = MRI.getType (LHS);
1719
- uint64_t SrcSize = SrcTy.getSizeInBits ();
1720
1719
CmpInst::Predicate Pred =
1721
1720
static_cast <CmpInst::Predicate>(MI.getOperand (1 ).getPredicate ());
1722
1721
1723
- // TODO: Handle the non-equality case for weird sizes.
1724
- if (NarrowSize * 2 != SrcSize && !ICmpInst::isEquality (Pred))
1725
- return UnableToLegalize;
1726
-
1727
1722
LLT LeftoverTy; // Example: s88 -> s64 (NarrowTy) + s24 (leftover)
1728
1723
SmallVector<Register, 4 > LHSPartRegs, LHSLeftoverRegs;
1729
1724
if (!extractParts (LHS, SrcTy, NarrowTy, LeftoverTy, LHSPartRegs,
@@ -1775,19 +1770,59 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
1775
1770
Or = MIRBuilder.buildOr (NarrowTy, Or, Xors[I]);
1776
1771
MIRBuilder.buildICmp (Pred, Dst, Or, Zero);
1777
1772
} else {
1778
- // TODO: Handle non-power-of-two types.
1779
- assert (LHSPartRegs.size () == 2 && " Expected exactly 2 LHS part regs?" );
1780
- assert (RHSPartRegs.size () == 2 && " Expected exactly 2 RHS part regs?" );
1781
- Register LHSL = LHSPartRegs[0 ];
1782
- Register LHSH = LHSPartRegs[1 ];
1783
- Register RHSL = RHSPartRegs[0 ];
1784
- Register RHSH = RHSPartRegs[1 ];
1785
- MachineInstrBuilder CmpH = MIRBuilder.buildICmp (Pred, ResTy, LHSH, RHSH);
1786
- MachineInstrBuilder CmpHEQ =
1787
- MIRBuilder.buildICmp (CmpInst::Predicate::ICMP_EQ, ResTy, LHSH, RHSH);
1788
- MachineInstrBuilder CmpLU = MIRBuilder.buildICmp (
1789
- ICmpInst::getUnsignedPredicate (Pred), ResTy, LHSL, RHSL);
1790
- MIRBuilder.buildSelect (Dst, CmpHEQ, CmpLU, CmpH);
1773
+ Register CmpIn;
1774
+ for (unsigned I = 0 , E = LHSPartRegs.size (); I != E; ++I) {
1775
+ Register CmpOut;
1776
+ CmpInst::Predicate PartPred;
1777
+
1778
+ if (I == E - 1 && LHSLeftoverRegs.empty ()) {
1779
+ PartPred = Pred;
1780
+ CmpOut = Dst;
1781
+ } else {
1782
+ PartPred = ICmpInst::getUnsignedPredicate (Pred);
1783
+ CmpOut = MRI.createGenericVirtualRegister (ResTy);
1784
+ }
1785
+
1786
+ if (!CmpIn) {
1787
+ MIRBuilder.buildICmp (PartPred, CmpOut, LHSPartRegs[I],
1788
+ RHSPartRegs[I]);
1789
+ } else {
1790
+ auto Cmp = MIRBuilder.buildICmp (PartPred, ResTy, LHSPartRegs[I],
1791
+ RHSPartRegs[I]);
1792
+ auto CmpEq = MIRBuilder.buildICmp (CmpInst::Predicate::ICMP_EQ, ResTy,
1793
+ LHSPartRegs[I], RHSPartRegs[I]);
1794
+ MIRBuilder.buildSelect (CmpOut, CmpEq, CmpIn, Cmp);
1795
+ }
1796
+
1797
+ CmpIn = CmpOut;
1798
+ }
1799
+
1800
+ for (unsigned I = 0 , E = LHSLeftoverRegs.size (); I != E; ++I) {
1801
+ Register CmpOut;
1802
+ CmpInst::Predicate PartPred;
1803
+
1804
+ if (I == E - 1 && LHSLeftoverRegs.empty ()) {
1805
+ PartPred = Pred;
1806
+ CmpOut = Dst;
1807
+ } else {
1808
+ PartPred = ICmpInst::getUnsignedPredicate (Pred);
1809
+ CmpOut = MRI.createGenericVirtualRegister (ResTy);
1810
+ }
1811
+
1812
+ if (!CmpIn) {
1813
+ MIRBuilder.buildICmp (PartPred, CmpOut, LHSLeftoverRegs[I],
1814
+ RHSLeftoverRegs[I]);
1815
+ } else {
1816
+ auto Cmp = MIRBuilder.buildICmp (PartPred, ResTy, LHSLeftoverRegs[I],
1817
+ RHSLeftoverRegs[I]);
1818
+ auto CmpEq =
1819
+ MIRBuilder.buildICmp (CmpInst::Predicate::ICMP_EQ, ResTy,
1820
+ LHSLeftoverRegs[I], RHSLeftoverRegs[I]);
1821
+ MIRBuilder.buildSelect (CmpOut, CmpEq, CmpIn, Cmp);
1822
+ }
1823
+
1824
+ CmpIn = CmpOut;
1825
+ }
1791
1826
}
1792
1827
MI.eraseFromParent ();
1793
1828
return Legalized;
0 commit comments