1414#include " SPIRV.h"
1515#include " SPIRVGlobalRegistry.h"
1616#include " SPIRVSubtarget.h"
17+ #include " llvm/CodeGen/GlobalISel/GenericMachineInstrs.h"
1718#include " llvm/CodeGen/GlobalISel/LegalizerHelper.h"
1819#include " llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
1920#include " llvm/CodeGen/MachineInstr.h"
@@ -188,7 +189,7 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
188189 LegalizeMutations::changeElementCountTo (
189190 0 , ElementCount::getFixed (4 )))
190191 .lowerIf (vectorElementCountIsGreaterThan (1 , 4 ))
191- .alwaysLegal ();
192+ .custom ();
192193 getActionDefinitionsBuilder (G_CONCAT_VECTORS)
193194 .legalFor (allShaderVectors)
194195 .lower ();
@@ -415,6 +416,11 @@ bool SPIRVLegalizerInfo::legalizeCustom(
415416 default :
416417 // TODO: implement legalization for other opcodes.
417418 return true ;
419+ case TargetOpcode::G_BITCAST:
420+ return legalizeBitcast (Helper, MI);
421+ case TargetOpcode::G_INTRINSIC:
422+ return legalizeIntrinsic (Helper, MI);
423+
418424 case TargetOpcode::G_IS_FPCLASS:
419425 return legalizeIsFPClass (Helper, MI, LocObserver);
420426 case TargetOpcode::G_ICMP: {
@@ -441,6 +447,41 @@ bool SPIRVLegalizerInfo::legalizeCustom(
441447 }
442448}
443449
450+ bool SPIRVLegalizerInfo::legalizeIntrinsic (LegalizerHelper &Helper,
451+ MachineInstr &MI) const {
452+ MachineIRBuilder &MIRBuilder = Helper.MIRBuilder ;
453+ MachineRegisterInfo &MRI = *MIRBuilder.getMRI ();
454+
455+ auto IntrinsicID = cast<GIntrinsic>(MI).getIntrinsicID ();
456+ if (IntrinsicID == Intrinsic::spv_bitcast) {
457+ Register DstReg = MI.getOperand (0 ).getReg ();
458+ Register SrcReg = MI.getOperand (2 ).getReg ();
459+ LLT DstTy = MRI.getType (DstReg);
460+ LLT SrcTy = MRI.getType (SrcReg);
461+
462+ bool isLongVector = (DstTy.isVector () && DstTy.getNumElements () > 4 ) ||
463+ (SrcTy.isVector () && SrcTy.getNumElements () > 4 );
464+
465+ if (isLongVector) {
466+ MIRBuilder.buildBitcast (DstReg, SrcReg);
467+ MI.eraseFromParent ();
468+ }
469+ return true ;
470+ }
471+ return true ;
472+ }
473+
474+ bool SPIRVLegalizerInfo::legalizeBitcast (LegalizerHelper &Helper,
475+ MachineInstr &MI) const {
476+ MachineIRBuilder &MIRBuilder = Helper.MIRBuilder ;
477+ Register DstReg = MI.getOperand (0 ).getReg ();
478+ Register SrcReg = MI.getOperand (1 ).getReg ();
479+ SmallVector<Register, 1 > DstRegs = {DstReg};
480+ MIRBuilder.buildIntrinsic (Intrinsic::spv_bitcast, DstRegs).addUse (SrcReg);
481+ MI.eraseFromParent ();
482+ return true ;
483+ }
484+
444485// Note this code was copied from LegalizerHelper::lowerISFPCLASS and adjusted
445486// to ensure that all instructions created during the lowering have SPIR-V types
446487// assigned to them.
0 commit comments