@@ -735,117 +735,6 @@ bool AMDGPUCallLowering::lowerFormalArgumentsKernel(
735
735
return true ;
736
736
}
737
737
738
- // / Pack values \p SrcRegs to cover the vector type result \p DstRegs.
739
- static MachineInstrBuilder mergeVectorRegsToResultRegs (
740
- MachineIRBuilder &B, ArrayRef<Register> DstRegs, ArrayRef<Register> SrcRegs) {
741
- MachineRegisterInfo &MRI = *B.getMRI ();
742
- LLT LLTy = MRI.getType (DstRegs[0 ]);
743
- LLT PartLLT = MRI.getType (SrcRegs[0 ]);
744
-
745
- // Deal with v3s16 split into v2s16
746
- LLT LCMTy = getLCMType (LLTy, PartLLT);
747
- if (LCMTy == LLTy) {
748
- // Common case where no padding is needed.
749
- assert (DstRegs.size () == 1 );
750
- return B.buildConcatVectors (DstRegs[0 ], SrcRegs);
751
- }
752
-
753
- const int NumWide = LCMTy.getSizeInBits () / PartLLT.getSizeInBits ();
754
- Register Undef = B.buildUndef (PartLLT).getReg (0 );
755
-
756
- // Build vector of undefs.
757
- SmallVector<Register, 8 > WidenedSrcs (NumWide, Undef);
758
-
759
- // Replace the first sources with the real registers.
760
- std::copy (SrcRegs.begin (), SrcRegs.end (), WidenedSrcs.begin ());
761
-
762
- auto Widened = B.buildConcatVectors (LCMTy, WidenedSrcs);
763
- int NumDst = LCMTy.getSizeInBits () / LLTy.getSizeInBits ();
764
-
765
- SmallVector<Register, 8 > PadDstRegs (NumDst);
766
- std::copy (DstRegs.begin (), DstRegs.end (), PadDstRegs.begin ());
767
-
768
- // Create the excess dead defs for the unmerge.
769
- for (int I = DstRegs.size (); I != NumDst; ++I)
770
- PadDstRegs[I] = MRI.createGenericVirtualRegister (LLTy);
771
-
772
- return B.buildUnmerge (PadDstRegs, Widened);
773
- }
774
-
775
- // TODO: Move this to generic code
776
- static void packSplitRegsToOrigType (MachineIRBuilder &B,
777
- ArrayRef<Register> OrigRegs,
778
- ArrayRef<Register> Regs,
779
- LLT LLTy,
780
- LLT PartLLT) {
781
- MachineRegisterInfo &MRI = *B.getMRI ();
782
-
783
- if (!LLTy.isVector () && !PartLLT.isVector ()) {
784
- assert (OrigRegs.size () == 1 );
785
- LLT OrigTy = MRI.getType (OrigRegs[0 ]);
786
-
787
- unsigned SrcSize = PartLLT.getSizeInBits () * Regs.size ();
788
- if (SrcSize == OrigTy.getSizeInBits ())
789
- B.buildMerge (OrigRegs[0 ], Regs);
790
- else {
791
- auto Widened = B.buildMerge (LLT::scalar (SrcSize), Regs);
792
- B.buildTrunc (OrigRegs[0 ], Widened);
793
- }
794
-
795
- return ;
796
- }
797
-
798
- if (LLTy.isVector () && PartLLT.isVector ()) {
799
- assert (OrigRegs.size () == 1 );
800
- assert (LLTy.getElementType () == PartLLT.getElementType ());
801
- mergeVectorRegsToResultRegs (B, OrigRegs, Regs);
802
- return ;
803
- }
804
-
805
- assert (LLTy.isVector () && !PartLLT.isVector ());
806
-
807
- LLT DstEltTy = LLTy.getElementType ();
808
-
809
- // Pointer information was discarded. We'll need to coerce some register types
810
- // to avoid violating type constraints.
811
- LLT RealDstEltTy = MRI.getType (OrigRegs[0 ]).getElementType ();
812
-
813
- assert (DstEltTy.getSizeInBits () == RealDstEltTy.getSizeInBits ());
814
-
815
- if (DstEltTy == PartLLT) {
816
- // Vector was trivially scalarized.
817
-
818
- if (RealDstEltTy.isPointer ()) {
819
- for (Register Reg : Regs)
820
- MRI.setType (Reg, RealDstEltTy);
821
- }
822
-
823
- B.buildBuildVector (OrigRegs[0 ], Regs);
824
- } else if (DstEltTy.getSizeInBits () > PartLLT.getSizeInBits ()) {
825
- // Deal with vector with 64-bit elements decomposed to 32-bit
826
- // registers. Need to create intermediate 64-bit elements.
827
- SmallVector<Register, 8 > EltMerges;
828
- int PartsPerElt = DstEltTy.getSizeInBits () / PartLLT.getSizeInBits ();
829
-
830
- assert (DstEltTy.getSizeInBits () % PartLLT.getSizeInBits () == 0 );
831
-
832
- for (int I = 0 , NumElts = LLTy.getNumElements (); I != NumElts; ++I) {
833
- auto Merge = B.buildMerge (RealDstEltTy, Regs.take_front (PartsPerElt));
834
- // Fix the type in case this is really a vector of pointers.
835
- MRI.setType (Merge.getReg (0 ), RealDstEltTy);
836
- EltMerges.push_back (Merge.getReg (0 ));
837
- Regs = Regs.drop_front (PartsPerElt);
838
- }
839
-
840
- B.buildBuildVector (OrigRegs[0 ], EltMerges);
841
- } else {
842
- // Vector was split, and elements promoted to a wider type.
843
- LLT BVType = LLT::vector (LLTy.getNumElements (), PartLLT);
844
- auto BV = B.buildBuildVector (BVType, Regs);
845
- B.buildTrunc (OrigRegs[0 ], BV);
846
- }
847
- }
848
-
849
738
bool AMDGPUCallLowering::lowerFormalArguments (
850
739
MachineIRBuilder &B, const Function &F, ArrayRef<ArrayRef<Register>> VRegs,
851
740
FunctionLoweringInfo &FLI) const {
@@ -886,7 +775,6 @@ bool AMDGPUCallLowering::lowerFormalArguments(
886
775
CCInfo.AllocateReg (ImplicitBufferPtrReg);
887
776
}
888
777
889
- SmallVector<ArgInfo, 8 > SplitArg;
890
778
SmallVector<ArgInfo, 32 > SplitArgs;
891
779
unsigned Idx = 0 ;
892
780
unsigned PSInputNum = 0 ;
@@ -936,19 +824,7 @@ bool AMDGPUCallLowering::lowerFormalArguments(
936
824
const unsigned OrigArgIdx = Idx + AttributeList::FirstArgIndex;
937
825
setArgFlags (OrigArg, OrigArgIdx, DL, F);
938
826
939
- SplitArg.clear ();
940
- splitToValueTypes (B, OrigArg, SplitArg, DL, CC);
941
-
942
- processSplitArgs (B, OrigArg, SplitArg, SplitArgs, DL, CC, false ,
943
- // FIXME: We should probably be passing multiple registers
944
- // to handleAssignments to do this
945
- [&](ArrayRef<Register> Regs, Register DstReg, LLT LLTy,
946
- LLT PartLLT, int VTSplitIdx) {
947
- assert (DstReg == VRegs[Idx][VTSplitIdx]);
948
- packSplitRegsToOrigType (B, VRegs[Idx][VTSplitIdx], Regs,
949
- LLTy, PartLLT);
950
- });
951
-
827
+ splitToValueTypes (B, OrigArg, SplitArgs, DL, CC);
952
828
++Idx;
953
829
}
954
830
@@ -1356,19 +1232,7 @@ bool AMDGPUCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
1356
1232
insertSRetLoads (MIRBuilder, Info.OrigRet .Ty , Info.OrigRet .Regs ,
1357
1233
Info.DemoteRegister , Info.DemoteStackIndex );
1358
1234
} else if (!Info.OrigRet .Ty ->isVoidTy ()) {
1359
- SmallVector<ArgInfo, 8 > PreSplitRetInfos;
1360
-
1361
- splitToValueTypes (
1362
- MIRBuilder, Info.OrigRet , PreSplitRetInfos/* InArgs*/ , DL, Info.CallConv );
1363
-
1364
- processSplitArgs (MIRBuilder, Info.OrigRet ,
1365
- PreSplitRetInfos, InArgs/* SplitRetInfos*/ , DL, Info.CallConv , false ,
1366
- [&](ArrayRef<Register> Regs, Register DstReg,
1367
- LLT LLTy, LLT PartLLT, int VTSplitIdx) {
1368
- assert (DstReg == Info.OrigRet .Regs [VTSplitIdx]);
1369
- packSplitRegsToOrigType (MIRBuilder, Info.OrigRet .Regs [VTSplitIdx],
1370
- Regs, LLTy, PartLLT);
1371
- });
1235
+ splitToValueTypes (MIRBuilder, Info.OrigRet , InArgs, DL, Info.CallConv );
1372
1236
}
1373
1237
1374
1238
// Make sure the raw argument copies are inserted before the marshalling to
0 commit comments