@@ -120,7 +120,7 @@ static LLT getReadAnyLaneSplitTy(LLT Ty) {
120120 }
121121
122122 // Large scalars and 64-bit pointers
123- return LLT::scalar (32 );
123+ return LLT::integer (32 );
124124}
125125
126126static Register buildReadAnyLane (MachineIRBuilder &B, Register VgprSrc,
@@ -131,9 +131,17 @@ static void unmergeReadAnyLane(MachineIRBuilder &B,
131131 LLT UnmergeTy, Register VgprSrc,
132132 const RegisterBankInfo &RBI) {
133133 const RegisterBank *VgprRB = &RBI.getRegBank (AMDGPU::VGPRRegBankID);
134- auto Unmerge = B.buildUnmerge ({VgprRB, UnmergeTy}, VgprSrc);
134+ LLT Ty = B.getMRI ()->getType (VgprSrc);
135+ if (Ty.getScalarType ().isFloat ()) {
136+ VgprSrc = B.buildBitcast ({VgprRB, Ty.changeToInteger ()}, VgprSrc).getReg (0 );
137+ }
138+ auto Unmerge = B.buildUnmerge ({VgprRB, UnmergeTy.changeToInteger ()}, VgprSrc);
135139 for (unsigned i = 0 ; i < Unmerge->getNumOperands () - 1 ; ++i) {
136- SgprDstParts.push_back (buildReadAnyLane (B, Unmerge.getReg (i), RBI));
140+ Register Op = Unmerge.getReg (i);
141+ if (UnmergeTy.getScalarType ().isFloat ()) {
142+ Op = B.buildBitcast ({VgprRB, UnmergeTy}, Op).getReg (0 );
143+ }
144+ SgprDstParts.push_back (buildReadAnyLane (B, Op, RBI));
137145 }
138146}
139147
@@ -149,6 +157,11 @@ static Register buildReadAnyLane(MachineIRBuilder &B, Register VgprSrc,
149157 SmallVector<Register, 8 > SgprDstParts;
150158 unmergeReadAnyLane (B, SgprDstParts, getReadAnyLaneSplitTy (Ty), VgprSrc, RBI);
151159
160+ if (Ty.getScalarType ().isFloat ()) {
161+ auto Merge = B.buildMergeLikeInstr ({SgprRB, Ty.changeToInteger ()}, SgprDstParts);
162+ return B.buildBitcast ({SgprRB, Ty}, Merge).getReg (0 );
163+ }
164+
152165 return B.buildMergeLikeInstr ({SgprRB, Ty}, SgprDstParts).getReg (0 );
153166}
154167
0 commit comments