@@ -46,8 +46,6 @@ using namespace MIPatternMatch;
4646// / satisfiable.
4747static std::pair<int , int >
4848getNarrowTypeBreakDown (LLT OrigTy, LLT NarrowTy, LLT &LeftoverTy) {
49- assert (!LeftoverTy.isValid () && " this is an out argument" );
50-
5149 unsigned Size = OrigTy.getSizeInBits ();
5250 unsigned NarrowSize = NarrowTy.getSizeInBits ();
5351 unsigned NumParts = Size / NarrowSize;
@@ -175,7 +173,6 @@ bool LegalizerHelper::extractParts(Register Reg, LLT RegTy,
175173 std::tie (NumParts, NumLeftover) =
176174 getNarrowTypeBreakDown (RegTy, MainTy, LeftoverTy);
177175 unsigned MainSize = MainTy.getSizeInBits ();
178- unsigned LeftoverSize = LeftoverTy.getSizeInBits ();
179176
180177 // Use an unmerge when possible.
181178 if (NumLeftover == 0 ) {
@@ -202,10 +199,11 @@ bool LegalizerHelper::extractParts(Register Reg, LLT RegTy,
202199 MIRBuilder.buildExtract (MainTy, Reg, MainSize * I).getReg (0 ));
203200
204201 for (int I = 0 ; I != NumLeftover; ++I)
205- VRegs.push_back (MIRBuilder
206- .buildExtract (LeftoverTy, Reg,
207- MainSize * NumParts + LeftoverSize * I)
208- .getReg (0 ));
202+ LeftoverRegs.push_back (
203+ MIRBuilder
204+ .buildExtract (LeftoverTy, Reg,
205+ MainSize * NumParts + LeftoverTy.getSizeInBits () * I)
206+ .getReg (0 ));
209207
210208 return true ;
211209}
@@ -248,10 +246,8 @@ void LegalizerHelper::extractVectorParts(Register Reg, unsigned NumElts,
248246 }
249247}
250248
251- void LegalizerHelper::insertParts (Register DstReg,
252- LLT ResultTy, LLT PartTy,
253- ArrayRef<Register> PartRegs,
254- LLT LeftoverTy,
249+ void LegalizerHelper::insertParts (Register DstReg, LLT ResultTy, LLT PartTy,
250+ ArrayRef<Register> PartRegs, LLT LeftoverTy,
255251 ArrayRef<Register> LeftoverRegs) {
256252 if (!LeftoverTy.isValid ()) {
257253 assert (LeftoverRegs.empty ());
@@ -283,12 +279,19 @@ void LegalizerHelper::insertParts(Register DstReg,
283279 return mergeMixedSubvectors (DstReg, AllRegs);
284280 }
285281
286- SmallVector<Register> GCDRegs;
287- LLT GCDTy = getGCDType (getGCDType (ResultTy, LeftoverTy), PartTy);
288- for (auto PartReg : concat<const Register>(PartRegs, LeftoverRegs))
289- extractGCDType (GCDRegs, GCDTy, PartReg);
290- LLT ResultLCMTy = buildLCMMergePieces (ResultTy, LeftoverTy, GCDTy, GCDRegs);
291- buildWidenedRemergeToDst (DstReg, ResultLCMTy, GCDRegs);
282+ unsigned Offset = 0 ;
283+ unsigned ResultSize = ResultTy.getSizeInBits ();
284+ Register TmpReg = MIRBuilder.buildUndef (ResultTy).getReg (0 );
285+ for (Register Reg : concat<const Register>(PartRegs, LeftoverRegs)) {
286+ unsigned NextOffset = Offset + MRI.getType (Reg).getSizeInBits ();
287+ DstOp Result = ResultTy;
288+ if (NextOffset == ResultSize)
289+ Result = DstReg;
290+ TmpReg = MIRBuilder.buildInsert (Result, TmpReg, Reg, Offset).getReg (0 );
291+ Offset = NextOffset;
292+ }
293+ if (DstReg != TmpReg)
294+ MIRBuilder.buildCopy (DstReg, TmpReg);
292295}
293296
294297void LegalizerHelper::appendVectorElts (SmallVectorImpl<Register> &Elts,
@@ -1087,7 +1090,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
10871090 LeftoverRegs.clear ();
10881091
10891092 unsigned MainSize = PartRegs.size () * NarrowSize;
1090- unsigned LeftoverSize;
1093+ unsigned LeftoverSize = 0 ;
10911094 if (SizeOp0 < MainSize) {
10921095 PartRegs.truncate (SizeOp0 / NarrowSize);
10931096 LeftoverSize = SizeOp0 % NarrowSize;
@@ -1101,6 +1104,10 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
11011104 LeftoverRegs.push_back (
11021105 MIRBuilder.buildExtract (LeftoverTy, Op1, Offset).getReg (0 ));
11031106 }
1107+ if (PartRegs.empty ()) {
1108+ NarrowTy = std::exchange (LeftoverTy, LLT{});
1109+ PartRegs.swap (LeftoverRegs);
1110+ }
11041111
11051112 insertParts (Op0, Op0Ty, NarrowTy, PartRegs, LeftoverTy, LeftoverRegs);
11061113 MI.eraseFromParent ();
@@ -1111,19 +1118,19 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
11111118 if (TypeIdx != 0 )
11121119 return UnableToLegalize;
11131120
1114- LLT Ty = MRI.getType (MI.getOperand (0 ).getReg ());
1115- // Should widen scalar first
1116- if (Ty.getSizeInBits () % NarrowTy.getSizeInBits () != 0 )
1121+ Register Op1 = MI.getOperand (1 ).getReg ();
1122+ LLT Op1Ty = MRI.getType (Op1);
1123+ LLT LeftoverTy;
1124+ SmallVector<Register, 4 > PartRegs;
1125+ SmallVector<Register, 1 > LeftoverRegs;
1126+ if (!extractParts (Op1, Op1Ty, NarrowTy, LeftoverTy, PartRegs, LeftoverRegs))
11171127 return UnableToLegalize;
1128+ for (Register &PartReg : PartRegs)
1129+ PartReg = MIRBuilder.buildFreeze (NarrowTy, PartReg).getReg (0 );
1130+ for (Register &LeftoverReg : LeftoverRegs)
1131+ LeftoverReg = MIRBuilder.buildFreeze (LeftoverTy, LeftoverReg).getReg (0 );
11181132
1119- auto Unmerge = MIRBuilder.buildUnmerge (NarrowTy, MI.getOperand (1 ).getReg ());
1120- SmallVector<Register, 8 > Parts;
1121- for (unsigned i = 0 ; i < Unmerge->getNumDefs (); ++i) {
1122- Parts.push_back (
1123- MIRBuilder.buildFreeze (NarrowTy, Unmerge.getReg (i)).getReg (0 ));
1124- }
1125-
1126- MIRBuilder.buildMerge (MI.getOperand (0 ).getReg (), Parts);
1133+ insertParts (Op0, Op0Ty, NarrowTy, PartRegs, LeftoverTy, LeftoverRegs);
11271134 MI.eraseFromParent ();
11281135 return Legalized;
11291136 }
@@ -1295,7 +1302,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
12951302 for (unsigned j = 1 ; j < MI.getNumOperands (); j += 2 )
12961303 MIB.addUse (SrcRegs[j / 2 ][i]).add (MI.getOperand (j + 1 ));
12971304 }
1298- SmallVector<Register, 1 > DstLeftoverRegs (SrcRegs [0 ].size ());
1305+ SmallVector<Register, 1 > DstLeftoverRegs (SrcLeftoverRegs [0 ].size ());
12991306 for (unsigned i = 0 ; i < DstLeftoverRegs.size (); ++i) {
13001307 auto MIB = MIRBuilder.buildInstr (TargetOpcode::G_PHI, {LeftoverTy}, {});
13011308 DstLeftoverRegs[i] = MIB.getReg (0 );
@@ -5546,7 +5553,7 @@ LegalizerHelper::narrowScalarExt(MachineInstr &MI, unsigned TypeIdx,
55465553 PartRegs.push_back (ExtReg);
55475554 if (SizeOp0 > NumParts * NarrowSize) {
55485555 LeftoverTy = LLT::scalar (SizeOp0 - NarrowSize * NumParts);
5549- LeftoverRegs[ 0 ] = MIRBuilder.buildTrunc (LeftoverTy, ExtReg).getReg (0 );
5556+ LeftoverRegs = { MIRBuilder.buildTrunc (LeftoverTy, ExtReg).getReg (0 )} ;
55505557 } else {
55515558 LeftoverTy = LLT{};
55525559 LeftoverRegs.clear ();
0 commit comments