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/appveyor.yml b/appveyor.yml index 889dcc6765..8318ecb264 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -49,7 +49,8 @@ before_build: - set BRANCH=%APPVEYOR_REPO_NAME%/%APPVEYOR_REPO_BRANCH%/#%APPVEYOR_PULL_REQUEST_NUMBER% - if "%APPVEYOR_PULL_REQUEST_NUMBER%"=="" (set BRANCH=%APPVEYOR_REPO_NAME%/%APPVEYOR_REPO_BRANCH%) - set PATH=%PATH%;%QTDIR% - - if not exist llvmlibs.7z appveyor DownloadFile "https://drive.google.com/uc?export=download&id=0B8A6NaxhQAGRY2k3Q2Yya05lcm8" -FileName llvmlibs.7z + - if not exist llvmlibs.7z appveyor DownloadFile "https://ci.appveyor.com/api/buildjobs/1w8r1n6nh2w99aul/artifacts/llvmlibs.7z.zip" -FileName llvmlibs.7z.zip + - 7z x llvmlibs.7z.zip > null - 7z x llvmlibs.7z -aos -o%APPVEYOR_BUILD_FOLDER% > null - if not exist vulkan.7z appveyor DownloadFile "https://drive.google.com/uc?export=download&id=1A2eOMmCO714i0U7J0qI4aEMKnuWl8l_R" -FileName vulkan.7z - 7z x vulkan.7z -aos -o"%APPVEYOR_BUILD_FOLDER%\lib\%CONFIGURATION%-%PLATFORM%" > null diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index 3e0b8d0ef2..24846a6eac 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 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 1fe24516b6..fc48dcc325 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 @@ -1462,6 +1468,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; { @@ -1479,6 +1490,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 e3f535c1f3..1aba61b092 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -16,7 +16,7 @@ PPUTranslator::PPUTranslator(LLVMContext& context, Module* module, const ppu_mod , m_module(module) , m_is_be(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 cefabf306e..d8ff09ec99 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.h +++ b/rpcs3/Emu/Cell/PPUTranslator.h @@ -120,7 +120,7 @@ class PPUTranslator final //: public CPUTranslator 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; // IR builder llvm::IRBuilder<>* m_ir; @@ -404,7 +404,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...}); @@ -414,7 +414,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 c8f7d277de..1df85a3734 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 +