@@ -1117,6 +1117,7 @@ bool SPIRVInstructionSelector::selectMemOperation(Register ResVReg,
11171117 Constant::getNullValue (LLVMArrTy));
11181118 Register VarReg = MRI->createGenericVirtualRegister (LLT::scalar (64 ));
11191119 GR.add (GV, GR.CurMF , VarReg);
1120+ GR.addGlobalObject (GV, GR.CurMF , VarReg);
11201121
11211122 Result &=
11221123 BuildMI (*I.getParent (), I, I.getDebugLoc (), TII.get (SPIRV::OpVariable))
@@ -3509,18 +3510,25 @@ bool SPIRVInstructionSelector::selectGlobalValue(
35093510 // References to a function via function pointers generate virtual
35103511 // registers without a definition. We will resolve it later, during
35113512 // module analysis stage.
3513+ Register ResTypeReg = GR.getSPIRVTypeID (ResType);
35123514 MachineRegisterInfo *MRI = MIRBuilder.getMRI ();
3513- Register FuncVReg = MRI->createGenericVirtualRegister (LLT::scalar (64 ));
3514- MRI->setRegClass (FuncVReg, &SPIRV::iIDRegClass);
3515- MachineInstrBuilder MB =
3515+ Register FuncVReg =
3516+ MRI->createGenericVirtualRegister (GR.getRegType (ResType));
3517+ MRI->setRegClass (FuncVReg, &SPIRV::pIDRegClass);
3518+ MachineInstrBuilder MIB1 =
3519+ BuildMI (BB, I, I.getDebugLoc (), TII.get (SPIRV::OpUndef))
3520+ .addDef (FuncVReg)
3521+ .addUse (ResTypeReg);
3522+ MachineInstrBuilder MIB2 =
35163523 BuildMI (BB, I, I.getDebugLoc (),
35173524 TII.get (SPIRV::OpConstantFunctionPointerINTEL))
35183525 .addDef (NewReg)
3519- .addUse (GR. getSPIRVTypeID (ResType) )
3526+ .addUse (ResTypeReg )
35203527 .addUse (FuncVReg);
35213528 // mapping the function pointer to the used Function
3522- GR.recordFunctionPointer (&MB.getInstr ()->getOperand (2 ), GVFun);
3523- return MB.constrainAllUses (TII, TRI, RBI);
3529+ GR.recordFunctionPointer (&MIB2.getInstr ()->getOperand (2 ), GVFun);
3530+ return MIB1.constrainAllUses (TII, TRI, RBI) &&
3531+ MIB2.constrainAllUses (TII, TRI, RBI);
35243532 }
35253533 return BuildMI (BB, I, I.getDebugLoc (), TII.get (SPIRV::OpConstantNull))
35263534 .addDef (NewReg)
0 commit comments