AMDGPU: Handle more than one memory operand in SIMemoryLegalizer
Differential Revision: https://reviews.llvm.org/D37397
llvm-svn: 312725
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUMachineModuleInfo.h b/llvm/lib/Target/AMDGPU/AMDGPUMachineModuleInfo.h
index 98fe75b..1a728c6 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUMachineModuleInfo.h
+++ b/llvm/lib/Target/AMDGPU/AMDGPUMachineModuleInfo.h
@@ -16,6 +16,8 @@
#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
#define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINEMODULEINFO_H
+#include "llvm/ADT/None.h"
+#include "llvm/ADT/Optional.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/MachineModuleInfoImpls.h"
#include "llvm/IR/LLVMContext.h"
@@ -35,6 +37,27 @@
/// \brief Wavefront synchronization scope ID.
SyncScope::ID WavefrontSSID;
+ /// \brief In AMDGPU target synchronization scopes are inclusive, meaning a
+ /// larger synchronization scope is inclusive of a smaller synchronization
+ /// scope.
+ ///
+ /// \returns \p SSID's inclusion ordering, or "None" if \p SSID is not
+ /// supported by the AMDGPU target.
+ Optional<uint8_t> getSyncScopeInclusionOrdering(SyncScope::ID SSID) const {
+ if (SSID == SyncScope::SingleThread)
+ return 0;
+ else if (SSID == getWavefrontSSID())
+ return 1;
+ else if (SSID == getWorkgroupSSID())
+ return 2;
+ else if (SSID == getAgentSSID())
+ return 3;
+ else if (SSID == SyncScope::System)
+ return 4;
+
+ return None;
+ }
+
public:
AMDGPUMachineModuleInfo(const MachineModuleInfo &MMI);
@@ -50,6 +73,23 @@
SyncScope::ID getWavefrontSSID() const {
return WavefrontSSID;
}
+
+ /// \brief In AMDGPU target synchronization scopes are inclusive, meaning a
+ /// larger synchronization scope is inclusive of a smaller synchronization
+ /// scope.
+ ///
+ /// \returns True if synchronization scope \p A is larger than or equal to
+ /// synchronization scope \p B, false if synchronization scope \p A is smaller
+ /// than synchronization scope \p B, or "None" if either synchronization scope
+ /// \p A or \p B is not supported by the AMDGPU target.
+ Optional<bool> isSyncScopeInclusion(SyncScope::ID A, SyncScope::ID B) const {
+ const auto &AIO = getSyncScopeInclusionOrdering(A);
+ const auto &BIO = getSyncScopeInclusionOrdering(B);
+ if (!AIO || !BIO)
+ return None;
+
+ return AIO.getValue() > BIO.getValue();
+ }
};
} // end namespace llvm