From cef020cdfa4e41add1282dd1aaa9c072050efb7a Mon Sep 17 00:00:00 2001 From: Yu Kobayashi Date: Sat, 4 Apr 2020 05:47:40 +0900 Subject: [PATCH 1/3] LLVM Polly optimizer support --- llvm/cppbuild.sh | 18 +- .../{ => Clang}/ClangASTVisitorExample.java | 0 .../{ => Clang}/ClangCodeCompleteExample.java | 0 .../ClangCompileDatabaseExample.java | 0 .../{ => Clang}/ClangDiagnosisExample.java | 0 .../{ => Clang}/ClangTokenizeExample.java | 0 llvm/samples/{ => Clang}/sample1.cc | 0 llvm/samples/{ => Clang}/sample2.cc | 0 llvm/samples/{ => Clang}/sample3.cc | 0 llvm/samples/{ => Fac}/Fac.java | 0 llvm/samples/{ => Fac}/pom.xml | 0 .../MatMulBenchmark/MatMulBenchmark.java | 299 ++++++++++++++++++ llvm/samples/MatMulBenchmark/pom.xml | 27 ++ .../java/org/bytedeco/llvm/presets/LLVM.java | 8 +- .../java/org/bytedeco/llvm/presets/clang.java | 2 +- 15 files changed, 347 insertions(+), 7 deletions(-) mode change 100755 => 100644 llvm/cppbuild.sh rename llvm/samples/{ => Clang}/ClangASTVisitorExample.java (100%) rename llvm/samples/{ => Clang}/ClangCodeCompleteExample.java (100%) rename llvm/samples/{ => Clang}/ClangCompileDatabaseExample.java (100%) rename llvm/samples/{ => Clang}/ClangDiagnosisExample.java (100%) rename llvm/samples/{ => Clang}/ClangTokenizeExample.java (100%) rename llvm/samples/{ => Clang}/sample1.cc (100%) rename llvm/samples/{ => Clang}/sample2.cc (100%) rename llvm/samples/{ => Clang}/sample3.cc (100%) rename llvm/samples/{ => Fac}/Fac.java (100%) rename llvm/samples/{ => Fac}/pom.xml (100%) create mode 100644 llvm/samples/MatMulBenchmark/MatMulBenchmark.java create mode 100644 llvm/samples/MatMulBenchmark/pom.xml diff --git a/llvm/cppbuild.sh b/llvm/cppbuild.sh old mode 100755 new mode 100644 index db665d6db5c..af0975e31ea --- a/llvm/cppbuild.sh +++ b/llvm/cppbuild.sh @@ -10,6 +10,7 @@ fi LLVM_VERSION=10.0.0 download https://github.com/llvm/llvm-project/releases/download/llvmorg-$LLVM_VERSION/llvm-$LLVM_VERSION.src.tar.xz llvm-$LLVM_VERSION.src.tar.xz download https://github.com/llvm/llvm-project/releases/download/llvmorg-$LLVM_VERSION/clang-$LLVM_VERSION.src.tar.xz clang-$LLVM_VERSION.src.tar.xz +download https://github.com/llvm/llvm-project/releases/download/llvmorg-$LLVM_VERSION/polly-$LLVM_VERSION.src.tar.xz polly-$LLVM_VERSION.src.tar.xz mkdir -p $PLATFORM cd $PLATFORM @@ -22,6 +23,9 @@ cd tools tar --totals -xf ../../../clang-$LLVM_VERSION.src.tar.xz || tar --totals -xf ../../../clang-$LLVM_VERSION.src.tar.xz rm -Rf clang mv clang-$LLVM_VERSION.src clang +tar --totals -xf ../../../polly-$LLVM_VERSION.src.tar.xz || tar --totals -xf ../../../polly-$LLVM_VERSION.src.tar.xz +rm -Rf polly +mv polly-$LLVM_VERSION.src polly sedinplace '/Generating libLLVM is not supported on MSVC/d' llvm-shlib/CMakeLists.txt cd ../build @@ -32,6 +36,7 @@ case $PLATFORM in $CMAKE -DLLVM_CCACHE_BUILD=ON -DCMAKE_INSTALL_PREFIX=../.. -DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=host -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_INCLUDE_TESTS=OFF .. make -j $MAKEJ make install > /dev/null + cp lib/LLVMPolly.so ../../lib/libLLVMPolly.so ;; linux-x86_64) export CC="gcc -m64" @@ -39,6 +44,7 @@ case $PLATFORM in $CMAKE -DLLVM_CCACHE_BUILD=ON -DCMAKE_INSTALL_PREFIX=../.. -DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=host -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_INCLUDE_TESTS=OFF .. make -j $MAKEJ make install > /dev/null + cp lib/LLVMPolly.so ../../lib/libLLVMPolly.so ;; linux-armhf) mkdir -p ../tblgen @@ -50,6 +56,7 @@ case $PLATFORM in CC="arm-linux-gnueabihf-gcc" CXX="arm-linux-gnueabihf-g++" $CMAKE -DCMAKE_EXE_LINKER_FLAGS="-ldl" -DCMAKE_SHARED_LINKER_FLAGS="-ldl" -DLLVM_CCACHE_BUILD=ON -DCMAKE_CROSSCOMPILING=True -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON -DCMAKE_INSTALL_PREFIX=../.. -DLLVM_TABLEGEN="$TBLGEN/bin/llvm-tblgen" -DCLANG_TABLEGEN="$TBLGEN/bin/clang-tblgen" -DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON -DCMAKE_BUILD_TYPE=Release -DLLVM_HOST_TRIPLE=arm-unknown-linux-gnueabihf -DLLVM_DEFAULT_TARGET_TRIPLE=arm-unknown-linux-gnueabihf -DLLVM_TARGET_ARCH=ARM -DLLVM_TARGETS_TO_BUILD=ARM -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_INCLUDE_TESTS=OFF .. make -j $MAKEJ make install > /dev/null + cp lib/LLVMPolly.so ../../lib/libLLVMPolly.so ;; linux-arm64) mkdir -p ../tblgen @@ -61,6 +68,7 @@ case $PLATFORM in CC="aarch64-linux-gnu-gcc" CXX="aarch64-linux-gnu-g++" $CMAKE -DLLVM_CCACHE_BUILD=ON -DCMAKE_CROSSCOMPILING=True -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON -DCMAKE_INSTALL_PREFIX=../.. -DLLVM_TABLEGEN="$TBLGEN/bin/llvm-tblgen" -DCLANG_TABLEGEN="$TBLGEN/bin/clang-tblgen" -DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON -DCMAKE_BUILD_TYPE=Release -DLLVM_HOST_TRIPLE=aarch64-unknown-linux-gnu -DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-unknown-linux-gnu -DLLVM_TARGET_ARCH=AArch64 -DLLVM_TARGETS_TO_BUILD=AArch64 -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_INCLUDE_TESTS=OFF .. make -j $MAKEJ make install > /dev/null + cp lib/LLVMPolly.so ../../lib/libLLVMPolly.so ;; linux-ppc64le) mkdir -p ../tblgen @@ -72,20 +80,22 @@ case $PLATFORM in CC="powerpc64le-linux-gnu-gcc" CXX="powerpc64le-linux-gnu-g++" $CMAKE -DLLVM_CCACHE_BUILD=ON -DCMAKE_CROSSCOMPILING=True -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON -DCMAKE_INSTALL_PREFIX=../.. -DLLVM_TABLEGEN="$TBLGEN/bin/llvm-tblgen" -DCLANG_TABLEGEN="$TBLGEN/bin/clang-tblgen" -DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON -DCMAKE_BUILD_TYPE=Release -DLLVM_HOST_TRIPLE=powerpc64le-unknown-linux-gnu -DLLVM_DEFAULT_TARGET_TRIPLE=powerpc64le-unknown-linux-gnu -DLLVM_TARGET_ARCH=PowerPC -DLLVM_TARGETS_TO_BUILD=PowerPC -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_INCLUDE_TESTS=OFF .. make -j $MAKEJ make install > /dev/null + cp lib/LLVMPolly.so ../../lib/libLLVMPolly.so ;; macosx-*) $CMAKE -DLLVM_CCACHE_BUILD=ON -DCMAKE_INSTALL_PREFIX=../.. -DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=host -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_INCLUDE_TESTS=OFF .. make -j $MAKEJ make install > /dev/null + cp lib/LLVMPolly.so ../../lib/libLLVMPolly.so ;; windows-x86) - $CMAKE -G "Visual Studio 15 2017" -DLLVM_BUILD_LLVM_C_DYLIB=OFF -DCMAKE_EXE_LINKER_FLAGS="/FORCE:MULTIPLE" -DCMAKE_SHARED_LINKER_FLAGS="/FORCE:MULTIPLE" -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON -DLLVM_USE_CRT_RELEASE=MD -DCMAKE_INSTALL_PREFIX=../.. -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=host -DLLVM_ENABLE_DIA_SDK=OFF -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_INCLUDE_TESTS=OFF -DPYTHON_EXECUTABLE="C:/Python27/python.exe" .. + $CMAKE -G "Visual Studio 15 2017" -DLLVM_BUILD_LLVM_C_DYLIB=OFF -DCMAKE_EXE_LINKER_FLAGS="/FORCE:MULTIPLE" -DCMAKE_SHARED_LINKER_FLAGS="/FORCE:MULTIPLE" -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON -DLLVM_USE_CRT_RELEASE=MD -DCMAKE_INSTALL_PREFIX=../.. -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=host -DLLVM_ENABLE_DIA_SDK=OFF -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_INCLUDE_TESTS=OFF -DPYTHON_EXECUTABLE="C:/Python27/python.exe" -DLLVM_POLLY_LINK_INTO_TOOLS=ON .. MSBuild.exe INSTALL.vcxproj //p:Configuration=Release //p:CL_MPCount=$MAKEJ cd Release/lib/ [ -f LLVM.lib ] || lib.exe /OUT:LLVM.lib LLVM*.lib [ -f clang.lib ] || lib.exe /OUT:clang.lib clang*.lib cd ../.. - $CMAKE -G "Visual Studio 15 2017" -DLLVM_USE_CRT_RELEASE=MD -DCMAKE_INSTALL_PREFIX=../.. -DLLVM_BUILD_LLVM_C_DYLIB=OFF -DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=host -DLLVM_ENABLE_DIA_SDK=OFF -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_INCLUDE_TESTS=OFF -DPYTHON_EXECUTABLE="C:/Python27/python.exe" .. + $CMAKE -G "Visual Studio 15 2017" -DLLVM_USE_CRT_RELEASE=MD -DCMAKE_INSTALL_PREFIX=../.. -DLLVM_BUILD_LLVM_C_DYLIB=OFF -DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=host -DLLVM_ENABLE_DIA_SDK=OFF -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_INCLUDE_TESTS=OFF -DPYTHON_EXECUTABLE="C:/Python27/python.exe" -DLLVM_POLLY_LINK_INTO_TOOLS=ON .. MSBuild.exe INSTALL.vcxproj //p:Configuration=Release //p:CL_MPCount=$MAKEJ cd ../../lib [ -f LLVM.lib ] || lib.exe /OUT:LLVM.lib LLVM*.lib @@ -94,13 +104,13 @@ case $PLATFORM in cd ../llvm-$LLVM_VERSION.src/build ;; windows-x86_64) - $CMAKE -G "Visual Studio 15 2017 Win64" -DLLVM_BUILD_LLVM_C_DYLIB=OFF -DCMAKE_EXE_LINKER_FLAGS="/FORCE:MULTIPLE" -DCMAKE_SHARED_LINKER_FLAGS="/FORCE:MULTIPLE" -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON -Thost=x64 -DLLVM_USE_CRT_RELEASE=MD -DCMAKE_INSTALL_PREFIX=../.. -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=host -DLLVM_ENABLE_DIA_SDK=OFF -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_INCLUDE_TESTS=OFF -DPYTHON_EXECUTABLE="C:/Python27/python.exe" .. + $CMAKE -G "Visual Studio 15 2017 Win64" -DLLVM_BUILD_LLVM_C_DYLIB=OFF -DCMAKE_EXE_LINKER_FLAGS="/FORCE:MULTIPLE" -DCMAKE_SHARED_LINKER_FLAGS="/FORCE:MULTIPLE" -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON -Thost=x64 -DLLVM_USE_CRT_RELEASE=MD -DCMAKE_INSTALL_PREFIX=../.. -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=host -DLLVM_ENABLE_DIA_SDK=OFF -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_INCLUDE_TESTS=OFF -DPYTHON_EXECUTABLE="C:/Python27/python.exe" -DLLVM_POLLY_LINK_INTO_TOOLS=ON .. MSBuild.exe INSTALL.vcxproj //p:Configuration=Release //p:CL_MPCount=$MAKEJ cd Release/lib/ [ -f LLVM.lib ] || lib.exe /OUT:LLVM.lib LLVM*.lib [ -f clang.lib ] || lib.exe /OUT:clang.lib clang*.lib cd ../.. - $CMAKE -G "Visual Studio 15 2017 Win64" -Thost=x64 -DLLVM_USE_CRT_RELEASE=MD -DCMAKE_INSTALL_PREFIX=../.. -DLLVM_BUILD_LLVM_C_DYLIB=OFF -DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=host -DLLVM_ENABLE_DIA_SDK=OFF -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_INCLUDE_TESTS=OFF -DPYTHON_EXECUTABLE="C:/Python27/python.exe" .. + $CMAKE -G "Visual Studio 15 2017 Win64" -Thost=x64 -DLLVM_USE_CRT_RELEASE=MD -DCMAKE_INSTALL_PREFIX=../.. -DLLVM_BUILD_LLVM_C_DYLIB=OFF -DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=host -DLLVM_ENABLE_DIA_SDK=OFF -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_INCLUDE_TESTS=OFF -DPYTHON_EXECUTABLE="C:/Python27/python.exe" -DLLVM_POLLY_LINK_INTO_TOOLS=ON .. MSBuild.exe INSTALL.vcxproj //p:Configuration=Release //p:CL_MPCount=$MAKEJ cd ../../lib [ -f LLVM.lib ] || lib.exe /OUT:LLVM.lib LLVM*.lib diff --git a/llvm/samples/ClangASTVisitorExample.java b/llvm/samples/Clang/ClangASTVisitorExample.java similarity index 100% rename from llvm/samples/ClangASTVisitorExample.java rename to llvm/samples/Clang/ClangASTVisitorExample.java diff --git a/llvm/samples/ClangCodeCompleteExample.java b/llvm/samples/Clang/ClangCodeCompleteExample.java similarity index 100% rename from llvm/samples/ClangCodeCompleteExample.java rename to llvm/samples/Clang/ClangCodeCompleteExample.java diff --git a/llvm/samples/ClangCompileDatabaseExample.java b/llvm/samples/Clang/ClangCompileDatabaseExample.java similarity index 100% rename from llvm/samples/ClangCompileDatabaseExample.java rename to llvm/samples/Clang/ClangCompileDatabaseExample.java diff --git a/llvm/samples/ClangDiagnosisExample.java b/llvm/samples/Clang/ClangDiagnosisExample.java similarity index 100% rename from llvm/samples/ClangDiagnosisExample.java rename to llvm/samples/Clang/ClangDiagnosisExample.java diff --git a/llvm/samples/ClangTokenizeExample.java b/llvm/samples/Clang/ClangTokenizeExample.java similarity index 100% rename from llvm/samples/ClangTokenizeExample.java rename to llvm/samples/Clang/ClangTokenizeExample.java diff --git a/llvm/samples/sample1.cc b/llvm/samples/Clang/sample1.cc similarity index 100% rename from llvm/samples/sample1.cc rename to llvm/samples/Clang/sample1.cc diff --git a/llvm/samples/sample2.cc b/llvm/samples/Clang/sample2.cc similarity index 100% rename from llvm/samples/sample2.cc rename to llvm/samples/Clang/sample2.cc diff --git a/llvm/samples/sample3.cc b/llvm/samples/Clang/sample3.cc similarity index 100% rename from llvm/samples/sample3.cc rename to llvm/samples/Clang/sample3.cc diff --git a/llvm/samples/Fac.java b/llvm/samples/Fac/Fac.java similarity index 100% rename from llvm/samples/Fac.java rename to llvm/samples/Fac/Fac.java diff --git a/llvm/samples/pom.xml b/llvm/samples/Fac/pom.xml similarity index 100% rename from llvm/samples/pom.xml rename to llvm/samples/Fac/pom.xml diff --git a/llvm/samples/MatMulBenchmark/MatMulBenchmark.java b/llvm/samples/MatMulBenchmark/MatMulBenchmark.java new file mode 100644 index 00000000000..1e0fe0e54f8 --- /dev/null +++ b/llvm/samples/MatMulBenchmark/MatMulBenchmark.java @@ -0,0 +1,299 @@ +import org.bytedeco.javacpp.BytePointer; +import org.bytedeco.javacpp.Pointer; +import org.bytedeco.javacpp.PointerPointer; +import org.bytedeco.llvm.LLVM.*; + +import java.util.Random; + +import static org.bytedeco.llvm.global.LLVM.*; + +/** + * Matrix multiply benchmark. + * + * To run this sample run this command. + * mvn compile exec:java + * + * If you enable usePollyParallel, maybe you have to modify the file name of LLVMLoadLibraryPermanently(). + * + * Warning: This code is slower than this. + * clang -O3 -march=native -mllvm -polly -mllvm -polly-vectorizer=stripmine + */ +public class MatMulBenchmark { + static final int M = 2000, N = 2000, K = 2000; + static final boolean usePolly = true; + static final boolean usePollyParallel = false; + static final boolean printResult = false; + + static LLVMTypeRef llvmVoidType; + static LLVMTypeRef llvmInt32Type; + static LLVMTypeRef llvmFloatType; + static LLVMTypeRef llvmFloatPointerType; + + public static void main(String[] args) { + float[] a = createRandomArray(M, K); + float[] b = createRandomArray(K, N); + float[] c = new float[M * N]; + + initialize(); + + benchmarkLLVM(a, b, c); + benchmarkPureJava(a, b, c); + } + + static void benchmarkPureJava(float[] a, float[] b, float[] c) { + assert a.length == M * K; + assert b.length == K * N; + assert c.length == M * N; + + System.out.println("Now starting pure Java benchmark. This takes a few minutes."); + long start = System.nanoTime(); + for (int m = 0; m < M; m++) { + for (int n = 0; n < N; n++) { + float s = 0; + for (int k = 0; k < K; k++) { + s += a[m * K + k] * b[k * N + n]; + } + c[m * N + n] = s; + } + } + long end = System.nanoTime(); + System.out.printf("Pure Java: %fms. c[0] = %f\n", (end - start) / (1000d * 1000d), c[0]); + printArray(c); + } + + static void initialize() { + if (usePolly) { + if (usePollyParallel) { + LLVMLoadLibraryPermanently("libgomp.so.1"); // This file name depends on your machine + setLLVMCommandLineOptions("", + "-mllvm", "-polly", + "-mllvm", "-polly-parallel", + "-mllvm", "-polly-vectorizer=stripmine"); + } else { + setLLVMCommandLineOptions("", + "-mllvm", "-polly", + "-mllvm", "-polly-vectorizer=stripmine"); + } + } + + LLVMLinkInMCJIT(); + LLVMInitializeNativeAsmPrinter(); + LLVMInitializeNativeAsmParser(); + LLVMInitializeNativeDisassembler(); + LLVMInitializeNativeTarget(); + + llvmVoidType = LLVMVoidType(); + llvmInt32Type = LLVMInt32Type(); + llvmFloatType = LLVMFloatType(); + llvmFloatPointerType = LLVMPointerType(llvmFloatType, 0); + } + + static void benchmarkLLVM(float[] a, float[] b, float[] c) { + assert a.length == M * K; + assert b.length == K * N; + assert c.length == M * N; + + LLVMExecutionEngineRef engine = new LLVMExecutionEngineRef(); + try { + LLVMModuleRef module = build(); + optimize(module); + verify(module, false); + jitCompile(engine, module); + + long fnAddr = LLVMGetFunctionAddress(engine, "matmul"); + com.sun.jna.Function func = com.sun.jna.Function.getFunction(new com.sun.jna.Pointer(fnAddr)); + long start = System.nanoTime(); + func.invoke(Void.class, new Object[]{a, b, c}); + long end = System.nanoTime(); + System.out.printf("LLVM%s: %fms. c[0] = %f\n", + usePolly ? " with Polly" : " without Polly", + (end - start) / (1000d * 1000d), + c[0]); + printArray(c); + } finally { + LLVMDisposeExecutionEngine(engine); + } + } + + static LLVMModuleRef build() { + LLVMBuilderRef builder = LLVMCreateBuilder(); + + LLVMModuleRef module = LLVMModuleCreateWithName("matmulModule"); + + // Create function + LLVMTypeRef funcType = LLVMFunctionType( + llvmVoidType, + new PointerPointer<>(llvmFloatPointerType, llvmFloatPointerType, llvmFloatPointerType), + 3, + 0); + LLVMValueRef func = LLVMAddFunction(module, "matmul", funcType); + LLVMSetFunctionCallConv(func, LLVMCCallConv); + + LLVMValueRef paramA = LLVMGetParam(func, 0); + LLVMValueRef paramB = LLVMGetParam(func, 1); + LLVMValueRef paramC = LLVMGetParam(func, 2); + + // entry basic block + LLVMBasicBlockRef entryBB = LLVMAppendBasicBlock(func, "entry"); + LLVMPositionBuilderAtEnd(builder, entryBB); + + // loop M basic block + LLVMBasicBlockRef loopMBB = LLVMAppendBasicBlock(func, "loopM"); + LLVMBuildBr(builder, loopMBB); + LLVMPositionBuilderAtEnd(builder, loopMBB); + + // loop M index variable + LLVMValueRef loopMIdx = LLVMBuildPhi(builder, llvmInt32Type, "m"); + LLVMAddIncoming(loopMIdx, toConstInt(0), entryBB, 1); + + // loop N basic block + LLVMBasicBlockRef loopNBB = LLVMAppendBasicBlock(func, "loopN"); + LLVMBuildBr(builder, loopNBB); + LLVMPositionBuilderAtEnd(builder, loopNBB); + + // loop N index variable + LLVMValueRef loopNIdx = LLVMBuildPhi(builder, llvmInt32Type, "n"); + LLVMAddIncoming(loopNIdx, toConstInt(0), loopMBB, 1); + + // loop K basic block + LLVMBasicBlockRef loopKBB = LLVMAppendBasicBlock(func, "loopK"); + LLVMBuildBr(builder, loopKBB); + LLVMPositionBuilderAtEnd(builder, loopKBB); + + // loop K index variable + LLVMValueRef loopKIdx = LLVMBuildPhi(builder, llvmInt32Type, "k"); + LLVMAddIncoming(loopKIdx, toConstInt(0), loopNBB, 1); + + // s = 0 + LLVMValueRef s = LLVMBuildPhi(builder, llvmFloatType, "s"); + LLVMAddIncoming(s, toConstFloat(0), loopNBB, 1); + + // s += a[m * K + k] * b[k * N + n] + LLVMValueRef mMulK = LLVMBuildMul(builder, loopMIdx, toConstInt(K), "m * K"); + LLVMValueRef mMulKAddK = LLVMBuildAdd(builder, mMulK, loopKIdx, "m * K + k"); + LLVMValueRef aAryPtr = LLVMBuildInBoundsGEP(builder, paramA, mMulKAddK, 1, new BytePointer("&a[m * K + k]")); + LLVMValueRef aAryValue = LLVMBuildLoad(builder, aAryPtr, "a[m * K + k]"); + LLVMValueRef kMulN = LLVMBuildMul(builder, loopKIdx, toConstInt(N), "k * N"); + LLVMValueRef kMulNAddN = LLVMBuildAdd(builder, kMulN, loopNIdx, "k * N + n"); + LLVMValueRef bAryPtr = LLVMBuildInBoundsGEP(builder, paramB, kMulNAddN, 1, new BytePointer("&b[k * N + n]")); + LLVMValueRef bAryValue = LLVMBuildLoad(builder, bAryPtr, "b[k * N + n]"); + LLVMValueRef aMulB = LLVMBuildFMul(builder, aAryValue, bAryValue, "a[m * K + k] * b[k * N + n]"); + LLVMValueRef sAddAMulB = LLVMBuildFAdd(builder, s, aMulB, "s + a[m * K + k] * b[k * N + n]"); + + // k++ + LLVMValueRef nextLoopKIdx = LLVMBuildAdd(builder, loopKIdx, toConstInt(1), "k + 1"); + + // k == K + LLVMValueRef kEndCond = LLVMBuildICmp(builder, LLVMIntEQ, nextLoopKIdx, toConstInt(K), "k == K"); + + LLVMBasicBlockRef loopKEndBB = LLVMGetInsertBlock(builder); + LLVMBasicBlockRef afterKBB = LLVMAppendBasicBlock(func, "afterK"); + LLVMBuildCondBr(builder, kEndCond, afterKBB, loopKBB); + LLVMPositionBuilderAtEnd(builder, afterKBB); + LLVMAddIncoming(loopKIdx, nextLoopKIdx, loopKEndBB, 1); + LLVMAddIncoming(s, sAddAMulB, loopKEndBB, 1); + + // c[m * N + n] = s + LLVMValueRef mMulN = LLVMBuildMul(builder, loopMIdx, toConstInt(N), "m * N"); + LLVMValueRef mMulNAddN = LLVMBuildAdd(builder, mMulN, loopNIdx, "m * N + n"); + LLVMValueRef cAryPtr = LLVMBuildInBoundsGEP(builder, paramC, mMulNAddN, 1, new BytePointer("&c[m * N + n]")); + LLVMBuildStore(builder, sAddAMulB, cAryPtr); + + // n++ + LLVMValueRef nextLoopNIdx = LLVMBuildAdd(builder, loopNIdx, toConstInt(1), "n + 1"); + + // n == N + LLVMValueRef nEndCond = LLVMBuildICmp(builder, LLVMIntEQ, nextLoopNIdx, toConstInt(N), "n == N"); + + LLVMBasicBlockRef loopNEndBB = LLVMGetInsertBlock(builder); + LLVMBasicBlockRef afterNBB = LLVMAppendBasicBlock(func, "afterN"); + LLVMBuildCondBr(builder, nEndCond, afterNBB, loopNBB); + LLVMPositionBuilderAtEnd(builder, afterNBB); + LLVMAddIncoming(loopNIdx, nextLoopNIdx, loopNEndBB, 1); + + // m++ + LLVMValueRef nextLoopMIdx = LLVMBuildAdd(builder, loopMIdx, toConstInt(1), "m + 1"); + + // m == M + LLVMValueRef mEndCond = LLVMBuildICmp(builder, LLVMIntEQ, nextLoopMIdx, toConstInt(M), "m == M"); + + LLVMBasicBlockRef loopMEndBB = LLVMGetInsertBlock(builder); + LLVMBasicBlockRef afterMBB = LLVMAppendBasicBlock(func, "afterM"); + LLVMBuildCondBr(builder, mEndCond, afterMBB, loopMBB); + LLVMPositionBuilderAtEnd(builder, afterMBB); + LLVMAddIncoming(loopMIdx, nextLoopMIdx, loopMEndBB, 1); + + // return + LLVMBuildRetVoid(builder); + + LLVMDisposeBuilder(builder); + + return module; + } + + static void optimize(LLVMModuleRef module) { + LLVMPassManagerBuilderRef pmb = LLVMPassManagerBuilderCreate(); + LLVMPassManagerBuilderSetOptLevel(pmb, 3); + LLVMPassManagerRef pass = LLVMCreatePassManager(); + LLVMPassManagerBuilderPopulateModulePassManager(pmb, pass); + + LLVMRunPassManager(pass, module); + + LLVMDisposePassManager(pass); + LLVMPassManagerBuilderDispose(pmb); + } + + static void verify(LLVMModuleRef module, boolean dumpModule) { + BytePointer error = new BytePointer((Pointer) null); + try { + if (dumpModule) { + LLVMDumpModule(module); + } + if (LLVMVerifyModule(module, LLVMAbortProcessAction, error) != 0) { + throw new RuntimeException(error.getString()); + } + } finally { + LLVMDisposeMessage(error); + } + } + + static void jitCompile(LLVMExecutionEngineRef engine, LLVMModuleRef module) { + BytePointer error = new BytePointer((Pointer) null); + try { + if (LLVMCreateJITCompilerForModule(engine, module, 3, error) != 0) { + throw new RuntimeException(error.getString()); + } + } finally { + LLVMDisposeMessage(error); + } + } + + static LLVMValueRef toConstInt(int v) { + return LLVMConstInt(llvmInt32Type, v, 0); + } + + static LLVMValueRef toConstFloat(float v) { + return LLVMConstReal(llvmFloatType, v); + } + + static void setLLVMCommandLineOptions(String... args) { + LLVMParseCommandLineOptions(args.length, new PointerPointer<>(args), null); + } + + static float[] createRandomArray(int m, int n) { + Random rand = new Random(); + float[] ary = new float[m * n]; + for (int i = 0; i < ary.length; i++) { + ary[i] = rand.nextFloat(); + } + return ary; + } + + static void printArray(float[] ary) { + if (printResult) { + for (float v : ary) { + System.out.println(v); + } + } + } +} diff --git a/llvm/samples/MatMulBenchmark/pom.xml b/llvm/samples/MatMulBenchmark/pom.xml new file mode 100644 index 00000000000..0ece2fc9d7e --- /dev/null +++ b/llvm/samples/MatMulBenchmark/pom.xml @@ -0,0 +1,27 @@ + + 4.0.0 + org.bytedeco.llvm + MatMulBenchmark + 1.5.3-SNAPSHOT + + MatMulBenchmark + 1.8 + ${java.version} + ${java.version} + + + + org.bytedeco + llvm-platform + 10.0.0-1.5.3-SNAPSHOT + + + net.java.dev.jna + jna + 5.5.0 + + + + . + + diff --git a/llvm/src/main/java/org/bytedeco/llvm/presets/LLVM.java b/llvm/src/main/java/org/bytedeco/llvm/presets/LLVM.java index 9d101f194f7..344355f6493 100644 --- a/llvm/src/main/java/org/bytedeco/llvm/presets/LLVM.java +++ b/llvm/src/main/java/org/bytedeco/llvm/presets/LLVM.java @@ -34,8 +34,11 @@ "", "", "", "", "", "", "", "", "", "", "", "", "", "", - "", "", "", "", ""}, - compiler = "cpp11", link = {"LLVM-10", "LTO@.10"}), @Platform(value = {"macosx", "windows"}, link = {"LTO", "LLVM"}) }) + "", "", "", "", "", + ""}, + compiler = "cpp14", link = {"LLVM-10", "LTO@.10", "LLVMPolly"}), + @Platform(value = {"macosx"}, link = {"LTO", "LLVM", "LLVMPolly"}), + @Platform(value = {"windows"}, link = {"LTO", "LLVM", "Polly", "PollyISL"})}) public class LLVM implements InfoMapper { static { Loader.checkVersion("org.bytedeco", "llvm"); } @@ -132,6 +135,7 @@ public void map(InfoMap infoMap) { .put(new Info("HUGE_VALF").cppTypes("float").translate(false)) .put(new Info("LLVMErrorTypeId").annotations("@Const").valueTypes("LLVMErrorTypeId")) .put(new Info("defined(_MSC_VER) && !defined(inline)").define(false)) + .put(new Info("GPU_CODEGEN").define(false)) .put(new Info("LLVMDumpType", "LLVMConstGEP2", "LLVMConstInBoundsGEP2", "LLVMCreateOprofileJITEventListener", "llvm_optimize_modules", "llvm_destroy_optimizer", "llvm_read_object_file", "llvm_create_optimizer", "LLVMRemarkVersion").skip()); } diff --git a/llvm/src/main/java/org/bytedeco/llvm/presets/clang.java b/llvm/src/main/java/org/bytedeco/llvm/presets/clang.java index 84329f630e7..23feec57dca 100644 --- a/llvm/src/main/java/org/bytedeco/llvm/presets/clang.java +++ b/llvm/src/main/java/org/bytedeco/llvm/presets/clang.java @@ -29,7 +29,7 @@ value = {"linux", "macosx", "windows"}, include = {"", "", "", "", "", "", ""}, - compiler = "cpp11", link = "clang@.10"), @Platform(value = "windows", link = "libclang") }) + compiler = "cpp14", link = "clang@.10"), @Platform(value = "windows", link = "libclang") }) public class clang implements InfoMapper { public void map(InfoMap infoMap) { infoMap.put(new Info("LLVM_CLANG_C_EXTERN_C_BEGIN").cppText("#define LLVM_CLANG_C_EXTERN_C_BEGIN").cppTypes()) From c6ee1d2b11fd743ed3a2f2f5b7b522b59266c9cd Mon Sep 17 00:00:00 2001 From: Samuel Audet Date: Mon, 6 Apr 2020 00:17:41 +0900 Subject: [PATCH 2/3] Fix build on Mac --- llvm/src/main/java/org/bytedeco/llvm/presets/LLVM.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/llvm/src/main/java/org/bytedeco/llvm/presets/LLVM.java b/llvm/src/main/java/org/bytedeco/llvm/presets/LLVM.java index 344355f6493..437b66c972d 100644 --- a/llvm/src/main/java/org/bytedeco/llvm/presets/LLVM.java +++ b/llvm/src/main/java/org/bytedeco/llvm/presets/LLVM.java @@ -37,8 +37,7 @@ "", "", "", "", "", ""}, compiler = "cpp14", link = {"LLVM-10", "LTO@.10", "LLVMPolly"}), - @Platform(value = {"macosx"}, link = {"LTO", "LLVM", "LLVMPolly"}), - @Platform(value = {"windows"}, link = {"LTO", "LLVM", "Polly", "PollyISL"})}) + @Platform(value = {"macosx", "windows"}, link = {"LLVM", "LTO", "Polly", "PollyISL", "PollyPPCG"})}) public class LLVM implements InfoMapper { static { Loader.checkVersion("org.bytedeco", "llvm"); } From cd910fb582fc10dd028953646e07a89215fb8969 Mon Sep 17 00:00:00 2001 From: Samuel Audet Date: Mon, 6 Apr 2020 23:38:08 +0900 Subject: [PATCH 3/3] Update CHANGELOG.md, rename samples subdirectories, and add note to sample --- CHANGELOG.md | 1 + .../ClangASTVisitorExample.java | 0 .../ClangCodeCompleteExample.java | 0 .../ClangCompileDatabaseExample.java | 0 .../ClangDiagnosisExample.java | 0 .../ClangTokenizeExample.java | 0 llvm/samples/clang/pom.xml | 19 +++++ llvm/samples/{Clang => clang}/sample1.cc | 0 llvm/samples/{Clang => clang}/sample2.cc | 0 llvm/samples/{Clang => clang}/sample3.cc | 0 llvm/samples/{Fac => llvm}/Fac.java | 0 llvm/samples/{Fac => llvm}/pom.xml | 0 .../MatMulBenchmark.java | 15 ++-- .../{MatMulBenchmark => polly}/pom.xml | 0 .../gen/java/org/bytedeco/llvm/LLVM/Pass.java | 19 +++++ .../org/bytedeco/llvm/LLVM/PassRegistry.java | 19 +++++ .../llvm/LLVM/PollyForcePassLinking.java | 13 +++ .../java/org/bytedeco/llvm/global/LLVM.java | 84 +++++++++++++++++++ 18 files changed, 165 insertions(+), 5 deletions(-) rename llvm/samples/{Clang => clang}/ClangASTVisitorExample.java (100%) rename llvm/samples/{Clang => clang}/ClangCodeCompleteExample.java (100%) rename llvm/samples/{Clang => clang}/ClangCompileDatabaseExample.java (100%) rename llvm/samples/{Clang => clang}/ClangDiagnosisExample.java (100%) rename llvm/samples/{Clang => clang}/ClangTokenizeExample.java (100%) create mode 100644 llvm/samples/clang/pom.xml rename llvm/samples/{Clang => clang}/sample1.cc (100%) rename llvm/samples/{Clang => clang}/sample2.cc (100%) rename llvm/samples/{Clang => clang}/sample3.cc (100%) rename llvm/samples/{Fac => llvm}/Fac.java (100%) rename llvm/samples/{Fac => llvm}/pom.xml (100%) rename llvm/samples/{MatMulBenchmark => polly}/MatMulBenchmark.java (94%) rename llvm/samples/{MatMulBenchmark => polly}/pom.xml (100%) create mode 100644 llvm/src/gen/java/org/bytedeco/llvm/LLVM/Pass.java create mode 100644 llvm/src/gen/java/org/bytedeco/llvm/LLVM/PassRegistry.java create mode 100644 llvm/src/gen/java/org/bytedeco/llvm/LLVM/PollyForcePassLinking.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 91be926ce49..b209eeecff7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ + * Add support for Polly optimizer to presets for LLVM ([pull #864](https://github.com/bytedeco/javacpp-presets/pull/864)) * Fix loading issue with `opencv_dnn_superres` ([issue bytedeco/javacv#1396](https://github.com/bytedeco/javacv/issues/1396)) * Add support for Windows to presets for TensorRT ([pull #860](https://github.com/bytedeco/javacpp-presets/pull/860)) * Add dependency on presets for `jnijavacpp` and `javacpp-platform` artifact to fix issues at load time ([issue bytedeco/javacv#1305](https://github.com/bytedeco/javacv/issues/1305)) diff --git a/llvm/samples/Clang/ClangASTVisitorExample.java b/llvm/samples/clang/ClangASTVisitorExample.java similarity index 100% rename from llvm/samples/Clang/ClangASTVisitorExample.java rename to llvm/samples/clang/ClangASTVisitorExample.java diff --git a/llvm/samples/Clang/ClangCodeCompleteExample.java b/llvm/samples/clang/ClangCodeCompleteExample.java similarity index 100% rename from llvm/samples/Clang/ClangCodeCompleteExample.java rename to llvm/samples/clang/ClangCodeCompleteExample.java diff --git a/llvm/samples/Clang/ClangCompileDatabaseExample.java b/llvm/samples/clang/ClangCompileDatabaseExample.java similarity index 100% rename from llvm/samples/Clang/ClangCompileDatabaseExample.java rename to llvm/samples/clang/ClangCompileDatabaseExample.java diff --git a/llvm/samples/Clang/ClangDiagnosisExample.java b/llvm/samples/clang/ClangDiagnosisExample.java similarity index 100% rename from llvm/samples/Clang/ClangDiagnosisExample.java rename to llvm/samples/clang/ClangDiagnosisExample.java diff --git a/llvm/samples/Clang/ClangTokenizeExample.java b/llvm/samples/clang/ClangTokenizeExample.java similarity index 100% rename from llvm/samples/Clang/ClangTokenizeExample.java rename to llvm/samples/clang/ClangTokenizeExample.java diff --git a/llvm/samples/clang/pom.xml b/llvm/samples/clang/pom.xml new file mode 100644 index 00000000000..187a04f5a7b --- /dev/null +++ b/llvm/samples/clang/pom.xml @@ -0,0 +1,19 @@ + + 4.0.0 + org.bytedeco.llvm + ClangASTVisitorExample + 1.5.3-SNAPSHOT + + ClangASTVisitorExample + + + + org.bytedeco + llvm-platform + 10.0.0-1.5.3-SNAPSHOT + + + + . + + diff --git a/llvm/samples/Clang/sample1.cc b/llvm/samples/clang/sample1.cc similarity index 100% rename from llvm/samples/Clang/sample1.cc rename to llvm/samples/clang/sample1.cc diff --git a/llvm/samples/Clang/sample2.cc b/llvm/samples/clang/sample2.cc similarity index 100% rename from llvm/samples/Clang/sample2.cc rename to llvm/samples/clang/sample2.cc diff --git a/llvm/samples/Clang/sample3.cc b/llvm/samples/clang/sample3.cc similarity index 100% rename from llvm/samples/Clang/sample3.cc rename to llvm/samples/clang/sample3.cc diff --git a/llvm/samples/Fac/Fac.java b/llvm/samples/llvm/Fac.java similarity index 100% rename from llvm/samples/Fac/Fac.java rename to llvm/samples/llvm/Fac.java diff --git a/llvm/samples/Fac/pom.xml b/llvm/samples/llvm/pom.xml similarity index 100% rename from llvm/samples/Fac/pom.xml rename to llvm/samples/llvm/pom.xml diff --git a/llvm/samples/MatMulBenchmark/MatMulBenchmark.java b/llvm/samples/polly/MatMulBenchmark.java similarity index 94% rename from llvm/samples/MatMulBenchmark/MatMulBenchmark.java rename to llvm/samples/polly/MatMulBenchmark.java index 1e0fe0e54f8..ae917ef986d 100644 --- a/llvm/samples/MatMulBenchmark/MatMulBenchmark.java +++ b/llvm/samples/polly/MatMulBenchmark.java @@ -10,13 +10,18 @@ /** * Matrix multiply benchmark. * - * To run this sample run this command. - * mvn compile exec:java + * To run this sample, execute this command: + * mvn clean compile exec:java -Djavacpp.platform.host * - * If you enable usePollyParallel, maybe you have to modify the file name of LLVMLoadLibraryPermanently(). + * If you set usePollyParallel, you may have to modify the file name of LLVMLoadLibraryPermanently(). * - * Warning: This code is slower than this. + * Warning: Because it does not optimize for AVX, etc, this code is slower than this: * clang -O3 -march=native -mllvm -polly -mllvm -polly-vectorizer=stripmine + * + * Note: Instead of JNA, to obtain maximum performance, FunctionPointer should be used as shown here: + * https://github.com/bytedeco/javacpp/blob/master/src/test/java/org/bytedeco/javacpp/PointerTest.java + * + * @author Yu Kobayashi */ public class MatMulBenchmark { static final int M = 2000, N = 2000, K = 2000; @@ -45,7 +50,7 @@ static void benchmarkPureJava(float[] a, float[] b, float[] c) { assert b.length == K * N; assert c.length == M * N; - System.out.println("Now starting pure Java benchmark. This takes a few minutes."); + System.out.println("Now starting pure Java benchmark: This may take a minute."); long start = System.nanoTime(); for (int m = 0; m < M; m++) { for (int n = 0; n < N; n++) { diff --git a/llvm/samples/MatMulBenchmark/pom.xml b/llvm/samples/polly/pom.xml similarity index 100% rename from llvm/samples/MatMulBenchmark/pom.xml rename to llvm/samples/polly/pom.xml diff --git a/llvm/src/gen/java/org/bytedeco/llvm/LLVM/Pass.java b/llvm/src/gen/java/org/bytedeco/llvm/LLVM/Pass.java new file mode 100644 index 00000000000..bc57a3da1cc --- /dev/null +++ b/llvm/src/gen/java/org/bytedeco/llvm/LLVM/Pass.java @@ -0,0 +1,19 @@ +// Targeted by JavaCPP version 1.5.3-SNAPSHOT: DO NOT EDIT THIS FILE + +package org.bytedeco.llvm.LLVM; + +import java.nio.*; +import org.bytedeco.javacpp.*; +import org.bytedeco.javacpp.annotation.*; + +import static org.bytedeco.javacpp.presets.javacpp.*; + +import static org.bytedeco.llvm.global.LLVM.*; + +@Namespace("llvm") @Opaque @Properties(inherit = org.bytedeco.llvm.presets.LLVM.class) +public class Pass extends Pointer { + /** Empty constructor. Calls {@code super((Pointer)null)}. */ + public Pass() { super((Pointer)null); } + /** Pointer cast constructor. Invokes {@link Pointer#Pointer(Pointer)}. */ + public Pass(Pointer p) { super(p); } +} diff --git a/llvm/src/gen/java/org/bytedeco/llvm/LLVM/PassRegistry.java b/llvm/src/gen/java/org/bytedeco/llvm/LLVM/PassRegistry.java new file mode 100644 index 00000000000..6901795856c --- /dev/null +++ b/llvm/src/gen/java/org/bytedeco/llvm/LLVM/PassRegistry.java @@ -0,0 +1,19 @@ +// Targeted by JavaCPP version 1.5.3-SNAPSHOT: DO NOT EDIT THIS FILE + +package org.bytedeco.llvm.LLVM; + +import java.nio.*; +import org.bytedeco.javacpp.*; +import org.bytedeco.javacpp.annotation.*; + +import static org.bytedeco.javacpp.presets.javacpp.*; + +import static org.bytedeco.llvm.global.LLVM.*; + +@Namespace("llvm") @Opaque @Properties(inherit = org.bytedeco.llvm.presets.LLVM.class) +public class PassRegistry extends Pointer { + /** Empty constructor. Calls {@code super((Pointer)null)}. */ + public PassRegistry() { super((Pointer)null); } + /** Pointer cast constructor. Invokes {@link Pointer#Pointer(Pointer)}. */ + public PassRegistry(Pointer p) { super(p); } +} diff --git a/llvm/src/gen/java/org/bytedeco/llvm/LLVM/PollyForcePassLinking.java b/llvm/src/gen/java/org/bytedeco/llvm/LLVM/PollyForcePassLinking.java new file mode 100644 index 00000000000..7a034a83e73 --- /dev/null +++ b/llvm/src/gen/java/org/bytedeco/llvm/LLVM/PollyForcePassLinking.java @@ -0,0 +1,13 @@ +// Targeted by JavaCPP version 1.5.3-SNAPSHOT: DO NOT EDIT THIS FILE + +package org.bytedeco.llvm.LLVM; + +import java.nio.*; +import org.bytedeco.javacpp.*; +import org.bytedeco.javacpp.annotation.*; + +import static org.bytedeco.javacpp.presets.javacpp.*; + +import static org.bytedeco.llvm.global.LLVM.*; + // namespace polly + diff --git a/llvm/src/gen/java/org/bytedeco/llvm/global/LLVM.java b/llvm/src/gen/java/org/bytedeco/llvm/global/LLVM.java index 2122de32d14..4294cf11200 100644 --- a/llvm/src/gen/java/org/bytedeco/llvm/global/LLVM.java +++ b/llvm/src/gen/java/org/bytedeco/llvm/global/LLVM.java @@ -10449,4 +10449,88 @@ public static native void LLVMAddScalarReplAggregatesPassWithThreshold(LLVMPassM // #endif +// Parsed from + +//===- polly/LinkAllPasses.h ----------- Reference All Passes ---*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This header file pulls in all transformation and analysis passes for tools +// like opt and bugpoint that need this functionality. +// +//===----------------------------------------------------------------------===// + +// #ifndef POLLY_LINKALLPASSES_H +// #define POLLY_LINKALLPASSES_H + +// #include "polly/CodeGen/PPCGCodeGeneration.h" +// #include "polly/Config/config.h" +// #include "polly/PruneUnprofitable.h" +// #include "polly/Simplify.h" +// #include "polly/Support/DumpModulePass.h" +// #include "llvm/ADT/StringRef.h" +// #include +// Targeting ../LLVM/Pass.java + + +// Targeting ../LLVM/PassRegistry.java + + + // namespace llvm +@Namespace("polly") public static native Pass createCodePreparationPass(); +@Namespace("polly") public static native Pass createScopInlinerPass(); +@Namespace("polly") public static native Pass createDeadCodeElimPass(); +@Namespace("polly") public static native Pass createDependenceInfoPass(); +@Namespace("polly") public static native Pass createDependenceInfoWrapperPassPass(); +@Namespace("polly") public static native Pass createDOTOnlyPrinterPass(); +@Namespace("polly") public static native Pass createDOTOnlyViewerPass(); +@Namespace("polly") public static native Pass createDOTPrinterPass(); +@Namespace("polly") public static native Pass createDOTViewerPass(); +@Namespace("polly") public static native Pass createJSONExporterPass(); +@Namespace("polly") public static native Pass createJSONImporterPass(); +@Namespace("polly") public static native Pass createPollyCanonicalizePass(); +@Namespace("polly") public static native Pass createPolyhedralInfoPass(); +@Namespace("polly") public static native Pass createScopDetectionWrapperPassPass(); +@Namespace("polly") public static native Pass createScopInfoRegionPassPass(); +@Namespace("polly") public static native Pass createScopInfoWrapperPassPass(); +@Namespace("polly") public static native Pass createRewriteByrefParamsPass(); +@Namespace("polly") public static native Pass createIslAstInfoWrapperPassPass(); +@Namespace("polly") public static native Pass createCodeGenerationPass(); +// #ifdef GPU_CODEGEN +// #endif +@Namespace("polly") public static native Pass createIslScheduleOptimizerPass(); +@Namespace("polly") public static native Pass createFlattenSchedulePass(); +@Namespace("polly") public static native Pass createDeLICMPass(); +@Namespace("polly") public static native Pass createMaximalStaticExpansionPass(); + +@Namespace("polly") public static native @Cast("char*") @ByRef BytePointer CodePreparationID(); public static native void CodePreparationID(BytePointer setter); + +// Targeting ../LLVM/PollyForcePassLinking.java + + // Force link by creating a global definition. + // namespace +@Namespace("llvm") public static native void initializeCodePreparationPass(@ByRef PassRegistry arg0); +@Namespace("llvm") public static native void initializeScopInlinerPass(@ByRef PassRegistry arg0); +@Namespace("llvm") public static native void initializeDeadCodeElimPass(@ByRef PassRegistry arg0); +@Namespace("llvm") public static native void initializeJSONExporterPass(@ByRef PassRegistry arg0); +@Namespace("llvm") public static native void initializeJSONImporterPass(@ByRef PassRegistry arg0); +@Namespace("llvm") public static native void initializeIslAstInfoWrapperPassPass(@ByRef PassRegistry arg0); +@Namespace("llvm") public static native void initializeCodeGenerationPass(@ByRef PassRegistry arg0); +@Namespace("llvm") public static native void initializeRewriteByrefParamsPass(@ByRef PassRegistry arg0); +// #ifdef GPU_CODEGEN +// #endif +@Namespace("llvm") public static native void initializeIslScheduleOptimizerPass(@ByRef PassRegistry arg0); +@Namespace("llvm") public static native void initializeMaximalStaticExpanderPass(@ByRef PassRegistry arg0); +@Namespace("llvm") public static native void initializePollyCanonicalizePass(@ByRef PassRegistry arg0); +@Namespace("llvm") public static native void initializeFlattenSchedulePass(@ByRef PassRegistry arg0); +@Namespace("llvm") public static native void initializeDeLICMPass(@ByRef PassRegistry arg0); + // namespace llvm + +// #endif + + }