@@ -3023,6 +3023,7 @@ LegalizerHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) {
30233023 return UnableToLegalize;
30243024
30253025 LLT Ty = MRI.getType (MI.getOperand (0 ).getReg ());
3026+ assert (!Ty.isPointerOrPointerVector () && " Can't widen type" );
30263027 if (!Ty.isScalar ()) {
30273028 // We need to widen the vector element type.
30283029 Observer.changingInstr (MI);
@@ -4142,40 +4143,8 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerStore(GStore &StoreMI) {
41424143 }
41434144
41444145 if (MemTy.isVector ()) {
4145- LLT MemScalarTy = MemTy.getElementType ();
4146- if (MemTy != SrcTy) {
4147- if (!MemScalarTy.isByteSized ()) {
4148- // We need to build an integer scalar of the vector bit pattern.
4149- // It's not legal for us to add padding when storing a vector.
4150- unsigned NumBits = MemTy.getSizeInBits ();
4151- LLT IntTy = LLT::scalar (NumBits);
4152- auto CurrVal = MIRBuilder.buildConstant (IntTy, 0 );
4153- LLT IdxTy = getLLTForMVT (TLI.getVectorIdxTy (MF.getDataLayout ()));
4154-
4155- for (unsigned I = 0 , E = MemTy.getNumElements (); I < E; ++I) {
4156- auto Elt = MIRBuilder.buildExtractVectorElement (
4157- SrcTy.getElementType (), SrcReg,
4158- MIRBuilder.buildConstant (IdxTy, I));
4159- auto Trunc = MIRBuilder.buildTrunc (MemScalarTy, Elt);
4160- auto ZExt = MIRBuilder.buildZExt (IntTy, Trunc);
4161- unsigned ShiftIntoIdx = MF.getDataLayout ().isBigEndian ()
4162- ? (MemTy.getNumElements () - 1 ) - I
4163- : I;
4164- auto ShiftAmt = MIRBuilder.buildConstant (
4165- IntTy, ShiftIntoIdx * MemScalarTy.getSizeInBits ());
4166- auto Shifted = MIRBuilder.buildShl (IntTy, ZExt, ShiftAmt);
4167- CurrVal = MIRBuilder.buildOr (IntTy, CurrVal, Shifted);
4168- }
4169- auto PtrInfo = MMO.getPointerInfo ();
4170- auto *NewMMO = MF.getMachineMemOperand (&MMO, PtrInfo, IntTy);
4171- MIRBuilder.buildStore (CurrVal, PtrReg, *NewMMO);
4172- StoreMI.eraseFromParent ();
4173- return Legalized;
4174- }
4175-
4176- // FIXME: implement simple scalarization.
4177- return UnableToLegalize;
4178- }
4146+ if (MemTy != SrcTy)
4147+ return scalarizeVectorBooleanStore (StoreMI);
41794148
41804149 // TODO: We can do better than scalarizing the vector and at least split it
41814150 // in half.
@@ -4230,6 +4199,50 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerStore(GStore &StoreMI) {
42304199 return Legalized;
42314200}
42324201
4202+ LegalizerHelper::LegalizeResult
4203+ LegalizerHelper::scalarizeVectorBooleanStore (GStore &StoreMI) {
4204+ Register SrcReg = StoreMI.getValueReg ();
4205+ Register PtrReg = StoreMI.getPointerReg ();
4206+ LLT SrcTy = MRI.getType (SrcReg);
4207+ MachineMemOperand &MMO = **StoreMI.memoperands_begin ();
4208+ LLT MemTy = MMO.getMemoryType ();
4209+ LLT MemScalarTy = MemTy.getElementType ();
4210+ MachineFunction &MF = MIRBuilder.getMF ();
4211+
4212+ assert (SrcTy.isVector () && " Expect a vector store type" );
4213+
4214+ if (!MemScalarTy.isByteSized ()) {
4215+ // We need to build an integer scalar of the vector bit pattern.
4216+ // It's not legal for us to add padding when storing a vector.
4217+ unsigned NumBits = MemTy.getSizeInBits ();
4218+ LLT IntTy = LLT::scalar (NumBits);
4219+ auto CurrVal = MIRBuilder.buildConstant (IntTy, 0 );
4220+ LLT IdxTy = getLLTForMVT (TLI.getVectorIdxTy (MF.getDataLayout ()));
4221+
4222+ for (unsigned I = 0 , E = MemTy.getNumElements (); I < E; ++I) {
4223+ auto Elt = MIRBuilder.buildExtractVectorElement (
4224+ SrcTy.getElementType (), SrcReg, MIRBuilder.buildConstant (IdxTy, I));
4225+ auto Trunc = MIRBuilder.buildTrunc (MemScalarTy, Elt);
4226+ auto ZExt = MIRBuilder.buildZExt (IntTy, Trunc);
4227+ unsigned ShiftIntoIdx = MF.getDataLayout ().isBigEndian ()
4228+ ? (MemTy.getNumElements () - 1 ) - I
4229+ : I;
4230+ auto ShiftAmt = MIRBuilder.buildConstant (
4231+ IntTy, ShiftIntoIdx * MemScalarTy.getSizeInBits ());
4232+ auto Shifted = MIRBuilder.buildShl (IntTy, ZExt, ShiftAmt);
4233+ CurrVal = MIRBuilder.buildOr (IntTy, CurrVal, Shifted);
4234+ }
4235+ auto PtrInfo = MMO.getPointerInfo ();
4236+ auto *NewMMO = MF.getMachineMemOperand (&MMO, PtrInfo, IntTy);
4237+ MIRBuilder.buildStore (CurrVal, PtrReg, *NewMMO);
4238+ StoreMI.eraseFromParent ();
4239+ return Legalized;
4240+ }
4241+
4242+ // TODO: implement simple scalarization.
4243+ return UnableToLegalize;
4244+ }
4245+
42334246LegalizerHelper::LegalizeResult
42344247LegalizerHelper::bitcast (MachineInstr &MI, unsigned TypeIdx, LLT CastTy) {
42354248 switch (MI.getOpcode ()) {
@@ -4695,18 +4708,18 @@ LegalizerHelper::createStackTemporary(TypeSize Bytes, Align Alignment,
46954708 return MIRBuilder.buildFrameIndex (FramePtrTy, FrameIdx);
46964709}
46974710
4698- MachineInstrBuilder LegalizerHelper::createStackStoreLoad (Register Val,
4699- LLT DstTy) {
4700- LLT SrcTy = MRI.getType (Val);
4701- Align StackTypeAlign = getStackTemporaryAlignment (SrcTy);
4711+ MachineInstrBuilder LegalizerHelper::createStackStoreLoad (const DstOp &Res,
4712+ const SrcOp &Val) {
4713+ LLT SrcTy = Val.getLLTTy (MRI);
4714+ Align StackTypeAlign =
4715+ std::max (getStackTemporaryAlignment (SrcTy),
4716+ getStackTemporaryAlignment (Res.getLLTTy (MRI)));
47024717 MachinePointerInfo PtrInfo;
47034718 auto StackTemp =
47044719 createStackTemporary (SrcTy.getSizeInBytes (), StackTypeAlign, PtrInfo);
47054720
47064721 MIRBuilder.buildStore (Val, StackTemp, PtrInfo, StackTypeAlign);
4707- return MIRBuilder.buildLoad (
4708- DstTy, StackTemp, PtrInfo,
4709- std::min (StackTypeAlign, getStackTemporaryAlignment (DstTy)));
4722+ return MIRBuilder.buildLoad (Res, StackTemp, PtrInfo, StackTypeAlign);
47104723}
47114724
47124725static Register clampVectorIndex (MachineIRBuilder &B, Register IdxReg,
0 commit comments