Implement LLVM 6 Polly
This commit is contained in:
+1
-1
@@ -293,7 +293,7 @@ struct MemoryManager : llvm::RTDyldMemoryManager
|
|||||||
return RTDyldMemoryManager::registerEHFrames(addr, load_addr, size);
|
return RTDyldMemoryManager::registerEHFrames(addr, load_addr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void deregisterEHFrames(u8* addr, u64 load_addr, std::size_t size) override
|
virtual void deregisterEHFrames() override
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
+29
-1
@@ -173,7 +173,7 @@ set(CMAKE_MODULE_PATH "${RPCS3_SRC_DIR}/cmake_modules")
|
|||||||
find_package(OpenGL REQUIRED)
|
find_package(OpenGL REQUIRED)
|
||||||
find_package(OpenAL REQUIRED)
|
find_package(OpenAL REQUIRED)
|
||||||
if(NOT WITHOUT_LLVM)
|
if(NOT WITHOUT_LLVM)
|
||||||
find_package(LLVM 4.0 CONFIG)
|
find_package(LLVM 6.0 CONFIG)
|
||||||
if(NOT LLVM_FOUND)
|
if(NOT LLVM_FOUND)
|
||||||
message("System LLVM was not found, LLVM will be built from the submodule.")
|
message("System LLVM was not found, LLVM will be built from the submodule.")
|
||||||
|
|
||||||
@@ -199,6 +199,28 @@ if(NOT WITHOUT_LLVM)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Now let's look for polly.
|
||||||
|
find_package(Polly)
|
||||||
|
if(Polly_FOUND)
|
||||||
|
add_definitions(-DPOLLY_AVAILABLE)
|
||||||
|
endif()
|
||||||
|
# Polly LLVM Compiler checks
|
||||||
|
CHECK_C_COMPILER_FLAG("-mllvm -polly" HAS_POLLY)
|
||||||
|
CHECK_C_COMPILER_FLAG("-mllvm -polly-target=hybrid" HAS_POLLY_HYBRID)
|
||||||
|
CHECK_C_COMPILER_FLAG("-mllvm -polly-target=cpu" HAS_POLLY_CPU)
|
||||||
|
|
||||||
|
if (HAS_POLLY)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mllvm -polly -mllvm -polly-parallel -lgomp -mllvm -polly-vectorizer=stripmine")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mllvm -polly -mllvm -polly-parallel -lgomp -mllvm -polly-vectorizer=stripmine")
|
||||||
|
if(HAS_POLLY_HYBRID)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mllvm -polly-target=hybrid")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} -mllvm -polly-target=cpu")
|
||||||
|
elseif(HAS_POLLY_CPU)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mllvm -polly-target=cpu")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} -mllvm -polly-target=cpu")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
set(PLATFORM_ARCH "macosx/x86_64")
|
set(PLATFORM_ARCH "macosx/x86_64")
|
||||||
@@ -274,6 +296,7 @@ endif()
|
|||||||
include_directories(
|
include_directories(
|
||||||
${OPENAL_INCLUDE_DIR}
|
${OPENAL_INCLUDE_DIR}
|
||||||
${LLVM_INCLUDE_DIRS}
|
${LLVM_INCLUDE_DIRS}
|
||||||
|
${Polly_INCLUDE_DIRS}
|
||||||
"${RPCS3_SRC_DIR}/../3rdparty/pugixml/src"
|
"${RPCS3_SRC_DIR}/../3rdparty/pugixml/src"
|
||||||
"${RPCS3_SRC_DIR}"
|
"${RPCS3_SRC_DIR}"
|
||||||
"${RPCS3_SRC_DIR}/Loader"
|
"${RPCS3_SRC_DIR}/Loader"
|
||||||
@@ -319,6 +342,7 @@ endif()
|
|||||||
link_directories(
|
link_directories(
|
||||||
"${RPCS3_SRC_DIR}/../3rdparty/minidx12/"
|
"${RPCS3_SRC_DIR}/../3rdparty/minidx12/"
|
||||||
"${RPCS3_SRC_DIR}/../Vulkan"
|
"${RPCS3_SRC_DIR}/../Vulkan"
|
||||||
|
"${Polly_LIBRARY_DIRS}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -393,6 +417,10 @@ if(NOT MSVC)
|
|||||||
target_link_libraries(rpcs3 GLEW::GLEW)
|
target_link_libraries(rpcs3 GLEW::GLEW)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(Polly_FOUND)
|
||||||
|
target_link_libraries(rpcs3 Polly PollyISL PollyPPCG)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
target_link_libraries(rpcs3 ws2_32.lib Winmm.lib Psapi.lib gdi32.lib VKstatic.1 glslang OSDependent OGLCompiler SPIRV HLSL setupapi.lib hidapi-hid Shlwapi.lib)
|
target_link_libraries(rpcs3 ws2_32.lib Winmm.lib Psapi.lib gdi32.lib VKstatic.1 glslang OSDependent OGLCompiler SPIRV HLSL setupapi.lib hidapi-hid Shlwapi.lib)
|
||||||
if(NOT MSVC)
|
if(NOT MSVC)
|
||||||
|
|||||||
@@ -40,6 +40,12 @@
|
|||||||
#include "llvm/Transforms/Scalar.h"
|
#include "llvm/Transforms/Scalar.h"
|
||||||
#include "llvm/Transforms/IPO.h"
|
#include "llvm/Transforms/IPO.h"
|
||||||
#include "llvm/Transforms/Vectorize.h"
|
#include "llvm/Transforms/Vectorize.h"
|
||||||
|
|
||||||
|
#ifdef POLLY_AVAILABLE
|
||||||
|
#include <polly/RegisterPasses.h>
|
||||||
|
#include <polly/ScopDetection.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
#endif
|
#endif
|
||||||
@@ -1469,6 +1475,11 @@ static void ppu_initialize2(jit_compiler& jit, const ppu_module& module_part, co
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef POLLY_AVAILABLE
|
||||||
|
PassRegistry &Registry = *PassRegistry::getPassRegistry();
|
||||||
|
polly::initializePollyPasses(Registry);
|
||||||
|
initializeAnalysis(Registry);
|
||||||
|
#endif
|
||||||
std::shared_ptr<MsgDialogBase> dlg;
|
std::shared_ptr<MsgDialogBase> dlg;
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -1486,6 +1497,9 @@ static void ppu_initialize2(jit_compiler& jit, const ppu_module& module_part, co
|
|||||||
//pm.add(createLoopInstSimplifyPass());
|
//pm.add(createLoopInstSimplifyPass());
|
||||||
//pm.add(createNewGVNPass());
|
//pm.add(createNewGVNPass());
|
||||||
pm.add(createDeadStoreEliminationPass());
|
pm.add(createDeadStoreEliminationPass());
|
||||||
|
#ifdef POLLY_AVAILABLE
|
||||||
|
polly::registerPollyPasses(pm);
|
||||||
|
#endif
|
||||||
//pm.add(createSCCPPass());
|
//pm.add(createSCCPPass());
|
||||||
//pm.add(createReassociatePass());
|
//pm.add(createReassociatePass());
|
||||||
//pm.add(createInstructionCombiningPass());
|
//pm.add(createInstructionCombiningPass());
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ const ppu_decoder<PPUTranslator> s_ppu_decoder;
|
|||||||
PPUTranslator::PPUTranslator(LLVMContext& context, Module* module, const ppu_module& info)
|
PPUTranslator::PPUTranslator(LLVMContext& context, Module* module, const ppu_module& info)
|
||||||
: cpu_translator(context, module, false)
|
: cpu_translator(context, module, false)
|
||||||
, m_info(info)
|
, m_info(info)
|
||||||
, m_pure_attr(AttributeSet::get(m_context, AttributeSet::FunctionIndex, {Attribute::NoUnwind, Attribute::ReadNone}))
|
, m_pure_attr(AttributeList::get(m_context,AttributeList::FunctionIndex, AttrBuilder().addAttribute(Attribute::NoUnwind).addAttribute(Attribute::ReadNone)))
|
||||||
{
|
{
|
||||||
// There is no weak linkage on JIT, so let's create variables with different names for each module part
|
// There is no weak linkage on JIT, so let's create variables with different names for each module part
|
||||||
const u32 gsuffix = m_info.name.empty() ? info.funcs[0].addr : info.funcs[0].addr - m_info.segs[0].addr;
|
const u32 gsuffix = m_info.name.empty() ? info.funcs[0].addr : info.funcs[0].addr - m_info.segs[0].addr;
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class PPUTranslator final : public cpu_translator
|
|||||||
std::map<u64, const ppu_reloc*> m_relocs;
|
std::map<u64, const ppu_reloc*> m_relocs;
|
||||||
|
|
||||||
// Attributes for function calls which are "pure" and may be optimized away if their results are unused
|
// Attributes for function calls which are "pure" and may be optimized away if their results are unused
|
||||||
const llvm::AttributeSet m_pure_attr;
|
const llvm::AttributeList m_pure_attr;
|
||||||
|
|
||||||
// LLVM function
|
// LLVM function
|
||||||
llvm::Function* m_function;
|
llvm::Function* m_function;
|
||||||
@@ -297,7 +297,7 @@ public:
|
|||||||
|
|
||||||
// Call a function with attribute list
|
// Call a function with attribute list
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
llvm::CallInst* Call(llvm::Type* ret, llvm::AttributeSet attr, llvm::StringRef name, Args... args)
|
llvm::CallInst* Call(llvm::Type* ret, llvm::AttributeList attr, llvm::StringRef name, Args... args)
|
||||||
{
|
{
|
||||||
// Call the function
|
// Call the function
|
||||||
return m_ir->CreateCall(m_module->getOrInsertFunction(name, llvm::FunctionType::get(ret, {args->getType()...}, false), attr), {args...});
|
return m_ir->CreateCall(m_module->getOrInsertFunction(name, llvm::FunctionType::get(ret, {args->getType()...}, false), attr), {args...});
|
||||||
@@ -307,7 +307,7 @@ public:
|
|||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
llvm::CallInst* Call(llvm::Type* ret, llvm::StringRef name, Args... args)
|
llvm::CallInst* Call(llvm::Type* ret, llvm::StringRef name, Args... args)
|
||||||
{
|
{
|
||||||
return Call(ret, llvm::AttributeSet{}, name, args...);
|
return Call(ret, llvm::AttributeList{}, name, args...);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle compilation errors
|
// Handle compilation errors
|
||||||
|
|||||||
@@ -61,7 +61,7 @@
|
|||||||
<ItemDefinitionGroup>
|
<ItemDefinitionGroup>
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
<AdditionalIncludeDirectories>..\3rdparty\zlib;..\llvm\include;..\llvm_build\include;</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\3rdparty\zlib;..\llvm\include;..\llvm\tools\polly\include;..\llvm_build\include;</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<PreBuildEvent>
|
<PreBuildEvent>
|
||||||
<Command>%windir%\sysnative\cmd.exe /c "$(SolutionDir)\Utilities\git-version-gen.cmd"</Command>
|
<Command>%windir%\sysnative\cmd.exe /c "$(SolutionDir)\Utilities\git-version-gen.cmd"</Command>
|
||||||
|
|||||||
+3
-3
@@ -5,12 +5,12 @@
|
|||||||
<PropertyGroup />
|
<PropertyGroup />
|
||||||
<ItemDefinitionGroup>
|
<ItemDefinitionGroup>
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<PreprocessorDefinitions>LLVM_AVAILABLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>POLLY_AVAILABLE;LLVM_AVAILABLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Lib>
|
<Lib>
|
||||||
<AdditionalLibraryDirectories Condition="'$(Configuration)'=='Debug - LLVM'">..\llvm_build\Debug\lib</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories Condition="'$(Configuration)'=='Debug - LLVM'">..\llvm_build\Debug\lib</AdditionalLibraryDirectories>
|
||||||
<AdditionalLibraryDirectories Condition="'$(Configuration)'=='Release - LLVM'">..\llvm_build\Release\lib</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories Condition="'$(Configuration)'=='Release - LLVM'">..\llvm_build\Release\lib;..\llvm_build\lib\Release</AdditionalLibraryDirectories>
|
||||||
<AdditionalDependencies>LLVMProfileData.lib;LLVMDebugInfoCodeView.lib;LLVMDebugInfoMSF.lib;LLVMInstrumentation.lib;LLVMMCJIT.lib;LLVMRuntimeDyld.lib;LLVMVectorize.lib;LLVMX86CodeGen.lib;LLVMGlobalISel.lib;LLVMX86Disassembler.lib;LLVMExecutionEngine.lib;LLVMAsmPrinter.lib;LLVMSelectionDAG.lib;LLVMCodeGen.lib;LLVMScalarOpts.lib;LLVMInstCombine.lib;LLVMTransformUtils.lib;LLVMAnalysis.lib;LLVMTarget.lib;LLVMX86Desc.lib;LLVMX86AsmPrinter.lib;LLVMObject.lib;LLVMMCParser.lib;LLVMBitReader.lib;LLVMCore.lib;LLVMX86Utils.lib;LLVMMC.lib;LLVMX86Info.lib;LLVMSupport.lib;LLVMMCDisassembler.lib;LLVMipo.lib</AdditionalDependencies>
|
<AdditionalDependencies>LLVMProfileData.lib;LLVMDebugInfoCodeView.lib;LLVMDebugInfoMSF.lib;LLVMInstrumentation.lib;LLVMMCJIT.lib;LLVMRuntimeDyld.lib;LLVMVectorize.lib;LLVMX86CodeGen.lib;LLVMGlobalISel.lib;LLVMX86Disassembler.lib;LLVMExecutionEngine.lib;LLVMAsmPrinter.lib;LLVMSelectionDAG.lib;LLVMCodeGen.lib;LLVMScalarOpts.lib;LLVMInstCombine.lib;LLVMTransformUtils.lib;LLVMAnalysis.lib;LLVMTarget.lib;LLVMX86Desc.lib;LLVMX86AsmPrinter.lib;LLVMObject.lib;LLVMMCParser.lib;LLVMBitReader.lib;LLVMCore.lib;LLVMX86Utils.lib;LLVMMC.lib;LLVMX86Info.lib;LLVMSupport.lib;LLVMMCDisassembler.lib;LLVMipo.lib;LLVMBinaryFormat.lib;LLVMPasses.lib;LLVMIRReader.lib;LLVMLinker.lib;LLVMAsmParser.lib;Polly.lib;PollyISL.lib;PollyPPCG.lib</AdditionalDependencies>
|
||||||
</Lib>
|
</Lib>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup />
|
<ItemGroup />
|
||||||
|
|||||||
Reference in New Issue
Block a user