32
32
#include " llvm/IR/IntrinsicsSPIRV.h"
33
33
#include " llvm/Support/Debug.h"
34
34
35
- namespace llvm {
35
+ namespace {
36
36
37
- class SPIRVMachineModuleInfo : public MachineModuleInfoImpl {
38
- public:
39
- SyncScope::ID Work_ItemSSID;
40
- SyncScope::ID WorkGroupSSID;
41
- SyncScope::ID DeviceSSID;
42
- SyncScope::ID AllSVMDevicesSSID;
43
- SyncScope::ID SubGroupSSID;
44
-
45
- SPIRVMachineModuleInfo (const MachineModuleInfo &MMI) {
46
- LLVMContext &CTX = MMI.getModule ()->getContext ();
47
- Work_ItemSSID = CTX.getOrInsertSyncScopeID (" work_item" );
48
- WorkGroupSSID = CTX.getOrInsertSyncScopeID (" workgroup" );
49
- DeviceSSID = CTX.getOrInsertSyncScopeID (" device" );
50
- AllSVMDevicesSSID = CTX.getOrInsertSyncScopeID (" all_svm_devices" );
51
- SubGroupSSID = CTX.getOrInsertSyncScopeID (" sub_group" );
37
+ struct SyncScopeIDs {
38
+ llvm::SyncScope::ID Work_ItemSSID;
39
+ llvm::SyncScope::ID WorkGroupSSID;
40
+ llvm::SyncScope::ID DeviceSSID;
41
+ llvm::SyncScope::ID AllSVMDevicesSSID;
42
+ llvm::SyncScope::ID SubGroupSSID;
43
+
44
+ SyncScopeIDs () {}
45
+ SyncScopeIDs (llvm::LLVMContext &Context) {
46
+ Work_ItemSSID = Context.getOrInsertSyncScopeID (" work_item" );
47
+ WorkGroupSSID = Context.getOrInsertSyncScopeID (" workgroup" );
48
+ DeviceSSID = Context.getOrInsertSyncScopeID (" device" );
49
+ AllSVMDevicesSSID = Context.getOrInsertSyncScopeID (" all_svm_devices" );
50
+ SubGroupSSID = Context.getOrInsertSyncScopeID (" sub_group" );
52
51
}
53
52
};
54
53
55
- } // end namespace llvm
54
+ } // namespace
56
55
57
56
#define DEBUG_TYPE " spirv-isel"
58
57
@@ -76,7 +75,7 @@ class SPIRVInstructionSelector : public InstructionSelector {
76
75
const RegisterBankInfo &RBI;
77
76
SPIRVGlobalRegistry &GR;
78
77
MachineRegisterInfo *MRI;
79
- SPIRVMachineModuleInfo *MMI = nullptr ;
78
+ SyncScopeIDs SSIDs ;
80
79
81
80
// / We need to keep track of the number we give to anonymous global values to
82
81
// / generate the same name every time when this is needed.
@@ -280,7 +279,7 @@ void SPIRVInstructionSelector::setupMF(MachineFunction &MF, GISelKnownBits *KB,
280
279
CodeGenCoverage *CoverageInfo,
281
280
ProfileSummaryInfo *PSI,
282
281
BlockFrequencyInfo *BFI) {
283
- MMI = & MF.getMMI ().getObjFileInfo <SPIRVMachineModuleInfo>( );
282
+ SSIDs = SyncScopeIDs ( MF.getFunction ().getContext () );
284
283
MRI = &MF.getRegInfo ();
285
284
GR.setCurrentFunc (MF);
286
285
InstructionSelector::setupMF (MF, KB, CoverageInfo, PSI, BFI);
@@ -721,16 +720,16 @@ bool SPIRVInstructionSelector::selectBitcast(Register ResVReg,
721
720
}
722
721
723
722
static SPIRV::Scope::Scope getScope (SyncScope::ID Ord,
724
- SPIRVMachineModuleInfo *MMI ) {
725
- if (Ord == SyncScope::SingleThread || Ord == MMI-> Work_ItemSSID )
723
+ const SyncScopeIDs &SSIDs ) {
724
+ if (Ord == SyncScope::SingleThread || Ord == SSIDs. Work_ItemSSID )
726
725
return SPIRV::Scope::Invocation;
727
- else if (Ord == SyncScope::System || Ord == MMI-> DeviceSSID )
726
+ else if (Ord == SyncScope::System || Ord == SSIDs. DeviceSSID )
728
727
return SPIRV::Scope::Device;
729
- else if (Ord == MMI-> WorkGroupSSID )
728
+ else if (Ord == SSIDs. WorkGroupSSID )
730
729
return SPIRV::Scope::Workgroup;
731
- else if (Ord == MMI-> AllSVMDevicesSSID )
730
+ else if (Ord == SSIDs. AllSVMDevicesSSID )
732
731
return SPIRV::Scope::CrossDevice;
733
- else if (Ord == MMI-> SubGroupSSID )
732
+ else if (Ord == SSIDs. SubGroupSSID )
734
733
return SPIRV::Scope::Subgroup;
735
734
else
736
735
// OpenCL approach is: "The functions that do not have memory_scope argument
@@ -896,7 +895,7 @@ bool SPIRVInstructionSelector::selectAtomicRMW(Register ResVReg,
896
895
assert (I.hasOneMemOperand ());
897
896
const MachineMemOperand *MemOp = *I.memoperands_begin ();
898
897
uint32_t Scope =
899
- static_cast <uint32_t >(getScope (MemOp->getSyncScopeID (), MMI ));
898
+ static_cast <uint32_t >(getScope (MemOp->getSyncScopeID (), SSIDs ));
900
899
Register ScopeReg = buildI32Constant (Scope, I);
901
900
902
901
Register Ptr = I.getOperand (1 ).getReg ();
@@ -967,7 +966,7 @@ bool SPIRVInstructionSelector::selectFence(MachineInstr &I) const {
967
966
uint32_t MemSem = static_cast <uint32_t >(getMemSemantics (AO));
968
967
Register MemSemReg = buildI32Constant (MemSem, I);
969
968
SyncScope::ID Ord = SyncScope::ID (I.getOperand (1 ).getImm ());
970
- uint32_t Scope = static_cast <uint32_t >(getScope (Ord, MMI ));
969
+ uint32_t Scope = static_cast <uint32_t >(getScope (Ord, SSIDs ));
971
970
Register ScopeReg = buildI32Constant (Scope, I);
972
971
MachineBasicBlock &BB = *I.getParent ();
973
972
return BuildMI (BB, I, I.getDebugLoc (), TII.get (SPIRV::OpMemoryBarrier))
@@ -987,7 +986,7 @@ bool SPIRVInstructionSelector::selectAtomicCmpXchg(Register ResVReg,
987
986
assert (I.hasOneMemOperand ());
988
987
const MachineMemOperand *MemOp = *I.memoperands_begin ();
989
988
unsigned Scope =
990
- static_cast <uint32_t >(getScope (MemOp->getSyncScopeID (), MMI ));
989
+ static_cast <uint32_t >(getScope (MemOp->getSyncScopeID (), SSIDs ));
991
990
ScopeReg = buildI32Constant (Scope, I);
992
991
993
992
unsigned ScSem = static_cast <uint32_t >(
0 commit comments