From 09c77ff46ca01ad76e65b588b6d1accd9367f5cb Mon Sep 17 00:00:00 2001 From: Zion Nimchuk Date: Sun, 2 Jul 2017 18:44:26 +0100 Subject: [PATCH] Implement LLVM 6 Polly --- Utilities/JIT.cpp | 2 +- rpcs3/CMakeLists.txt | 32 ++++++++++++++++++++++++++++++-- rpcs3/Emu/Cell/PPUThread.cpp | 14 ++++++++++++++ rpcs3/Emu/Cell/PPUTranslator.cpp | 2 +- rpcs3/Emu/Cell/PPUTranslator.h | 6 +++--- rpcs3/emucore.vcxproj | 2 +- rpcs3_llvm.props | 8 ++++---- 7 files changed, 54 insertions(+), 12 deletions(-) diff --git a/Utilities/JIT.cpp b/Utilities/JIT.cpp index 2b262d0531..a33ed2aa20 100644 --- a/Utilities/JIT.cpp +++ b/Utilities/JIT.cpp @@ -293,7 +293,7 @@ struct MemoryManager : llvm::RTDyldMemoryManager return RTDyldMemoryManager::registerEHFrames(addr, load_addr, size); } - void deregisterEHFrames(u8* addr, u64 load_addr, std::size_t size) override + virtual void deregisterEHFrames() override { } }; diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index e1e8957b38..83157a5ad5 100644 --- a/rpcs3/CMakeLists.txt +++ b/rpcs3/CMakeLists.txt @@ -96,7 +96,7 @@ if(NOT MSVC) if(NOT APPLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--exclude-libs,ALL") endif() - + if(WIN32) set(CMAKE_RC_COMPILER_INIT windres) enable_language(RC) @@ -173,7 +173,7 @@ set(CMAKE_MODULE_PATH "${RPCS3_SRC_DIR}/cmake_modules") find_package(OpenGL REQUIRED) find_package(OpenAL REQUIRED) if(NOT WITHOUT_LLVM) - find_package(LLVM 4.0 CONFIG) + find_package(LLVM 6.0 CONFIG) if(NOT LLVM_FOUND) message("System LLVM was not found, LLVM will be built from the submodule.") @@ -198,6 +198,28 @@ if(NOT WITHOUT_LLVM) 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) @@ -274,6 +296,7 @@ endif() include_directories( ${OPENAL_INCLUDE_DIR} ${LLVM_INCLUDE_DIRS} +${Polly_INCLUDE_DIRS} "${RPCS3_SRC_DIR}/../3rdparty/pugixml/src" "${RPCS3_SRC_DIR}" "${RPCS3_SRC_DIR}/Loader" @@ -319,6 +342,7 @@ endif() link_directories( "${RPCS3_SRC_DIR}/../3rdparty/minidx12/" "${RPCS3_SRC_DIR}/../Vulkan" +"${Polly_LIBRARY_DIRS}" ) @@ -393,6 +417,10 @@ if(NOT MSVC) target_link_libraries(rpcs3 GLEW::GLEW) endif() +if(Polly_FOUND) + target_link_libraries(rpcs3 Polly PollyISL PollyPPCG) +endif() + 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) if(NOT MSVC) diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index e9cc8cf209..0f8759ca09 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -40,6 +40,12 @@ #include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/IPO.h" #include "llvm/Transforms/Vectorize.h" + +#ifdef POLLY_AVAILABLE +#include +#include +#endif + #ifdef _MSC_VER #pragma warning(pop) #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 dlg; { @@ -1486,6 +1497,9 @@ static void ppu_initialize2(jit_compiler& jit, const ppu_module& module_part, co //pm.add(createLoopInstSimplifyPass()); //pm.add(createNewGVNPass()); pm.add(createDeadStoreEliminationPass()); +#ifdef POLLY_AVAILABLE + polly::registerPollyPasses(pm); +#endif //pm.add(createSCCPPass()); //pm.add(createReassociatePass()); //pm.add(createInstructionCombiningPass()); diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 55a7b80c4c..348d599df3 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -14,7 +14,7 @@ const ppu_decoder s_ppu_decoder; PPUTranslator::PPUTranslator(LLVMContext& context, Module* module, const ppu_module& info) : cpu_translator(context, module, false) , 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 const u32 gsuffix = m_info.name.empty() ? info.funcs[0].addr : info.funcs[0].addr - m_info.segs[0].addr; diff --git a/rpcs3/Emu/Cell/PPUTranslator.h b/rpcs3/Emu/Cell/PPUTranslator.h index d94f8fde9c..b0e42d3603 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.h +++ b/rpcs3/Emu/Cell/PPUTranslator.h @@ -15,7 +15,7 @@ class PPUTranslator final : public cpu_translator std::map m_relocs; // 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* m_function; @@ -297,7 +297,7 @@ public: // Call a function with attribute list template - 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 return m_ir->CreateCall(m_module->getOrInsertFunction(name, llvm::FunctionType::get(ret, {args->getType()...}, false), attr), {args...}); @@ -307,7 +307,7 @@ public: template 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 diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 69f7355ef2..20cc3c2352 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -61,7 +61,7 @@ Use - ..\3rdparty\zlib;..\llvm\include;..\llvm_build\include; + ..\3rdparty\zlib;..\llvm\include;..\llvm\tools\polly\include;..\llvm_build\include; %windir%\sysnative\cmd.exe /c "$(SolutionDir)\Utilities\git-version-gen.cmd" diff --git a/rpcs3_llvm.props b/rpcs3_llvm.props index 9e95717589..3f25f31895 100644 --- a/rpcs3_llvm.props +++ b/rpcs3_llvm.props @@ -5,13 +5,13 @@ - LLVM_AVAILABLE;%(PreprocessorDefinitions) + POLLY_AVAILABLE;LLVM_AVAILABLE;%(PreprocessorDefinitions) ..\llvm_build\Debug\lib - ..\llvm_build\Release\lib - 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 + ..\llvm_build\Release\lib;..\llvm_build\lib\Release + 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 - \ No newline at end of file +