From f015dcdd7987a82b3875b0c776fb486eca435458 Mon Sep 17 00:00:00 2001 From: Billy Moses Date: Tue, 10 Sep 2024 00:45:27 +0000 Subject: [PATCH 01/19] Set minimum LLVM to 15+ --- .github/workflows/bcload.yml | 8 +- .github/workflows/benchmark.yml | 6 +- .github/workflows/ccpp.yml | 8 +- .github/workflows/doxygen.yml | 2 +- .github/workflows/enzyme-ci.yml | 12 +- .github/workflows/enzyme-julia.yml | 7 +- .github/workflows/tagger.yml | 2 +- enzyme/BCLoad/CMakeLists.txt | 10 - enzyme/CMakeLists.txt | 17 +- enzyme/Enzyme/ActivityAnalysis.cpp | 29 --- enzyme/Enzyme/ActivityAnalysis.h | 5 - enzyme/Enzyme/ActivityAnalysisPrinter.cpp | 13 -- enzyme/Enzyme/AdjointGenerator.h | 197 ---------------- enzyme/Enzyme/CApi.cpp | 40 ---- enzyme/Enzyme/CMakeLists.txt | 9 +- enzyme/Enzyme/CacheUtility.cpp | 19 -- enzyme/Enzyme/CallDerivatives.cpp | 119 ---------- enzyme/Enzyme/Clang/EnzymeClang.cpp | 47 ---- enzyme/Enzyme/DiffeGradientUtils.cpp | 56 ----- enzyme/Enzyme/DifferentialUseAnalysis.cpp | 16 -- enzyme/Enzyme/DifferentialUseAnalysis.h | 4 - enzyme/Enzyme/Enzyme.cpp | 265 +--------------------- enzyme/Enzyme/Enzyme.h | 4 - enzyme/Enzyme/EnzymeLogic.cpp | 121 ---------- enzyme/Enzyme/FunctionUtils.cpp | 165 +------------- 25 files changed, 24 insertions(+), 1157 deletions(-) diff --git a/.github/workflows/bcload.yml b/.github/workflows/bcload.yml index 9cbbdb7094ff..f21a609ef2be 100644 --- a/.github/workflows/bcload.yml +++ b/.github/workflows/bcload.yml @@ -11,9 +11,9 @@ jobs: fail-fast: false matrix: # BCLoad tests only run with old pass manager [aka up to and including 13] - llvm: ["11", "12", "13"] + llvm: ["16"] build: ["Release"] # "RelWithDebInfo" - os: [ubuntu-20.04] + os: [ubuntu-22.04] timeout-minutes: 30 steps: @@ -23,10 +23,6 @@ jobs: sudo apt-add-repository "deb http://apt.llvm.org/`lsb_release -c | cut -f2`/ llvm-toolchain-`lsb_release -c | cut -f2`-${{ matrix.llvm }} main" || true sudo apt-get install -y cmake gcc g++ llvm-${{ matrix.llvm }}-dev clang-${{ matrix.llvm }} libclang-${{ matrix.llvm }}-dev sudo python3 -m pip install --upgrade pip lit - if [[ '${{ matrix.llvm }}' == '13' ]]; then - sudo sed -i 's/add_executable(llvm-omp-device-info IMPORTED)//g' /usr/lib/llvm-${{matrix.llvm}}/lib/cmake/llvm/LLVMExports*.cmake - sudo sed -i 's/llvm-omp-device-info//g' /usr/lib/llvm-${{matrix.llvm}}/lib/cmake/llvm/LLVMExports*.cmake - fi - uses: actions/checkout@v4 - name: mkdir run: cd enzyme && rm -rf build && mkdir build diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index d859468708b5..cf314e943b6a 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -21,7 +21,7 @@ jobs: strategy: fail-fast: false matrix: - llvm: ["13", "14", "15", "16"] + llvm: ["16", "17", "18"] build: ["Release", "Debug"] # "RelWithDebInfo" os: [openstack18] timeout-minutes: 120 @@ -33,10 +33,6 @@ jobs: sudo apt-get install -y python3-pip autoconf cmake gcc g++ libtool gfortran libblas-dev llvm-${{ matrix.llvm }}-dev clang-${{ matrix.llvm }} libeigen3-dev libboost-dev sudo python3 -m pip install lit pathlib sudo touch /usr/lib/llvm-${{ matrix.llvm }}/bin/yaml-bench - if [[ '${{ matrix.llvm }}' == '13' ]]; then - sudo sed -i 's/add_executable(llvm-omp-device-info IMPORTED)//g' /usr/lib/llvm-${{matrix.llvm}}/lib/cmake/llvm/LLVMExports*.cmake - sudo sed -i 's/llvm-omp-device-info//g' /usr/lib/llvm-${{matrix.llvm}}/lib/cmake/llvm/LLVMExports*.cmake - fi - uses: actions/checkout@v4 - name: mkdir run: rm -rf build && mkdir build diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index 1b5b293a24b7..7c3ed440477d 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -17,9 +17,9 @@ jobs: strategy: fail-fast: false matrix: - llvm: ["11", "12", "13", "14", "15", "16", "17"] + llvm: ["15", "16", "17", "18"] build: ["Release"] # "RelWithDebInfo" - os: [ubuntu-20.04] + os: [ubuntu-22.04] timeout-minutes: 45 @@ -31,10 +31,6 @@ jobs: sudo apt-add-repository "deb http://apt.llvm.org/`lsb_release -c | cut -f2`/ llvm-toolchain-`lsb_release -c | cut -f2`-${{ matrix.llvm }} main" || true sudo apt-get install -y cmake gcc g++ llvm-${{ matrix.llvm }}-dev libomp-${{ matrix.llvm }}-dev lld-${{ matrix.llvm }} clang-${{ matrix.llvm }} libclang-${{ matrix.llvm }}-dev libeigen3-dev libboost-dev libzstd-dev sudo python3 -m pip install --upgrade pip lit - if [[ '${{ matrix.llvm }}' == '13' ]]; then - sudo sed -i 's/add_executable(llvm-omp-device-info IMPORTED)//g' /usr/lib/llvm-${{matrix.llvm}}/lib/cmake/llvm/LLVMExports*.cmake - sudo sed -i 's/llvm-omp-device-info//g' /usr/lib/llvm-${{matrix.llvm}}/lib/cmake/llvm/LLVMExports*.cmake - fi - uses: actions/checkout@v4 - name: mkdir run: rm -rf build && mkdir build diff --git a/.github/workflows/doxygen.yml b/.github/workflows/doxygen.yml index 12e64dc5d8ce..d906c4393a23 100644 --- a/.github/workflows/doxygen.yml +++ b/.github/workflows/doxygen.yml @@ -7,7 +7,7 @@ on: jobs: docs: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/enzyme-ci.yml b/.github/workflows/enzyme-ci.yml index 010c0874fb0f..622c6e22e82e 100644 --- a/.github/workflows/enzyme-ci.yml +++ b/.github/workflows/enzyme-ci.yml @@ -15,9 +15,9 @@ jobs: strategy: fail-fast: false matrix: - llvm: ["11", "12", "13", "14", "15", "16"] + llvm: ["15", "16", "17", "18"] build: ["Release", "Debug"] # "RelWithDebInfo" - os: [ubuntu-20.04] + os: [ubuntu-22.04] timeout-minutes: 30 @@ -28,10 +28,6 @@ jobs: sudo apt-add-repository "deb http://apt.llvm.org/`lsb_release -c | cut -f2`/ llvm-toolchain-`lsb_release -c | cut -f2`-${{ matrix.llvm }} main" || true sudo apt-get install -y cmake gcc g++ llvm-${{ matrix.llvm }}-dev libzstd-dev sudo python3 -m pip install --upgrade pip lit - if [[ '${{ matrix.llvm }}' == '13' ]]; then - sudo sed -i 's/add_executable(llvm-omp-device-info IMPORTED)//g' /usr/lib/llvm-${{matrix.llvm}}/lib/cmake/llvm/LLVMExports*.cmake - sudo sed -i 's/llvm-omp-device-info//g' /usr/lib/llvm-${{matrix.llvm}}/lib/cmake/llvm/LLVMExports*.cmake - fi - uses: actions/checkout@v4 - name: mkdir run: rm -rf build && mkdir build @@ -61,7 +57,7 @@ jobs: strategy: fail-fast: false matrix: - llvm: ["12", "13", "14", "15", "16"] + llvm: ["15", "16", "17", "18"] build: ["Release", "Debug"] # "RelWithDebInfo" timeout-minutes: 30 @@ -100,7 +96,7 @@ jobs: strategy: fail-fast: false matrix: - llvm: ["13"] #, "14"] + llvm: ["16"] build: ["Release"] # "RelWithDebInfo" timeout-minutes: 30 diff --git a/.github/workflows/enzyme-julia.yml b/.github/workflows/enzyme-julia.yml index 4aabf7204f5b..da5c2950d7a0 100644 --- a/.github/workflows/enzyme-julia.yml +++ b/.github/workflows/enzyme-julia.yml @@ -18,9 +18,8 @@ jobs: fail-fast: false matrix: version: - - '1.6' - - '1.7' - - '1.8' + - '1.10' + - '1.11' os: - ubuntu-latest - macOS-latest @@ -31,7 +30,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/checkout@v4 with: - repository: 'wsmoses/Enzyme.jl' + repository: 'EnzymeAD/Enzyme.jl' path: ./jl ref: main - uses: julia-actions/setup-julia@v1 diff --git a/.github/workflows/tagger.yml b/.github/workflows/tagger.yml index 89c56ea32825..1208b4d3d72c 100644 --- a/.github/workflows/tagger.yml +++ b/.github/workflows/tagger.yml @@ -45,7 +45,7 @@ jobs: token: ${{ steps.generate_token.outputs.token }} reviewers: vchuravy branch: enzyme/${{ github.ref }} - body: "Automatic PR generated for https://github.com/wsmoses/Enzyme " + body: "Automatic PR generated for https://github.com/EnzymeAD/Enzyme " - name: Check outputs run: | echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}" diff --git a/enzyme/BCLoad/CMakeLists.txt b/enzyme/BCLoad/CMakeLists.txt index f88f515ec77f..510eb6c9a832 100644 --- a/enzyme/BCLoad/CMakeLists.txt +++ b/enzyme/BCLoad/CMakeLists.txt @@ -81,15 +81,6 @@ set_target_properties(blasheaders PROPERTIES EXCLUDE_FROM_ALL TRUE) endif() if ((NOT ("${BC_LOAD_HEADER}" STREQUAL "")) OR ${Clang_FOUND}) -if (${LLVM_VERSION_MAJOR} LESS 8) - add_llvm_loadable_module( BCPass-${LLVM_VERSION_MAJOR} - BCLoader.cpp ClangBCLoader.cpp - DEPENDS - intrinsics_gen - PLUGIN_TOOL - opt - ) -else() # on windows `PLUGIN_TOOL` doesn't link against LLVM.dll if ((WIN32 OR CYGWIN) AND LLVM_LINK_LLVM_DYLIB) add_llvm_library( BCPass-${LLVM_VERSION_MAJOR} @@ -112,7 +103,6 @@ else() BUILDTREE_ONLY ) endif() -endif() add_dependencies(BCPass-${LLVM_VERSION_MAJOR} blasheaders) target_include_directories(BCPass-${LLVM_VERSION_MAJOR} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/gsl) diff --git a/enzyme/CMakeLists.txt b/enzyme/CMakeLists.txt index 82c7887cde3e..1f51afe2789d 100644 --- a/enzyme/CMakeLists.txt +++ b/enzyme/CMakeLists.txt @@ -220,8 +220,8 @@ message("LLVM_INCLUDE_DIRS: ${LLVM_INCLUDE_DIRS}") message("found LLVM definitions " ${LLVM_DEFINITIONS}) message("found LLVM version " ${LLVM_VERSION_MAJOR}) -if(LLVM_VERSION_MAJOR LESS 9) - message(FATAL_ERROR "LLVM version < 9 is not supported") +if(LLVM_VERSION_MAJOR LESS 15) + message(FATAL_ERROR "LLVM version < 15 is not supported") endif() option(ENZYME_FLANG_VERSION "Build for non-version compliant FLANG" OFF) @@ -257,20 +257,7 @@ file(READ ${LLVM_IDIR}/llvm/Analysis/TargetLibraryInfo.h INPUT_TEXT) string(REPLACE "class TargetLibraryInfo {" "class TargetLibraryInfo {public:" INPUT_TEXT "${INPUT_TEXT}") file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/include/SCEV/TargetLibraryInfo.h" "${INPUT_TEXT}") -if (${LLVM_VERSION_MAJOR} GREATER_EQUAL 11) file(READ ${LLVM_IDIR}/llvm/Transforms/Utils/ScalarEvolutionExpander.h INPUT_TEXT) -else() -file(READ ${LLVM_IDIR}/llvm/Analysis/ScalarEvolutionExpander.h INPUT_TEXT) -endif() - -if (${LLVM_VERSION_MAJOR} LESS 12) -string(REPLACE "#define LLVM_ANALYSIS_SCALAREVOLUTIONEXPANDER_H" "#define LLVM_ANALYSIS_SCALAREVOLUTIONEXPANDER_H\n#include \"SCEV/ScalarEvolution.h\"" INPUT_TEXT "${INPUT_TEXT}") -string(REPLACE "LLVM_ANALYSIS" "FAKELLVM_ANALYSIS" INPUT_TEXT "${INPUT_TEXT}") -string(REPLACE "class SCEVExpander " "namespace fake {\n class SCEVExpander " INPUT_TEXT "${INPUT_TEXT}") -string(REPLACE "struct SCEVOperand " "namespace fake {\n struct SCEVOperand " INPUT_TEXT "${INPUT_TEXT}") -string(REPLACE "};\n}" "};\n}}" INPUT_TEXT "${INPUT_TEXT}") -string(REPLACE "const SCEV* S;\n};\n" "const SCEV* S;\n};\n}\n" INPUT_TEXT "${INPUT_TEXT}") -endif() find_library(MPFR_LIB_PATH mpfr) CHECK_INCLUDE_FILE("mpfr.h" HAS_MPFR_H) diff --git a/enzyme/Enzyme/ActivityAnalysis.cpp b/enzyme/Enzyme/ActivityAnalysis.cpp index 3bd37446040a..0d162e621283 100644 --- a/enzyme/Enzyme/ActivityAnalysis.cpp +++ b/enzyme/Enzyme/ActivityAnalysis.cpp @@ -65,12 +65,10 @@ using namespace llvm; -#if LLVM_VERSION_MAJOR >= 14 #define addAttribute addAttributeAtIndex #define removeAttribute removeAttributeAtIndex #define getAttribute getAttributeAtIndex #define hasAttribute hasAttributeAtIndex -#endif extern "C" { cl::opt @@ -301,9 +299,7 @@ const StringSet<> KnownInactiveFunctions = { }; const std::set KnownInactiveIntrinsics = { -#if LLVM_VERSION_MAJOR >= 12 Intrinsic::experimental_noalias_scope_decl, -#endif Intrinsic::objectsize, Intrinsic::floor, Intrinsic::ceil, @@ -559,11 +555,7 @@ bool ActivityAnalyzer::isFunctionArgumentConstant(CallInst *CI, Value *val) { bool all_inactive = val != CI->getCalledOperand(); -#if LLVM_VERSION_MAJOR >= 14 for (size_t i = 0; i < CI->arg_size(); i++) -#else - for (size_t i = 0; i < CI->getNumArgOperands(); i++) -#endif { if (val == CI->getArgOperand(i)) { if (!CI->getAttributes().hasParamAttr(i, "enzyme_inactive") && @@ -663,11 +655,7 @@ static inline void propagateArgumentInformation( } if (Name == "julia.call" || Name == "julia.call2") { -#if LLVM_VERSION_MAJOR >= 14 for (size_t i = 1; i < CI.arg_size(); i++) -#else - for (size_t i = 1; i < CI.getNumArgOperands(); i++) -#endif { propagateFromOperand(CI.getOperand(i)); } @@ -707,11 +695,7 @@ static inline void propagateArgumentInformation( // For other calls, check all operands of the instruction // as conservatively they may impact the activity of the call size_t i = 0; -#if LLVM_VERSION_MAJOR >= 14 for (auto &a : CI.args()) -#else - for (auto &a : CI.arg_operands()) -#endif { if (CI.getAttributes().hasParamAttr(i, "enzyme_inactive") || @@ -1941,13 +1925,8 @@ bool ActivityAnalyzer::isConstantValue(TypeResults const &TR, Value *Val) { } } -#if LLVM_VERSION_MAJOR >= 12 auto AARes = AA.getModRefInfo( I, MemoryLocation(memval, LocationSize::beforeOrAfterPointer())); -#else - auto AARes = - AA.getModRefInfo(I, MemoryLocation(memval, LocationSize::unknown())); -#endif // Still having failed to replace the location used by AA, fall back to // getModref against any location. @@ -2974,11 +2953,7 @@ bool ActivityAnalyzer::isValueInactiveFromUsers(TypeResults const &TR, auto F = getFunctionFromCall(call); size_t idx = 0; -#if LLVM_VERSION_MAJOR >= 14 for (auto &arg : call->args()) -#else - for (auto &arg : call->arg_operands()) -#endif { if (arg != parent) { idx++; @@ -3138,11 +3113,7 @@ bool ActivityAnalyzer::isValueInactiveFromUsers(TypeResults const &TR, if (isa(operand)) { bool legal = true; -#if LLVM_VERSION_MAJOR >= 14 for (unsigned i = 0; i < call->arg_size() + 1; ++i) -#else - for (unsigned i = 0; i < call->getNumArgOperands() + 1; ++i) -#endif { Value *a = call->getOperand(i); diff --git a/enzyme/Enzyme/ActivityAnalysis.h b/enzyme/Enzyme/ActivityAnalysis.h index 5e07765ffdcf..920bb5cd6f65 100644 --- a/enzyme/Enzyme/ActivityAnalysis.h +++ b/enzyme/Enzyme/ActivityAnalysis.h @@ -31,15 +31,10 @@ #include #include -#if LLVM_VERSION_MAJOR >= 16 #define private public #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Transforms/Utils/ScalarEvolutionExpander.h" #undef private -#else -#include "SCEV/ScalarEvolution.h" -#include "SCEV/ScalarEvolutionExpander.h" -#endif #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/IR/Constants.h" diff --git a/enzyme/Enzyme/ActivityAnalysisPrinter.cpp b/enzyme/Enzyme/ActivityAnalysisPrinter.cpp index bfca7860fc45..9f034f256bc3 100644 --- a/enzyme/Enzyme/ActivityAnalysisPrinter.cpp +++ b/enzyme/Enzyme/ActivityAnalysisPrinter.cpp @@ -24,13 +24,8 @@ //===----------------------------------------------------------------------===// #include -#if LLVM_VERSION_MAJOR >= 16 #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Transforms/Utils/ScalarEvolutionExpander.h" -#else -#include "SCEV/ScalarEvolution.h" -#include "SCEV/ScalarEvolutionExpander.h" -#endif #include "llvm/ADT/SmallVector.h" @@ -90,18 +85,14 @@ bool printActivityAnalysis(llvm::Function &F, TargetLibraryInfo &TLI) { dt = ConcreteType(a.getType()->getScalarType()); } else if (a.getType()->isPointerTy()) { #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 13 if (a.getContext().supportsTypedPointers()) { -#endif auto et = a.getType()->getPointerElementType(); if (et->isFPOrFPVectorTy()) { dt = TypeTree(ConcreteType(et->getScalarType())).Only(-1, nullptr); } else if (et->isPointerTy()) { dt = TypeTree(ConcreteType(BaseType::Pointer)).Only(-1, nullptr); } -#if LLVM_VERSION_MAJOR >= 13 } -#endif #endif } else if (a.getType()->isIntOrIntVectorTy()) { dt = ConcreteType(BaseType::Integer); @@ -119,18 +110,14 @@ bool printActivityAnalysis(llvm::Function &F, TargetLibraryInfo &TLI) { dt = ConcreteType(F.getReturnType()->getScalarType()); } else if (F.getReturnType()->isPointerTy()) { #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 13 if (F.getContext().supportsTypedPointers()) { -#endif auto et = F.getReturnType()->getPointerElementType(); if (et->isFPOrFPVectorTy()) { dt = TypeTree(ConcreteType(et->getScalarType())).Only(-1, nullptr); } else if (et->isPointerTy()) { dt = TypeTree(ConcreteType(BaseType::Pointer)).Only(-1, nullptr); } -#if LLVM_VERSION_MAJOR >= 13 } -#endif #endif } else if (F.getReturnType()->isIntOrIntVectorTy()) { dt = ConcreteType(BaseType::Integer); diff --git a/enzyme/Enzyme/AdjointGenerator.h b/enzyme/Enzyme/AdjointGenerator.h index ad23211903a7..e807d568e76d 100644 --- a/enzyme/Enzyme/AdjointGenerator.h +++ b/enzyme/Enzyme/AdjointGenerator.h @@ -171,7 +171,6 @@ class AdjointGenerator : public llvm::InstVisitor { AL.addParamAttribute(DT->getContext(), 1, Attribute::AttrKind::NoAlias); AL = AL.addParamAttribute(DT->getContext(), 1, Attribute::AttrKind::NonNull); -#if LLVM_VERSION_MAJOR >= 14 AL = AL.addAttributeAtIndex(DT->getContext(), AttributeList::FunctionIndex, Attribute::AttrKind::NoUnwind); AL = AL.addAttributeAtIndex(DT->getContext(), AttributeList::FunctionIndex, @@ -180,20 +179,6 @@ class AdjointGenerator : public llvm::InstVisitor { Attribute::AttrKind::NoSync); AL = AL.addAttributeAtIndex(DT->getContext(), AttributeList::FunctionIndex, Attribute::AttrKind::WillReturn); -#else - AL = AL.addAttribute(DT->getContext(), AttributeList::FunctionIndex, - Attribute::AttrKind::NoFree); - AL = AL.addAttribute(DT->getContext(), AttributeList::FunctionIndex, - Attribute::AttrKind::NoSync); - AL = AL.addAttribute(DT->getContext(), AttributeList::FunctionIndex, - Attribute::AttrKind::WillReturn); -#endif -#if LLVM_VERSION_MAJOR < 14 - AL = AL.addAttribute(DT->getContext(), AttributeList::FunctionIndex, - Attribute::AttrKind::ArgMemOnly); - AL = AL.addAttribute(DT->getContext(), AttributeList::FunctionIndex, - Attribute::AttrKind::NoUnwind); -#endif auto CI = B.CreateCall( B.GetInsertBlock()->getParent()->getParent()->getOrInsertFunction( "MPI_Type_size", FT, AL), @@ -201,12 +186,8 @@ class AdjointGenerator : public llvm::InstVisitor { #if LLVM_VERSION_MAJOR >= 16 CI->setOnlyAccessesArgMemory(); #else -#if LLVM_VERSION_MAJOR >= 14 CI->addAttributeAtIndex(AttributeList::FunctionIndex, Attribute::ArgMemOnly); -#else - CI->addAttribute(AttributeList::FunctionIndex, Attribute::ArgMemOnly); -#endif #endif return B.CreateLoad(intType, alloc); } @@ -230,28 +211,14 @@ class AdjointGenerator : public llvm::InstVisitor { AL = AL.addParamAttribute(context, 1, Attribute::AttrKind::NoCapture); AL = AL.addParamAttribute(context, 1, Attribute::AttrKind::NoAlias); AL = AL.addParamAttribute(context, 1, Attribute::AttrKind::NonNull); -#if LLVM_VERSION_MAJOR >= 14 AL = AL.addAttributeAtIndex(context, AttributeList::FunctionIndex, Attribute::AttrKind::NoUnwind); -#else - AL = AL.addAttribute(context, AttributeList::FunctionIndex, - Attribute::AttrKind::NoUnwind); -#endif -#if LLVM_VERSION_MAJOR >= 14 AL = AL.addAttributeAtIndex(context, AttributeList::FunctionIndex, Attribute::AttrKind::NoFree); AL = AL.addAttributeAtIndex(context, AttributeList::FunctionIndex, Attribute::AttrKind::NoSync); AL = AL.addAttributeAtIndex(context, AttributeList::FunctionIndex, Attribute::AttrKind::WillReturn); -#else - AL = AL.addAttribute(context, AttributeList::FunctionIndex, - Attribute::AttrKind::NoFree); - AL = AL.addAttribute(context, AttributeList::FunctionIndex, - Attribute::AttrKind::NoSync); - AL = AL.addAttribute(context, AttributeList::FunctionIndex, - Attribute::AttrKind::WillReturn); -#endif llvm::Value *args[] = {comm, alloc}; B.CreateCall( B.GetInsertBlock()->getParent()->getParent()->getOrInsertFunction( @@ -277,28 +244,14 @@ class AdjointGenerator : public llvm::InstVisitor { AL = AL.addParamAttribute(context, 1, Attribute::AttrKind::NoCapture); AL = AL.addParamAttribute(context, 1, Attribute::AttrKind::NoAlias); AL = AL.addParamAttribute(context, 1, Attribute::AttrKind::NonNull); -#if LLVM_VERSION_MAJOR >= 14 AL = AL.addAttributeAtIndex(context, AttributeList::FunctionIndex, Attribute::AttrKind::NoUnwind); -#else - AL = AL.addAttribute(context, AttributeList::FunctionIndex, - Attribute::AttrKind::NoUnwind); -#endif -#if LLVM_VERSION_MAJOR >= 14 AL = AL.addAttributeAtIndex(context, AttributeList::FunctionIndex, Attribute::AttrKind::NoFree); AL = AL.addAttributeAtIndex(context, AttributeList::FunctionIndex, Attribute::AttrKind::NoSync); AL = AL.addAttributeAtIndex(context, AttributeList::FunctionIndex, Attribute::AttrKind::WillReturn); -#else - AL = AL.addAttribute(context, AttributeList::FunctionIndex, - Attribute::AttrKind::NoFree); - AL = AL.addAttribute(context, AttributeList::FunctionIndex, - Attribute::AttrKind::NoSync); - AL = AL.addAttribute(context, AttributeList::FunctionIndex, - Attribute::AttrKind::WillReturn); -#endif llvm::Value *args[] = {comm, alloc}; B.CreateCall( B.GetInsertBlock()->getParent()->getParent()->getOrInsertFunction( @@ -334,14 +287,12 @@ class AdjointGenerator : public llvm::InstVisitor { Constant::getNullValue(gutils->getShadowType(inst.getType())), Builder2); } -#if LLVM_VERSION_MAJOR >= 12 if (!inst.getType()->isVoidTy()) { for (auto &U : make_early_inc_range(gutils->getNewFromOriginal(&inst)->uses())) { U.set(UndefValue::get(inst.getType())); } } -#endif eraseIfUnused(inst, /*erase*/ true, /*check*/ false); return; } @@ -799,15 +750,9 @@ class AdjointGenerator : public llvm::InstVisitor { if (!gutils->isConstantInstruction(&I)) { assert(ptr); AtomicRMWInst *rmw = nullptr; -#if LLVM_VERSION_MAJOR >= 13 rmw = BuilderZ.CreateAtomicRMW(I.getOperation(), ptr, dif, I.getAlign(), I.getOrdering(), I.getSyncScopeID()); -#else - rmw = BuilderZ.CreateAtomicRMW(I.getOperation(), ptr, dif, - I.getOrdering(), I.getSyncScopeID()); - rmw->setAlignment(I.getAlign()); -#endif rmw->setVolatile(I.isVolatile()); if (gutils->isConstantValue(&I)) return Constant::getNullValue(dif->getType()); @@ -904,14 +849,12 @@ class AdjointGenerator : public llvm::InstVisitor { setDiffe(&I, Constant::getNullValue(gutils->getShadowType(I.getType())), BuilderZ); } -#if LLVM_VERSION_MAJOR >= 12 if (!I.getType()->isVoidTy()) { for (auto &U : make_early_inc_range(gutils->getNewFromOriginal(&I)->uses())) { U.set(UndefValue::get(I.getType())); } } -#endif eraseIfUnused(I, /*erase*/ true, /*check*/ false); return; } @@ -1555,11 +1498,7 @@ class AdjointGenerator : public llvm::InstVisitor { Value *inc = lookup(lc.incvar, Builder2); if (VectorType *VTy = dyn_cast(SI.getOperand(0)->getType())) { -#if LLVM_VERSION_MAJOR >= 12 inc = Builder2.CreateVectorSplat(VTy->getElementCount(), inc); -#else - inc = Builder2.CreateVectorSplat(VTy->getNumElements(), inc); -#endif } Value *dif = CreateSelect( Builder2, @@ -1774,15 +1713,10 @@ class AdjointGenerator : public llvm::InstVisitor { getReverseBuilder(Builder2); auto loaded = diffe(&SVI, Builder2); -#if LLVM_VERSION_MAJOR >= 12 auto count = cast(SVI.getOperand(0)->getType())->getElementCount(); assert(!count.isScalable()); size_t l1 = count.getKnownMinValue(); -#else - size_t l1 = - cast(SVI.getOperand(0)->getType())->getNumElements(); -#endif uint64_t instidx = 0; for (size_t idx : SVI.getShuffleMask()) { @@ -2482,19 +2416,11 @@ class AdjointGenerator : public llvm::InstVisitor { auto CI = dyn_cast(BO.getOperand(i)); if (auto CV = dyn_cast(BO.getOperand(i))) { CI = dyn_cast_or_null(CV->getSplatValue()); -#if LLVM_VERSION_MAJOR >= 12 FT = VectorType::get(FT, CV->getType()->getElementCount()); -#else - FT = VectorType::get(FT, CV->getType()->getNumElements()); -#endif } if (auto CV = dyn_cast(BO.getOperand(i))) { CI = dyn_cast_or_null(CV->getSplatValue()); -#if LLVM_VERSION_MAJOR >= 12 FT = VectorType::get(FT, CV->getType()->getElementCount()); -#else - FT = VectorType::get(FT, CV->getType()->getNumElements()); -#endif } if (CI && dl.getTypeSizeInBits(eFT) == dl.getTypeSizeInBits(CI->getType())) { @@ -2724,19 +2650,10 @@ class AdjointGenerator : public llvm::InstVisitor { auto CI = dyn_cast(BO.getOperand(i)); if (auto CV = dyn_cast(BO.getOperand(i))) { CI = dyn_cast_or_null(CV->getSplatValue()); -#if LLVM_VERSION_MAJOR >= 12 FT = VectorType::get(FT, CV->getType()->getElementCount()); -#else - FT = VectorType::get(FT, CV->getType()->getNumElements()); -#endif } if (auto CV = dyn_cast(BO.getOperand(i))) { CI = dyn_cast_or_null(CV->getSplatValue()); -#if LLVM_VERSION_MAJOR >= 12 - FT = VectorType::get(FT, CV->getType()->getElementCount()); -#else - FT = VectorType::get(FT, CV->getType()->getNumElements()); -#endif } if (CI && dl.getTypeSizeInBits(eFT) == dl.getTypeSizeInBits(CI->getType())) { @@ -2909,11 +2826,7 @@ class AdjointGenerator : public llvm::InstVisitor { Value *op1 = gutils->getNewFromOriginal(MS.getArgOperand(1)); Value *op2 = gutils->getNewFromOriginal(MS.getArgOperand(2)); Value *op3 = nullptr; -#if LLVM_VERSION_MAJOR >= 14 if (3 < MS.arg_size()) -#else - if (3 < MS.getNumArgOperands()) -#endif { op3 = gutils->getNewFromOriginal(MS.getOperand(3)); } @@ -2951,12 +2864,8 @@ class AdjointGenerator : public llvm::InstVisitor { {AttributeList::ReturnIndex, AttributeList::FunctionIndex, AttributeList::FirstArgIndex}) for (auto attr : MS.getAttributes().getAttributes(idx)) -#if LLVM_VERSION_MAJOR >= 14 NewAttrs = NewAttrs.addAttributeAtIndex(MS.getContext(), idx, attr); -#else - NewAttrs = NewAttrs.addAttribute(MS.getContext(), idx, attr); -#endif cal->setAttributes(NewAttrs); } else cal->setAttributes(MS.getAttributes()); @@ -3159,11 +3068,7 @@ class AdjointGenerator : public llvm::InstVisitor { Value *op1 = gutils->getNewFromOriginal(MS.getArgOperand(1)); Value *new_size = gutils->getNewFromOriginal(MS.getArgOperand(2)); Value *op3 = nullptr; -#if LLVM_VERSION_MAJOR >= 14 if (3 < MS.arg_size()) -#else - if (3 < MS.getNumArgOperands()) -#endif { op3 = gutils->getNewFromOriginal(MS.getOperand(3)); } @@ -3292,12 +3197,8 @@ class AdjointGenerator : public llvm::InstVisitor { {AttributeList::ReturnIndex, AttributeList::FunctionIndex, AttributeList::FirstArgIndex}) for (auto attr : MS.getAttributes().getAttributes(idx)) -#if LLVM_VERSION_MAJOR >= 14 NewAttrs = NewAttrs.addAttributeAtIndex(MS.getContext(), idx, attr); -#else - NewAttrs = NewAttrs.addAttribute(MS.getContext(), idx, attr); -#endif cal->setAttributes(NewAttrs); } else cal->setAttributes(MS.getAttributes()); @@ -3805,7 +3706,6 @@ class AdjointGenerator : public llvm::InstVisitor { default: if (gutils->isConstantInstruction(&I)) return false; -#if LLVM_VERSION_MAJOR >= 12 if (ID == Intrinsic::umax || ID == Intrinsic::smax || ID == Intrinsic::sadd_with_overflow || ID == Intrinsic::uadd_with_overflow || @@ -3818,7 +3718,6 @@ class AdjointGenerator : public llvm::InstVisitor { "failed to deduce type of intrinsic ", I); return false; } -#endif std::string s; llvm::raw_string_ostream ss(s); ss << *gutils->oldFunc << "\n"; @@ -3889,7 +3788,6 @@ class AdjointGenerator : public llvm::InstVisitor { return false; } -#if LLVM_VERSION_MAJOR >= 12 case Intrinsic::vector_reduce_fmax: { if (vdiff && !gutils->isConstantValue(orig_ops[0])) { auto prev = lookup(gutils->getNewFromOriginal(orig_ops[0]), Builder2); @@ -3926,11 +3824,9 @@ class AdjointGenerator : public llvm::InstVisitor { } return false; } -#endif default: if (gutils->isConstantInstruction(&I)) return false; -#if LLVM_VERSION_MAJOR >= 12 if (ID == Intrinsic::umax || ID == Intrinsic::smax || ID == Intrinsic::sadd_with_overflow || ID == Intrinsic::uadd_with_overflow || @@ -3943,23 +3839,16 @@ class AdjointGenerator : public llvm::InstVisitor { "failed to deduce type of intrinsic ", I); return false; } -#endif std::string s; llvm::raw_string_ostream ss(s); ss << *gutils->oldFunc << "\n"; ss << *gutils->newFunc << "\n"; if (Intrinsic::isOverloaded(ID)) -#if LLVM_VERSION_MAJOR >= 13 ss << "cannot handle (reverse) unknown intrinsic\n" << Intrinsic::getName(ID, ArrayRef(), gutils->oldFunc->getParent(), nullptr) << "\n" << I; -#else - ss << "cannot handle (reverse) unknown intrinsic\n" - << Intrinsic::getName(ID, ArrayRef()) << "\n" - << I; -#endif else ss << "cannot handle (reverse) unknown intrinsic\n" << Intrinsic::getName(ID) << "\n" @@ -3978,7 +3867,6 @@ class AdjointGenerator : public llvm::InstVisitor { switch (ID) { -#if LLVM_VERSION_MAJOR >= 12 case Intrinsic::vector_reduce_fmax: { if (gutils->isConstantInstruction(&I)) return false; @@ -4015,11 +3903,9 @@ class AdjointGenerator : public llvm::InstVisitor { setDiffe(&I, dif, Builder2); return false; } -#endif default: if (gutils->isConstantInstruction(&I)) return false; -#if LLVM_VERSION_MAJOR >= 12 if (ID == Intrinsic::umax || ID == Intrinsic::smax || ID == Intrinsic::sadd_with_overflow || ID == Intrinsic::uadd_with_overflow || @@ -4032,21 +3918,14 @@ class AdjointGenerator : public llvm::InstVisitor { "failed to deduce type of intrinsic ", I); return false; } -#endif std::string s; llvm::raw_string_ostream ss(s); if (Intrinsic::isOverloaded(ID)) -#if LLVM_VERSION_MAJOR >= 13 ss << "cannot handle (forward) unknown intrinsic\n" << Intrinsic::getName(ID, ArrayRef(), gutils->oldFunc->getParent(), nullptr) << "\n" << I; -#else - ss << "cannot handle (forward) unknown intrinsic\n" - << Intrinsic::getName(ID, ArrayRef()) << "\n" - << I; -#endif else ss << "cannot handle (forward) unknown intrinsic\n" << Intrinsic::getName(ID) << "\n" @@ -4121,11 +4000,7 @@ class AdjointGenerator : public llvm::InstVisitor { SmallVector OutTypes; SmallVector OutFPTypes; -#if LLVM_VERSION_MAJOR >= 14 for (unsigned i = 3; i < call.arg_size(); ++i) -#else - for (unsigned i = 3; i < call.getNumArgOperands(); ++i) -#endif { auto argi = gutils->getNewFromOriginal(call.getArgOperand(i)); @@ -4579,39 +4454,20 @@ class AdjointGenerator : public llvm::InstVisitor { MaybeAlign align; AtomicRMWInst::BinOp op = AtomicRMWInst::FAdd; if (auto vt = dyn_cast(dif->getType())) { -#if LLVM_VERSION_MAJOR >= 12 assert(!vt->getElementCount().isScalable()); size_t numElems = vt->getElementCount().getKnownMinValue(); -#else - size_t numElems = vt->getNumElements(); -#endif for (size_t i = 0; i < numElems; ++i) { auto vdif = B.CreateExtractElement(dif, i); Value *Idxs[] = { ConstantInt::get(Type::getInt64Ty(vt->getContext()), 0), ConstantInt::get(Type::getInt32Ty(vt->getContext()), i)}; auto vptr = B.CreateInBoundsGEP(vt, ptr, Idxs); -#if LLVM_VERSION_MAJOR >= 13 B.CreateAtomicRMW(op, vptr, vdif, align, AtomicOrdering::Monotonic, SyncScope::System); -#else - AtomicRMWInst *rmw = - B.CreateAtomicRMW(op, vptr, vdif, AtomicOrdering::Monotonic, - SyncScope::System); - if (align) - rmw->setAlignment(align.getValue()); -#endif } } else { -#if LLVM_VERSION_MAJOR >= 13 B.CreateAtomicRMW(op, ptr, dif, align, AtomicOrdering::Monotonic, SyncScope::System); -#else - AtomicRMWInst *rmw = B.CreateAtomicRMW( - op, ptr, dif, AtomicOrdering::Monotonic, SyncScope::System); - if (align) - rmw->setAlignment(align.getValue()); -#endif } } B.CreateRetVoid(); @@ -4824,27 +4680,17 @@ class AdjointGenerator : public llvm::InstVisitor { std::map gradByVal; std::map> structAttrs; -#if LLVM_VERSION_MAJOR >= 14 for (unsigned i = 0; i < call.arg_size(); ++i) -#else - for (unsigned i = 0; i < call.getNumArgOperands(); ++i) -#endif { if (call.paramHasAttr(i, Attribute::StructRet)) { structAttrs[args.size()].push_back( -#if LLVM_VERSION_MAJOR >= 12 - Attribute::get(call.getContext(), "enzyme_sret") -#else Attribute::get(call.getContext(), "enzyme_sret") -#endif ); -#if LLVM_VERSION_MAJOR >= 13 // TODO // structAttrs[args.size()].push_back(Attribute::get( // call.getContext(), Attribute::AttrKind::ElementType, // call.getParamAttr(i, Attribute::StructRet).getValueAsType())); -#endif } for (auto attr : {"enzymejl_returnRoots", "enzymejl_parmtype", "enzymejl_parmtype_ref", "enzyme_type"}) @@ -4918,35 +4764,23 @@ class AdjointGenerator : public llvm::InstVisitor { if (call.paramHasAttr(i, Attribute::StructRet)) { if (gutils->getWidth() == 1) { structAttrs[args.size()].push_back( -#if LLVM_VERSION_MAJOR >= 12 Attribute::get(call.getContext(), "enzyme_sret") // orig->getParamAttr(i, Attribute::StructRet).getValueAsType()); -#else - Attribute::get(call.getContext(), "enzyme_sret") -#endif ); -#if LLVM_VERSION_MAJOR >= 13 // TODO // structAttrs[args.size()].push_back(Attribute::get( // call.getContext(), Attribute::AttrKind::ElementType, // call.getParamAttr(i, // Attribute::StructRet).getValueAsType())); -#endif } else { structAttrs[args.size()].push_back( -#if LLVM_VERSION_MAJOR >= 12 - Attribute::get(call.getContext(), "enzyme_sret") -#else Attribute::get(call.getContext(), "enzyme_sret_v") -#endif ); -#if LLVM_VERSION_MAJOR >= 13 // TODO // structAttrs[args.size()].push_back(Attribute::get( // call.getContext(), Attribute::AttrKind::ElementType, // call.getParamAttr(i, // Attribute::StructRet).getValueAsType())); -#endif } } @@ -5133,11 +4967,7 @@ class AdjointGenerator : public llvm::InstVisitor { SmallVector PreBundleTypes; SmallVector BundleTypes; -#if LLVM_VERSION_MAJOR >= 14 for (unsigned i = 0; i < call.arg_size(); ++i) -#else - for (unsigned i = 0; i < call.getNumArgOperands(); ++i) -#endif { auto argi = gutils->getNewFromOriginal(call.getArgOperand(i)); @@ -5152,16 +4982,10 @@ class AdjointGenerator : public llvm::InstVisitor { } if (call.paramHasAttr(i, Attribute::StructRet)) { structAttrs[pre_args.size()].push_back( -#if LLVM_VERSION_MAJOR >= 12 // TODO persist types Attribute::get(call.getContext(), "enzyme_sret") // Attribute::get(orig->getContext(), "enzyme_sret", // orig->getParamAttr(ii, Attribute::StructRet).getValueAsType()); -#else - // TODO persist types - Attribute::get(call.getContext(), "enzyme_sret") - // Attribute::get(orig->getContext(), "enzyme_sret"); -#endif ); } for (auto ty : PrimalParamAttrsToPreserve) @@ -5256,26 +5080,18 @@ class AdjointGenerator : public llvm::InstVisitor { if (call.paramHasAttr(i, Attribute::StructRet)) { if (gutils->getWidth() == 1) { structAttrs[pre_args.size()].push_back( -#if LLVM_VERSION_MAJOR >= 12 // TODO persist types Attribute::get(call.getContext(), "enzyme_sret") // Attribute::get(orig->getContext(), "enzyme_sret", // orig->getParamAttr(ii, Attribute::StructRet).getValueAsType()); -#else - Attribute::get(call.getContext(), "enzyme_sret") -#endif ); } else { structAttrs[pre_args.size()].push_back( -#if LLVM_VERSION_MAJOR >= 12 // TODO persist types Attribute::get(call.getContext(), "enzyme_sret_v") // Attribute::get(orig->getContext(), "enzyme_sret_v", // gutils->getShadowType(orig->getParamAttr(ii, // Attribute::StructRet).getValueAsType())); -#else - Attribute::get(call.getContext(), "enzyme_sret_v") -#endif ); } } @@ -5315,13 +5131,8 @@ class AdjointGenerator : public llvm::InstVisitor { BundleTypes.push_back(revType); } if (called) { -#if LLVM_VERSION_MAJOR >= 14 if (call.arg_size() != cast(called)->getFunctionType()->getNumParams()) -#else - if (call.getNumArgOperands() != - cast(called)->getFunctionType()->getNumParams()) -#endif { llvm::errs() << *gutils->oldFunc->getParent() << "\n"; llvm::errs() << *gutils->oldFunc << "\n"; @@ -5956,11 +5767,7 @@ class AdjointGenerator : public llvm::InstVisitor { structidx++; } -#if LLVM_VERSION_MAJOR >= 14 for (unsigned i = 0; i < call.arg_size(); ++i) -#else - for (unsigned i = 0; i < call.getNumArgOperands(); ++i) -#endif { if (argsInverted[i] == DIFFE_TYPE::OUT_DIFF) { Value *diffeadd = Builder2.CreateExtractValue(diffes, {structidx}); @@ -6405,11 +6212,7 @@ class AdjointGenerator : public llvm::InstVisitor { if (!noFree && !EnzymeGlobalActivity) { bool mayActiveFree = false; -#if LLVM_VERSION_MAJOR >= 14 for (unsigned i = 0; i < call.arg_size(); ++i) -#else - for (unsigned i = 0; i < call.getNumArgOperands(); ++i) -#endif { Value *a = call.getOperand(i); diff --git a/enzyme/Enzyme/CApi.cpp b/enzyme/Enzyme/CApi.cpp index 0d4e21787950..2dbbea9419f5 100644 --- a/enzyme/Enzyme/CApi.cpp +++ b/enzyme/Enzyme/CApi.cpp @@ -54,12 +54,10 @@ #include "llvm/IR/LegacyPassManager.h" #include "llvm/Transforms/IPO/Attributor.h" -#if LLVM_VERSION_MAJOR >= 14 #define addAttribute addAttributeAtIndex #define removeAttribute removeAttributeAtIndex #define getAttribute getAttributeAtIndex #define hasAttribute hasAttributeAtIndex -#endif using namespace llvm; @@ -964,8 +962,6 @@ void EnzymeDumpModuleRef(LLVMModuleRef M) { llvm::errs() << *unwrap(M) << "\n"; } -#if LLVM_VERSION_MAJOR >= 15 - static bool runAttributorOnFunctions(InformationCache &InfoCache, SetVector &Functions, AnalysisGetter &AG, @@ -1023,11 +1019,6 @@ extern "C++" char MyAttributorLegacyPass::ID = 0; void EnzymeAddAttributorLegacyPass(LLVMPassManagerRef PM) { unwrap(PM)->add(new MyAttributorLegacyPass()); } -#else -void EnzymeAddAttributorLegacyPass(LLVMPassManagerRef PM) { - unwrap(PM)->add(createAttributorLegacyPass()); -} -#endif LLVMMetadataRef EnzymeMakeNonConstTBAA(LLVMMetadataRef MD) { auto M = cast(unwrap(MD)); @@ -1089,11 +1080,7 @@ void EnzymeSetCalledFunction(LLVMValueRef C_CI, LLVMValueRef C_F, size_t argremsz = 0; size_t nexti = 0; SmallVector vals; -#if LLVM_VERSION_MAJOR >= 14 for (size_t i = 0, end = CI->arg_size(); i < end; i++) -#else - for (size_t i = 0, end = CI->getNumArgOperands(); i < end; i++) -#endif { if (argremsz < num_argrem) { if (i == argrem[argremsz]) { @@ -1188,13 +1175,8 @@ LLVMValueRef EnzymeCloneFunctionWithoutReturnOrArgs(LLVMValueRef FC, } SmallVector Returns; // Ignore returns cloned. -#if LLVM_VERSION_MAJOR >= 13 CloneFunctionInto(NewF, F, VMap, CloneFunctionChangeType::LocalChangesOnly, Returns, "", nullptr); -#else - CloneFunctionInto(NewF, F, VMap, F->getSubprogram() != nullptr, Returns, "", - nullptr); -#endif if (!keepReturn) { for (auto &B : *NewF) { @@ -1405,13 +1387,8 @@ void EnzymeFixupBatchedJuliaCallingConvention(LLVMValueRef F_C) { } SmallVector Returns; // Ignore returns cloned. -#if LLVM_VERSION_MAJOR >= 13 CloneFunctionInto(NewF, F, VMap, CloneFunctionChangeType::LocalChangesOnly, Returns, "", nullptr); -#else - CloneFunctionInto(NewF, F, VMap, F->getSubprogram() != nullptr, Returns, "", - nullptr); -#endif { IRBuilder<> EB(&*NewF->getEntryBlock().begin()); @@ -1441,11 +1418,7 @@ void EnzymeFixupBatchedJuliaCallingConvention(LLVMValueRef F_C) { AttributeList::ReturnIndex, attr); SmallVector vals; -#if LLVM_VERSION_MAJOR >= 14 for (size_t j = 0, end = CI->arg_size(); j < end; j++) -#else - for (size_t j = 0, end = CI->getNumArgOperands(); j < end; j++) -#endif { auto T = CI->getArgOperand(j)->getType(); @@ -1695,13 +1668,8 @@ void EnzymeFixupJuliaCallingConvention(LLVMValueRef F_C) { } SmallVector Returns; // Ignore returns cloned. -#if LLVM_VERSION_MAJOR >= 13 CloneFunctionInto(NewF, F, VMap, CloneFunctionChangeType::LocalChangesOnly, Returns, "", nullptr); -#else - CloneFunctionInto(NewF, F, VMap, F->getSubprogram() != nullptr, Returns, "", - nullptr); -#endif SmallVector callers; for (auto U : F->users()) { @@ -1747,11 +1715,7 @@ void EnzymeFixupJuliaCallingConvention(LLVMValueRef F_C) { } return offset; } else if (auto VT = dyn_cast(T)) { -#if LLVM_VERSION_MAJOR >= 12 size_t count = VT->getElementCount().getKnownMinValue(); -#else - size_t count = VT->getNumElements(); -#endif for (size_t i = 0; i < count; i++) { offset = recur(B, B.CreateExtractElement(V, i), offset); } @@ -1912,11 +1876,7 @@ void EnzymeFixupJuliaCallingConvention(LLVMValueRef F_C) { SmallVector sret_vals; SmallVector sretv_vals; -#if LLVM_VERSION_MAJOR >= 14 for (size_t i = 0, end = CI->arg_size(); i < end; i++) -#else - for (size_t i = 0, end = CI->getNumArgOperands(); i < end; i++) -#endif { if (rroots.count(i) || rroots_v.count(i)) { continue; diff --git a/enzyme/Enzyme/CMakeLists.txt b/enzyme/Enzyme/CMakeLists.txt index 1cd6e84c5be1..c40bf5426d97 100644 --- a/enzyme/Enzyme/CMakeLists.txt +++ b/enzyme/Enzyme/CMakeLists.txt @@ -168,15 +168,8 @@ add_library(LLDEnzymeFlags INTERFACE) target_compile_options(LLDEnzymeFlags INTERFACE -flto) target_link_options(LLDEnzymeFlags INTERFACE "SHELL: -fuse-ld=lld") -set(LTO_LEGACY_MANAGER_VERSIONS 13 14) -if (${LLVM_VERSION_MAJOR} IN_LIST LTO_LEGACY_MANAGER_VERSIONS) - target_link_options(LLDEnzymeFlags INTERFACE "SHELL: -Wl,--lto-legacy-pass-manager") -endif() - target_link_options(LLDEnzymeFlags INTERFACE "SHELL: -Wl,-mllvm -Wl,-load=$") -if (${LLVM_VERSION_MAJOR} GREATER 14) - target_link_options(LLDEnzymeFlags INTERFACE "SHELL: -Wl,--load-pass-plugin=$") -endif() +target_link_options(LLDEnzymeFlags INTERFACE "SHELL: -Wl,--load-pass-plugin=$") add_library(LLDEnzymeAssumeUnknownNoFree INTERFACE) target_link_options(LLDEnzymeAssumeUnknownNoFree INTERFACE "SHELL: -Wl,-mllvm -Wl,-enzyme-assume-unknown-nofree=1") diff --git a/enzyme/Enzyme/CacheUtility.cpp b/enzyme/Enzyme/CacheUtility.cpp index a6ab878d317e..226d3d1c3823 100644 --- a/enzyme/Enzyme/CacheUtility.cpp +++ b/enzyme/Enzyme/CacheUtility.cpp @@ -246,13 +246,8 @@ void RemoveRedundantIVs( // This scope is necessary to ensure scevexpander cleans up before we erase // things -#if LLVM_VERSION_MAJOR >= 12 SCEVExpander Exp(SE, Header->getParent()->getParent()->getDataLayout(), "enzyme"); -#else - fake::SCEVExpander Exp( - SE, Header->getParent()->getParent()->getDataLayout(), "enzyme"); -#endif // We place that at first non phi as it may produce a non-phi instruction // and must thus be expanded after all phi's @@ -722,13 +717,8 @@ bool CacheUtility::getContext(BasicBlock *BB, LoopContext &loopContext, if (Limit->getType() != CanonicalIV->getType()) Limit = SE.getZeroExtendExpr(Limit, CanonicalIV->getType()); -#if LLVM_VERSION_MAJOR >= 12 SCEVExpander Exp(SE, BB->getParent()->getParent()->getDataLayout(), "enzyme"); -#else - fake::SCEVExpander Exp(SE, BB->getParent()->getParent()->getDataLayout(), - "enzyme"); -#endif LimitVar = Exp.expandCodeFor(Limit, CanonicalIV->getType(), loopContexts[L].preheader->getTerminator()); loopContexts[L].dynamic = false; @@ -764,13 +754,8 @@ bool CacheUtility::getContext(BasicBlock *BB, LoopContext &loopContext, MaxIterations = SE.getZeroExtendExpr(MaxIterations, CanonicalIV->getType()); -#if LLVM_VERSION_MAJOR >= 12 SCEVExpander Exp(SE, BB->getParent()->getParent()->getDataLayout(), "enzyme"); -#else - fake::SCEVExpander Exp(SE, BB->getParent()->getParent()->getDataLayout(), - "enzyme"); -#endif loopContexts[L].maxLimit = Exp.expandCodeFor(MaxIterations, CanonicalIV->getType(), @@ -1403,18 +1388,14 @@ void CacheUtility::storeInstructionInCache(LimitContext ctx, } #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 15 if (tostore->getContext().supportsTypedPointers()) { -#endif if (tostore->getType() != loc->getType()->getPointerElementType()) { llvm::errs() << "val: " << *val << "\n"; llvm::errs() << "tostore: " << *tostore << "\n"; llvm::errs() << "loc: " << *loc << "\n"; } assert(tostore->getType() == loc->getType()->getPointerElementType()); -#if LLVM_VERSION_MAJOR >= 15 } -#endif #endif StoreInst *storeinst = v.CreateStore(tostore, loc); diff --git a/enzyme/Enzyme/CallDerivatives.cpp b/enzyme/Enzyme/CallDerivatives.cpp index fd59790e11d9..de29e42be47e 100644 --- a/enzyme/Enzyme/CallDerivatives.cpp +++ b/enzyme/Enzyme/CallDerivatives.cpp @@ -439,11 +439,7 @@ void AdjointGenerator::handleMPI(llvm::CallInst &call, llvm::Function *called, Builder2, /*lookup*/ true)); cal->setCallingConv(dwait->getCallingConv()); cal->setDebugLoc(gutils->getNewFromOriginal(call.getDebugLoc())); -#if LLVM_VERSION_MAJOR >= 14 cal->addFnAttr(Attribute::AlwaysInline); -#else - cal->addAttribute(AttributeList::FunctionIndex, Attribute::AlwaysInline); -#endif Builder2.CreateBr(endBlock); { auto found = gutils->reverseBlockToPrimal.find(endBlock); @@ -605,11 +601,7 @@ void AdjointGenerator::handleMPI(llvm::CallInst &call, llvm::Function *called, Builder2, /*lookup*/ true)); cal->setCallingConv(dwait->getCallingConv()); cal->setDebugLoc(gutils->getNewFromOriginal(call.getDebugLoc())); -#if LLVM_VERSION_MAJOR >= 14 cal->addFnAttr(Attribute::AlwaysInline); -#else - cal->addAttribute(AttributeList::FunctionIndex, Attribute::AlwaysInline); -#endif Builder2.CreateBr(eloopBlock); Builder2.SetInsertPoint(eloopBlock); @@ -689,9 +681,7 @@ void AdjointGenerator::handleMPI(llvm::CallInst &call, llvm::Function *called, Type *statusType = nullptr; #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 15 if (called->getContext().supportsTypedPointers()) { -#endif if (Function *recvfn = called->getParent()->getFunction("MPI_Recv")) { auto statusArg = recvfn->arg_end(); statusArg--; @@ -704,9 +694,7 @@ void AdjointGenerator::handleMPI(llvm::CallInst &call, llvm::Function *called, if (auto PT = dyn_cast(statusArg->getType())) statusType = PT->getPointerElementType(); } -#if LLVM_VERSION_MAJOR >= 15 } -#endif #endif if (statusType == nullptr) { statusType = ArrayType::get(Type::getInt8Ty(call.getContext()), 24); @@ -2368,11 +2356,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( IRBuilder<> Builder2(&call); getReverseBuilder(Builder2); SmallVector args; -#if LLVM_VERSION_MAJOR >= 14 for (auto &arg : begin_call->args()) -#else - for (auto &arg : begin_call->arg_operands()) -#endif { bool primalUsed = false; bool shadowUsed = false; @@ -2413,11 +2397,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( } if (funcName == "llvm.julia.gc_preserve_begin") { SmallVector args; -#if LLVM_VERSION_MAJOR >= 14 for (auto &arg : call.args()) -#else - for (auto &arg : call.arg_operands()) -#endif { bool primalUsed = false; bool shadowUsed = false; @@ -2602,11 +2582,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( if (gutils->isConstantValue(call.getArgOperand(3))) return true; SmallVector args; -#if LLVM_VERSION_MAJOR >= 14 for (auto &arg : call.args()) -#else - for (auto &arg : call.arg_operands()) -#endif { if (gutils->isConstantValue(arg)) args.push_back(gutils->getNewFromOriginal(arg)); @@ -2683,11 +2659,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( else { SmallVector args; size_t i = 0; -#if LLVM_VERSION_MAJOR >= 14 for (auto &arg : call.args()) -#else - for (auto &arg : call.arg_operands()) -#endif { if (gutils->isConstantValue(arg) || (funcName == "__dynamic_cast" && i > 0) || @@ -2782,11 +2754,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( (Mode == DerivativeMode::ReverseModeGradient && backwardsShadow)) { SmallVector iargs; IRBuilder<> BuilderZ(gutils->getNewFromOriginal(&call)); -#if LLVM_VERSION_MAJOR >= 14 for (auto &arg : call.args()) -#else - for (auto &arg : call.arg_operands()) -#endif { if (!gutils->isConstantValue(arg)) { Value *ptrshadow = gutils->invertPointerM(arg, BuilderZ); @@ -2968,11 +2936,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( IRBuilder<> bb(placeholder); SmallVector args; -#if LLVM_VERSION_MAJOR >= 14 for (auto &arg : call.args()) -#else - for (auto &arg : call.arg_operands()) -#endif { args.push_back(gutils->getNewFromOriginal(arg)); } @@ -3067,17 +3031,10 @@ bool AdjointGenerator::handleKnownCallDerivatives( cast(anti)->setDebugLoc(dbgLoc); if (anti->getType()->isPointerTy()) { -#if LLVM_VERSION_MAJOR >= 14 cast(anti)->addAttributeAtIndex( AttributeList::ReturnIndex, Attribute::NoAlias); cast(anti)->addAttributeAtIndex( AttributeList::ReturnIndex, Attribute::NonNull); -#else - cast(anti)->addAttribute(AttributeList::ReturnIndex, - Attribute::NoAlias); - cast(anti)->addAttribute(AttributeList::ReturnIndex, - Attribute::NonNull); -#endif if (funcName == "malloc" || funcName == "_Znwm" || funcName == "??2@YAPAXI@Z" || @@ -3086,7 +3043,6 @@ bool AdjointGenerator::handleKnownCallDerivatives( unsigned derefBytes = ci->getLimitedValue(); CallInst *cal = cast(gutils->getNewFromOriginal(&call)); -#if LLVM_VERSION_MAJOR >= 14 cast(anti)->addDereferenceableRetAttr(derefBytes); cal->addDereferenceableRetAttr(derefBytes); #if !defined(FLANG) && !defined(ROCM) @@ -3104,20 +3060,6 @@ bool AdjointGenerator::handleKnownCallDerivatives( Attribute::NoAlias); cal->addAttributeAtIndex(AttributeList::ReturnIndex, Attribute::NonNull); -#else - cast(anti)->addDereferenceableAttr( - llvm::AttributeList::ReturnIndex, derefBytes); - cal->addDereferenceableAttr( - llvm::AttributeList::ReturnIndex, derefBytes); - cast(anti)->addDereferenceableOrNullAttr( - llvm::AttributeList::ReturnIndex, derefBytes); - cal->addDereferenceableOrNullAttr( - llvm::AttributeList::ReturnIndex, derefBytes); - cal->addAttribute(AttributeList::ReturnIndex, - Attribute::NoAlias); - cal->addAttribute(AttributeList::ReturnIndex, - Attribute::NonNull); -#endif } } if (funcName == "julia.gc_alloc_obj" || @@ -3171,9 +3113,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( Type *elTy = Type::getInt8Ty(call.getContext()); std::string name = ""; #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 13 if (call.getContext().supportsTypedPointers()) { -#endif for (auto U : call.users()) { if (hasMetadata(cast(U), "enzyme_caststack")) { elTy = U->getType()->getPointerElementType(); @@ -3188,9 +3128,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( break; } } -#if LLVM_VERSION_MAJOR >= 13 } -#endif #endif auto rule = [&](Value *anti) { bb.SetInsertPoint(cast(anti)); @@ -3208,36 +3146,28 @@ bool AdjointGenerator::handleKnownCallDerivatives( ->setAlignment(Align(Alignment)); } #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 13 if (call.getContext().supportsTypedPointers()) { -#endif if (anti->getType()->getPointerElementType() != elTy) replacement = bb.CreatePointerCast( replacement, PointerType::getUnqual( anti->getType()->getPointerElementType())); -#if LLVM_VERSION_MAJOR >= 13 } -#endif #endif if (int AS = cast(anti->getType()) ->getAddressSpace()) { llvm::PointerType *PT; #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 13 if (call.getContext().supportsTypedPointers()) { -#endif PT = PointerType::get( anti->getType()->getPointerElementType(), AS); #endif -#if LLVM_VERSION_MAJOR >= 13 #if LLVM_VERSION_MAJOR < 17 } else { #endif PT = PointerType::get(anti->getContext(), AS); #if LLVM_VERSION_MAJOR < 17 } -#endif #endif replacement = bb.CreateAddrSpaceCast(replacement, PT); cast(replacement) @@ -3285,13 +3215,8 @@ bool AdjointGenerator::handleKnownCallDerivatives( auto CI = freeKnownAllocation(Builder2, tofree, funcName, dbgLoc, gutils->TLI, &call, gutils); if (CI) -#if LLVM_VERSION_MAJOR >= 14 CI->addAttributeAtIndex(AttributeList::FirstArgIndex, Attribute::NonNull); -#else - CI->addAttribute(AttributeList::FirstArgIndex, - Attribute::NonNull); -#endif }; applyChainRule(Builder2, rule, tofree); } @@ -3301,11 +3226,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( getForwardBuilder(Builder2); SmallVector args; -#if LLVM_VERSION_MAJOR >= 14 for (unsigned i = 0; i < call.arg_size(); ++i) -#else - for (unsigned i = 0; i < call.getNumArgOperands(); ++i) -#endif { auto arg = call.getArgOperand(i); args.push_back(gutils->getNewFromOriginal(arg)); @@ -3381,9 +3302,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( Type *elTy = Type::getInt8Ty(call.getContext()); Instruction *I = nullptr; #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 15 if (call.getContext().supportsTypedPointers()) { -#endif for (auto U : call.users()) { if (hasMetadata(cast(U), "enzyme_caststack")) { elTy = U->getType()->getPointerElementType(); @@ -3398,9 +3317,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( break; } } -#if LLVM_VERSION_MAJOR >= 15 } -#endif #endif Value *replacement = B.CreateAlloca(elTy, Size); if (I) @@ -3416,34 +3333,26 @@ bool AdjointGenerator::handleKnownCallDerivatives( cast(replacement)->setAlignment(Align(Alignment)); } #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 13 if (call.getContext().supportsTypedPointers()) { -#endif if (call.getType()->getPointerElementType() != elTy) replacement = B.CreatePointerCast( replacement, PointerType::getUnqual(call.getType()->getPointerElementType())); -#if LLVM_VERSION_MAJOR >= 13 } -#endif #endif if (int AS = cast(call.getType())->getAddressSpace()) { llvm::PointerType *PT; #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 13 if (call.getContext().supportsTypedPointers()) { -#endif PT = PointerType::get(call.getType()->getPointerElementType(), AS); #endif -#if LLVM_VERSION_MAJOR >= 13 #if LLVM_VERSION_MAJOR < 17 } else { #endif PT = PointerType::get(call.getContext(), AS); #if LLVM_VERSION_MAJOR < 17 } -#endif #endif replacement = B.CreateAddrSpaceCast(replacement, PT); cast(replacement) @@ -3716,11 +3625,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( SmallVector args; for (size_t i = 0; i < 2; i++) args.push_back(gutils->getNewFromOriginal(call.getArgOperand(i))); -#if LLVM_VERSION_MAJOR >= 14 for (size_t i = 2; i < call.arg_size(); ++i) -#else - for (size_t i = 2; i < call.getNumArgOperands(); ++i) -#endif args.push_back(gutils->invertPointerM(call.getArgOperand(0), BuilderZ)); Value *res = UndefValue::get(gutils->getShadowType(call.getType())); @@ -3729,11 +3634,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( } else { for (size_t w = 0; w < gutils->getWidth(); ++w) { SmallVector targs = {args[0], args[1]}; -#if LLVM_VERSION_MAJOR >= 14 for (size_t i = 2; i < call.arg_size(); ++i) -#else - for (size_t i = 2; i < call.getNumArgOperands(); ++i) -#endif targs.push_back(GradientUtils::extractMeta(BuilderZ, args[i], w)); auto tres = BuilderZ.CreateCall(called, targs); @@ -3812,14 +3713,10 @@ bool AdjointGenerator::handleKnownCallDerivatives( Value *val = nullptr; llvm::Type *PT = getInt8PtrTy(call.getContext()); #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 15 if (call.getContext().supportsTypedPointers()) { -#endif if (isa(call.getArgOperand(0)->getType())) PT = call.getArgOperand(0)->getType()->getPointerElementType(); -#if LLVM_VERSION_MAJOR >= 15 } -#endif #endif if (Mode == DerivativeMode::ReverseModePrimal || Mode == DerivativeMode::ReverseModeCombined) { @@ -3879,14 +3776,10 @@ bool AdjointGenerator::handleKnownCallDerivatives( Value *val; llvm::Type *PT = getInt8PtrTy(call.getContext()); #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 15 if (call.getContext().supportsTypedPointers()) { -#endif if (isa(call.getArgOperand(0)->getType())) PT = call.getArgOperand(0)->getType()->getPointerElementType(); -#if LLVM_VERSION_MAJOR >= 15 } -#endif #endif if (!constval) { Value *stream = nullptr; @@ -3909,11 +3802,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( SmallVector valtys; args.push_back(ptrshadow); valtys.push_back(ValueType::Shadow); -#if LLVM_VERSION_MAJOR >= 14 for (size_t i = 1; i < call.arg_size(); ++i) -#else - for (size_t i = 1; i < call.getNumArgOperands(); ++i) -#endif { args.push_back(gutils->getNewFromOriginal(call.getArgOperand(i))); valtys.push_back(ValueType::Primal); @@ -4177,11 +4066,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( auto rule = [&args](Value *tofree) { args.push_back(tofree); }; applyChainRule(Builder2, rule, tofree); -#if LLVM_VERSION_MAJOR >= 14 for (size_t i = 1; i < call.arg_size(); i++) -#else - for (size_t i = 1; i < call.getNumArgOperands(); i++) -#endif { args.push_back(gutils->getNewFromOriginal(call.getArgOperand(i))); } @@ -4298,11 +4183,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( IRBuilder<> Builder2(&call); getReverseBuilder(Builder2); -#if LLVM_VERSION_MAJOR >= 14 auto trace = call.getArgOperand(call.arg_size() - 1); -#else - auto trace = call.getArgOperand(call.getNumArgOperands() - 1); -#endif auto address = call.getArgOperand(0); auto dtrace = lookup(gutils->getNewFromOriginal(trace), Builder2); diff --git a/enzyme/Enzyme/Clang/EnzymeClang.cpp b/enzyme/Enzyme/Clang/EnzymeClang.cpp index f21e06591715..0e1e324dbc3c 100644 --- a/enzyme/Enzyme/Clang/EnzymeClang.cpp +++ b/enzyme/Enzyme/Clang/EnzymeClang.cpp @@ -47,9 +47,7 @@ constexpr auto StructKind = clang::TagTypeKind::Struct; constexpr auto StructKind = clang::TagTypeKind::TTK_Struct; #endif -#if LLVM_VERSION_MAJOR < 12 constexpr auto stringkind = clang::StringLiteral::StringKind::Ascii; -#endif template class EnzymeAction final : public clang::PluginASTAction { @@ -322,14 +320,9 @@ struct EnzymeFunctionLikeAttrInfo : public ParsedAttrInfo { auto DR = DeclRefExpr::Create(AST, NestedNameSpecifierLoc(), loc, FD, false, loc, FD->getType(), ExprValueKind::VK_LValue, FD, TemplateArgs); -#if LLVM_VERSION_MAJOR >= 13 auto rval = ExprValueKind::VK_PRValue; -#else - auto rval = ExprValueKind::VK_RValue; -#endif StringRef cstr = Literal->getString(); Expr *exprs[2] = { -#if LLVM_VERSION_MAJOR >= 12 ImplicitCastExpr::Create(AST, FT, CastKind::CK_FunctionToPointerDecay, DR, nullptr, rval, FPOptionsOverride()), ImplicitCastExpr::Create( @@ -339,17 +332,6 @@ struct EnzymeFunctionLikeAttrInfo : public ParsedAttrInfo { /*Pascal*/ false, AST.getStringLiteralArrayType(CharTy, cstr.size()), loc), nullptr, rval, FPOptionsOverride()) -#else - ImplicitCastExpr::Create(AST, FT, CastKind::CK_FunctionToPointerDecay, DR, - nullptr, rval), - ImplicitCastExpr::Create( - AST, AST.getPointerType(CharTy), CastKind::CK_ArrayToPointerDecay, - StringLiteral::Create( - AST, cstr, stringkind, - /*Pascal*/ false, - AST.getStringLiteralArrayType(CharTy, cstr.size()), loc), - nullptr, rval) -#endif }; auto IL = new (AST) InitListExpr(AST, loc, exprs, loc); V->setInit(IL); @@ -368,7 +350,6 @@ struct EnzymeFunctionLikeAttrInfo : public ParsedAttrInfo { } }; -#if LLVM_VERSION_MAJOR >= 12 static ParsedAttrInfoRegistry::Add X3("enzyme_function_like", ""); @@ -419,7 +400,6 @@ struct EnzymeShouldRecomputeAttrInfo : public ParsedAttrInfo { static ParsedAttrInfoRegistry::Add ESR("enzyme_shouldrecompute", ""); -#endif struct EnzymeInactiveAttrInfo : public ParsedAttrInfo { EnzymeInactiveAttrInfo() { @@ -496,21 +476,12 @@ struct EnzymeInactiveAttrInfo : public ParsedAttrInfo { auto DR = DeclRefExpr::Create( AST, NestedNameSpecifierLoc(), loc, cast(D), false, loc, T, ExprValueKind::VK_LValue, cast(D), TemplateArgs); -#if LLVM_VERSION_MAJOR >= 13 auto rval = ExprValueKind::VK_PRValue; -#else - auto rval = ExprValueKind::VK_RValue; -#endif Expr *expr = nullptr; if (isa(D)) { -#if LLVM_VERSION_MAJOR >= 12 expr = ImplicitCastExpr::Create(AST, FT, CastKind::CK_FunctionToPointerDecay, DR, nullptr, rval, FPOptionsOverride()); -#else - expr = ImplicitCastExpr::Create( - AST, FT, CastKind::CK_FunctionToPointerDecay, DR, nullptr, rval); -#endif } else { expr = UnaryOperator::Create(AST, DR, UnaryOperatorKind::UO_AddrOf, FT, rval, @@ -609,21 +580,12 @@ struct EnzymeNoFreeAttrInfo : public ParsedAttrInfo { auto DR = DeclRefExpr::Create( AST, NestedNameSpecifierLoc(), loc, cast(D), false, loc, T, ExprValueKind::VK_LValue, cast(D), TemplateArgs); -#if LLVM_VERSION_MAJOR >= 13 auto rval = ExprValueKind::VK_PRValue; -#else - auto rval = ExprValueKind::VK_RValue; -#endif Expr *expr = nullptr; if (isa(D)) { -#if LLVM_VERSION_MAJOR >= 12 expr = ImplicitCastExpr::Create(AST, FT, CastKind::CK_FunctionToPointerDecay, DR, nullptr, rval, FPOptionsOverride()); -#else - expr = ImplicitCastExpr::Create( - AST, FT, CastKind::CK_FunctionToPointerDecay, DR, nullptr, rval); -#endif } else { expr = UnaryOperator::Create(AST, DR, UnaryOperatorKind::UO_AddrOf, FT, rval, @@ -716,20 +678,11 @@ struct EnzymeSparseAccumulateAttrInfo : public ParsedAttrInfo { auto DR = DeclRefExpr::Create( AST, NestedNameSpecifierLoc(), loc, cast(D), false, loc, T, ExprValueKind::VK_LValue, cast(D), TemplateArgs); -#if LLVM_VERSION_MAJOR >= 13 auto rval = ExprValueKind::VK_PRValue; -#else - auto rval = ExprValueKind::VK_RValue; -#endif Expr *expr = nullptr; -#if LLVM_VERSION_MAJOR >= 12 expr = ImplicitCastExpr::Create(AST, FT, CastKind::CK_FunctionToPointerDecay, DR, nullptr, rval, FPOptionsOverride()); -#else - expr = ImplicitCastExpr::Create( - AST, FT, CastKind::CK_FunctionToPointerDecay, DR, nullptr, rval); -#endif if (expr->isValueDependent()) { unsigned ID = S.getDiagnostics().getCustomDiagID( diff --git a/enzyme/Enzyme/DiffeGradientUtils.cpp b/enzyme/Enzyme/DiffeGradientUtils.cpp index 20caf0104fd2..53dd9ec33f04 100644 --- a/enzyme/Enzyme/DiffeGradientUtils.cpp +++ b/enzyme/Enzyme/DiffeGradientUtils.cpp @@ -193,13 +193,9 @@ AllocaInst *DiffeGradientUtils::getDifferential(Value *val) { /*isTape*/ false); } #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 13 if (val->getContext().supportsTypedPointers()) { -#endif assert(differentials[val]->getType()->getPointerElementType() == type); -#if LLVM_VERSION_MAJOR >= 13 } -#endif #endif return differentials[val]; } @@ -709,17 +705,13 @@ void DiffeGradientUtils::setDiffe(Value *val, Value *toset, } Value *tostore = getDifferential(val); #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 13 if (toset->getContext().supportsTypedPointers()) { -#endif if (toset->getType() != tostore->getType()->getPointerElementType()) { llvm::errs() << "toset:" << *toset << "\n"; llvm::errs() << "tostore:" << *tostore << "\n"; } assert(toset->getType() == tostore->getType()->getPointerElementType()); -#if LLVM_VERSION_MAJOR >= 13 } -#endif #endif BuilderM.CreateStore(toset, tostore); } @@ -760,15 +752,11 @@ CallInst *DiffeGradientUtils::freeCache(BasicBlock *forwardPreheader, UnwrapMode::AttemptFullUnwrapWithLookup); Type *T; #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 15 if (metaforfree->getContext().supportsTypedPointers()) { -#endif T = metaforfree->getType()->getPointerElementType(); -#if LLVM_VERSION_MAJOR >= 15 } else { T = PointerType::getUnqual(metaforfree->getContext()); } -#endif #else T = PointerType::getUnqual(metaforfree->getContext()); #endif @@ -804,12 +792,8 @@ void DiffeGradientUtils::addToInvertedPtrDiffe(Instruction *orig, auto addingSize = (DL.getTypeSizeInBits(addingType) + 1) / 8; if (addingSize != size) { assert(size > addingSize); -#if LLVM_VERSION_MAJOR >= 12 addingType = VectorType::get(addingType, size / addingSize, /*isScalable*/ false); -#else - addingType = VectorType::get(addingType, size / addingSize); -#endif size = (size / addingSize) * addingSize; } @@ -832,13 +816,9 @@ void DiffeGradientUtils::addToInvertedPtrDiffe(Instruction *orig, bool needsCast = false; #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 13 if (origptr->getContext().supportsTypedPointers()) { -#endif needsCast = origptr->getType()->getPointerElementType() != addingType; -#if LLVM_VERSION_MAJOR >= 13 } -#endif #endif assert(ptr); @@ -980,12 +960,8 @@ void DiffeGradientUtils::addToInvertedPtrDiffe(Instruction *orig, */ AtomicRMWInst::BinOp op = AtomicRMWInst::FAdd; if (auto vt = dyn_cast(addingType)) { -#if LLVM_VERSION_MAJOR >= 12 assert(!vt->getElementCount().isScalable()); size_t numElems = vt->getElementCount().getKnownMinValue(); -#else - size_t numElems = vt->getNumElements(); -#endif auto rule = [&](Value *dif, Value *ptr) { for (size_t i = 0; i < numElems; ++i) { auto vdif = BuilderM.CreateExtractElement(dif, i); @@ -994,7 +970,6 @@ void DiffeGradientUtils::addToInvertedPtrDiffe(Instruction *orig, ConstantInt::get(Type::getInt64Ty(vt->getContext()), 0), ConstantInt::get(Type::getInt32Ty(vt->getContext()), i)}; auto vptr = BuilderM.CreateGEP(addingType, ptr, Idxs); -#if LLVM_VERSION_MAJOR >= 13 MaybeAlign alignv = align; if (alignv) { if (start != 0) { @@ -1008,28 +983,12 @@ void DiffeGradientUtils::addToInvertedPtrDiffe(Instruction *orig, BuilderM.CreateAtomicRMW(op, vptr, vdif, alignv, AtomicOrdering::Monotonic, SyncScope::System); -#else - AtomicRMWInst *rmw = BuilderM.CreateAtomicRMW( - op, vptr, vdif, AtomicOrdering::Monotonic, SyncScope::System); - if (align) { - auto alignv = align.getValue().value(); - if (start != 0) { - assert(alignv != 0); - // todo make better alignment calculation - if (start % alignv != 0) { - alignv = 1; - } - } - rmw->setAlignment(Align(alignv)); - } -#endif } }; applyChainRule(BuilderM, rule, dif, ptr); } else { auto rule = [&](Value *dif, Value *ptr) { dif = SanitizeDerivatives(orig, dif, BuilderM); -#if LLVM_VERSION_MAJOR >= 13 MaybeAlign alignv = align; if (alignv) { if (start != 0) { @@ -1042,21 +1001,6 @@ void DiffeGradientUtils::addToInvertedPtrDiffe(Instruction *orig, } BuilderM.CreateAtomicRMW(op, ptr, dif, alignv, AtomicOrdering::Monotonic, SyncScope::System); -#else - AtomicRMWInst *rmw = BuilderM.CreateAtomicRMW( - op, ptr, dif, AtomicOrdering::Monotonic, SyncScope::System); - if (align) { - auto alignv = align.getValue().value(); - if (start != 0) { - assert(alignv != 0); - // todo make better alignment calculation - if (start % alignv != 0) { - alignv = 1; - } - } - rmw->setAlignment(Align(alignv)); - } -#endif }; applyChainRule(BuilderM, rule, dif, ptr); } diff --git a/enzyme/Enzyme/DifferentialUseAnalysis.cpp b/enzyme/Enzyme/DifferentialUseAnalysis.cpp index a024d282e095..b36dfe37d0ea 100644 --- a/enzyme/Enzyme/DifferentialUseAnalysis.cpp +++ b/enzyme/Enzyme/DifferentialUseAnalysis.cpp @@ -594,11 +594,7 @@ bool DifferentialUseAnalysis::is_use_directly_needed_in_reverse( return true; } if (shadow) { -#if LLVM_VERSION_MAJOR >= 14 auto sz = CI->arg_size(); -#else - auto sz = CI->getNumArgOperands(); -#endif bool isStored = false; // First pointer is the destination for (size_t i = 1; i < sz; i++) @@ -628,11 +624,7 @@ bool DifferentialUseAnalysis::is_use_directly_needed_in_reverse( if (shouldDisableNoWrite(CI)) { writeOnlyNoCapture = false; } -#if LLVM_VERSION_MAJOR >= 14 for (size_t i = 0; i < CI->arg_size(); i++) -#else - for (size_t i = 0; i < CI->getNumArgOperands(); i++) -#endif { if (val == CI->getArgOperand(i)) { if (!isNoCapture(CI, i)) { @@ -943,11 +935,7 @@ void DifferentialUseAnalysis::minCut(const DataLayout &DL, LoopInfo &OrigLI, noncapture = true; } else if (auto CI = dyn_cast(next)) { bool captures = false; -#if LLVM_VERSION_MAJOR >= 14 for (size_t i = 0; i < CI->arg_size(); i++) -#else - for (size_t i = 0; i < CI->getNumArgOperands(); i++) -#endif { if (CI->getArgOperand(i) == V && !isNoCapture(CI, i)) { captures = true; @@ -1070,11 +1058,7 @@ bool DifferentialUseAnalysis::callShouldNotUseDerivative( // Next test if any allocation could be stored into one of the // arguments. if (!escapingNeededAllocation) -#if LLVM_VERSION_MAJOR >= 14 for (unsigned i = 0; i < call.arg_size(); ++i) -#else - for (unsigned i = 0; i < call.getNumArgOperands(); ++i) -#endif { Value *a = call.getOperand(i); diff --git a/enzyme/Enzyme/DifferentialUseAnalysis.h b/enzyme/Enzyme/DifferentialUseAnalysis.h index c487eb7004a3..e82072cd37d1 100644 --- a/enzyme/Enzyme/DifferentialUseAnalysis.h +++ b/enzyme/Enzyme/DifferentialUseAnalysis.h @@ -262,11 +262,7 @@ inline bool is_value_needed_in_reverse( auto name = getFuncNameFromCall(CB); if (name == "julia.write_barrier" || name == "julia.write_barrier_binding") { -#if LLVM_VERSION_MAJOR >= 14 auto sz = CB->arg_size(); -#else - auto sz = CB->getNumArgOperands(); -#endif // First pointer is the destination for (size_t i = 1; i < sz; i++) isStored |= inst == CB->getArgOperand(i); diff --git a/enzyme/Enzyme/Enzyme.cpp b/enzyme/Enzyme/Enzyme.cpp index a3f13df70e06..e0cba6f3677c 100644 --- a/enzyme/Enzyme/Enzyme.cpp +++ b/enzyme/Enzyme/Enzyme.cpp @@ -85,11 +85,9 @@ #include "llvm/Transforms/Utils.h" -#if LLVM_VERSION_MAJOR >= 13 #include "llvm/Transforms/IPO/Attributor.h" #include "llvm/Transforms/IPO/OpenMPOpt.h" #include "llvm/Transforms/Utils/Mem2Reg.h" -#endif #include "BlasAttributor.inc" @@ -120,10 +118,8 @@ llvm::cl::opt EnzymeTruncateAll( "Truncate all floating point operations. " "E.g. \"64to32\" or \"64to-\".")); -#if LLVM_VERSION_MAJOR >= 14 #define addAttribute addAttributeAtIndex #define getAttribute getAttributeAtIndex -#endif bool attributeKnownFunctions(llvm::Function &F) { bool changed = false; if (F.getName() == "fprintf") { @@ -391,17 +387,13 @@ castToDiffeFunctionArgType(IRBuilder<> &Builder, llvm::CallInst *CI, if (auto PT = dyn_cast(destType)) { if (ptr->getAddressSpace() != PT->getAddressSpace()) { #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 15 if (CI->getContext().supportsTypedPointers()) { -#endif res = Builder.CreateAddrSpaceCast( res, PointerType::get(ptr->getPointerElementType(), PT->getAddressSpace())); -#if LLVM_VERSION_MAJOR >= 15 } else { res = Builder.CreateAddrSpaceCast(res, PT); } -#endif #else res = Builder.CreateAddrSpaceCast(res, PT); #endif @@ -685,12 +677,7 @@ class EnzymeBase { { unsigned width = 1; -#if LLVM_VERSION_MAJOR >= 14 for (auto [i, found] = std::tuple{0u, false}; i < CI->arg_size(); ++i) -#else - for (auto [i, found] = std::tuple{0u, false}; i < CI->getNumArgOperands(); - ++i) -#endif { Value *arg = CI->getArgOperand(i); @@ -703,11 +690,7 @@ class EnzymeBase { return {}; } -#if LLVM_VERSION_MAJOR >= 14 if (i + 1 >= CI->arg_size()) -#else - if (i + 1 >= CI->getNumArgOperands()) -#endif { EmitFailure("MissingVectorWidth", CI->getDebugLoc(), CI, "constant integer followong enzyme_width is missing", @@ -796,12 +779,7 @@ class EnzymeBase { if (fn->hasParamAttribute(0, Attribute::StructRet)) { Type *Ty = nullptr; -#if LLVM_VERSION_MAJOR >= 12 Ty = fn->getParamAttribute(0, Attribute::StructRet).getValueAsType(); -#else - Type *fnsrety = cast(FT->getParamType(0)); - Ty = fnsrety->getPointerElementType(); -#endif if (whatType(Ty, mode) != DIFFE_TYPE::CONSTANT) { retType = DIFFE_TYPE::DUP_ARG; } @@ -817,11 +795,7 @@ class EnzymeBase { fn->getFunctionType()->getNumParams(), !(mode == DerivativeMode::ReverseModeCombined)); -#if LLVM_VERSION_MAJOR >= 14 for (unsigned i = 1 + sret; i < CI->arg_size(); ++i) -#else - for (unsigned i = 1 + sret; i < CI->getNumArgOperands(); ++i) -#endif { Value *res = CI->getArgOperand(i); auto metaString = getMetadataName(res); @@ -862,20 +836,10 @@ class EnzymeBase { const DataLayout &DL = CI->getParent()->getModule()->getDataLayout(); Type *Ty = nullptr; -#if LLVM_VERSION_MAJOR >= 12 Ty = fn->getParamAttribute(0, Attribute::StructRet).getValueAsType(); -#else - Type *fnsrety = cast(FT->getParamType(0)); - Ty = fnsrety->getPointerElementType(); -#endif Type *CTy = nullptr; -#if LLVM_VERSION_MAJOR >= 12 CTy = CI->getAttribute(AttributeList::FirstArgIndex, Attribute::StructRet) .getValueAsType(); -#else - CTy = cast(CI->getArgOperand(0)->getType()) - ->getPointerElementType(); -#endif auto FnSize = (DL.getTypeSizeInBits(Ty) / 8); auto CSize = CTy ? (DL.getTypeSizeInBits(CTy) / 8) : 0; auto count = ((mode == DerivativeMode::ForwardMode || @@ -955,11 +919,7 @@ class EnzymeBase { ssize_t interleaved = -1; size_t maxsize; -#if LLVM_VERSION_MAJOR >= 14 maxsize = CI->arg_size(); -#else - maxsize = CI->getNumArgOperands(); -#endif size_t num_args = maxsize; for (unsigned i = 1 + sret; i < maxsize; ++i) { Value *res = CI->getArgOperand(i); @@ -1196,11 +1156,7 @@ class EnzymeBase { differet = res; if (CI->paramHasAttr(i, Attribute::ByVal)) { Type *T = nullptr; -#if LLVM_VERSION_MAJOR > 12 T = CI->getParamAttr(i, Attribute::ByVal).getValueAsType(); -#else - T = differet->getType()->getPointerElementType(); -#endif differet = Builder.CreateLoad(T, differet); } if (differet->getType() != fn->getReturnType()) @@ -1230,11 +1186,7 @@ class EnzymeBase { tape = res; if (CI->paramHasAttr(i, Attribute::ByVal)) { Type *T = nullptr; -#if LLVM_VERSION_MAJOR > 12 T = CI->getParamAttr(i, Attribute::ByVal).getValueAsType(); -#else - T = tape->getType()->getPointerElementType(); -#endif tape = Builder.CreateLoad(T, tape); } continue; @@ -1263,17 +1215,13 @@ class EnzymeBase { if (auto PT = dyn_cast(PTy)) { if (ptr->getAddressSpace() != PT->getAddressSpace()) { #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 15 if (CI->getContext().supportsTypedPointers()) { -#endif res = Builder.CreateAddrSpaceCast( res, PointerType::get(ptr->getPointerElementType(), PT->getAddressSpace())); -#if LLVM_VERSION_MAJOR >= 15 } else { res = Builder.CreateAddrSpaceCast(res, PT); } -#endif #else res = Builder.CreateAddrSpaceCast(res, PT); #endif @@ -1418,18 +1366,14 @@ class EnzymeBase { dt = ConcreteType(a.getType()->getScalarType()); } else if (a.getType()->isPointerTy()) { #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 13 if (a.getContext().supportsTypedPointers()) { -#endif auto et = a.getType()->getPointerElementType(); if (et->isFPOrFPVectorTy()) { dt = TypeTree(ConcreteType(et->getScalarType())).Only(-1, nullptr); } else if (et->isPointerTy()) { dt = TypeTree(ConcreteType(BaseType::Pointer)).Only(-1, nullptr); } -#if LLVM_VERSION_MAJOR >= 13 } -#endif #endif dt.insert({}, BaseType::Pointer); } else if (a.getType()->isIntOrIntVectorTy()) { @@ -1571,11 +1515,7 @@ class EnzymeBase { arg_types.push_back(BATCH_TYPE::VECTOR); } -#if LLVM_VERSION_MAJOR >= 14 for (unsigned i = 1 + sret; i < CI->arg_size(); ++i) -#else - for (unsigned i = 1 + sret; i < CI->getNumArgOperands(); ++i) -#endif { Value *res = CI->getArgOperand(i); @@ -1632,11 +1572,7 @@ class EnzymeBase { bool batch = batchOffset.count(i - 1) != 0; for (unsigned v = 0; v < width; ++v) { -#if LLVM_VERSION_MAJOR >= 14 if (i >= CI->arg_size()) -#else - if (i >= CI->getNumArgOperands()) -#endif { EmitFailure("MissingVectorArg", CI->getDebugLoc(), CI, "__enzyme_batch missing vector argument at index ", i, @@ -1706,13 +1642,9 @@ class EnzymeBase { Type *retElemType = nullptr; if (CI->hasStructRetAttr()) { ret = CI->getArgOperand(0); -#if LLVM_VERSION_MAJOR >= 12 retElemType = CI->getAttribute(AttributeList::FirstArgIndex, Attribute::StructRet) .getValueAsType(); -#else - retElemType = ret->getType()->getPointerElementType(); -#endif } ReplaceOriginalCall(Builder, ret, retElemType, batch, CI, DerivativeMode::ForwardMode); @@ -2070,13 +2002,9 @@ class EnzymeBase { Type *retElemType = nullptr; if (CI->hasStructRetAttr()) { ret = CI->getArgOperand(0); -#if LLVM_VERSION_MAJOR >= 12 retElemType = CI->getAttribute(AttributeList::FirstArgIndex, Attribute::StructRet) .getValueAsType(); -#else - retElemType = ret->getType()->getPointerElementType(); -#endif } return HandleAutoDiff(CI, CI->getCallingConv(), ret, retElemType, args, @@ -2202,13 +2130,9 @@ class EnzymeBase { Type *retElemType = nullptr; if (CI->hasStructRetAttr()) { ret = CI->getArgOperand(0); -#if LLVM_VERSION_MAJOR >= 12 retElemType = CI->getAttribute(AttributeList::FirstArgIndex, Attribute::StructRet) .getValueAsType(); -#else - retElemType = ret->getType()->getPointerElementType(); -#endif } bool status = HandleAutoDiff( @@ -2396,11 +2320,7 @@ class EnzymeBase { if (!Fn) continue; -#if LLVM_VERSION_MAJOR >= 14 size_t num_args = CI->arg_size(); -#else - size_t num_args = CI->getNumArgOperands(); -#endif if (Fn->getName().contains("__enzyme_todense")) { #if LLVM_VERSION_MAJOR >= 16 @@ -2818,11 +2738,7 @@ class EnzymeBase { Value *fn = CI->getArgOperand(0); SmallVector Args; SmallVector ArgTypes; -#if LLVM_VERSION_MAJOR >= 14 for (size_t i = 1; i < CI->arg_size(); ++i) -#else - for (size_t i = 1; i < CI->getNumArgOperands(); ++i) -#endif { Args.push_back(CI->getArgOperand(i)); ArgTypes.push_back(CI->getArgOperand(i)->getType()); @@ -2960,7 +2876,7 @@ class EnzymeBase { // dead internal functions, which invalidates Enzyme's cache // code left here to re-enable upon Attributor patch -#if LLVM_VERSION_MAJOR >= 13 && !defined(FLANG) && !defined(ROCM) +#if !defined(FLANG) && !defined(ROCM) AnalysisGetter AG(Logic.PPC.FAM); SetVector Functions; @@ -3001,16 +2917,10 @@ class EnzymeBase { //&AAPotentialValues::ID, }; -#if LLVM_VERSION_MAJOR >= 15 AttributorConfig aconfig(CGUpdater); aconfig.Allowed = &Allowed; aconfig.DeleteFns = false; Attributor A(Functions, InfoCache, aconfig); -#else - - Attributor A(Functions, InfoCache, CGUpdater, &Allowed, - /*DeleteFns*/ false); -#endif for (Function *F : Functions) { // Populate the Attributor with abstract attribute opportunities in // the function and the information cache with IR information. @@ -3069,7 +2979,6 @@ class EnzymeBase { } } -#if LLVM_VERSION_MAJOR >= 13 if (Logic.PostOpt && EnzymeOMPOpt) { OpenMPOptPass().run(M, Logic.PPC.MAM); /// Attributor is run second time for promoted args to get attributes. @@ -3079,7 +2988,6 @@ class EnzymeBase { PromotePass().run(F, Logic.PPC.FAM); changed = true; } -#endif std::set done; for (Function &F : M) { @@ -3142,11 +3050,7 @@ class EnzymeBase { Function *samplefn = GetFunctionFromValue(CI->getOperand(0)); unsigned expected = samplefn->getFunctionType()->getNumParams() + 3; -#if LLVM_VERSION_MAJOR >= 14 unsigned actual = CI->arg_size(); -#else - unsigned actual = CI->getNumArgOperands(); -#endif if (actual - 3 != samplefn->getFunctionType()->getNumParams()) { EmitFailure("IllegalNumberOfArguments", CI->getDebugLoc(), CI, "Illegal number of arguments passed to call to " @@ -3201,11 +3105,7 @@ class EnzymeBase { Function *pdf = GetFunctionFromValue(CI->getArgOperand(1)); unsigned expected = pdf->getFunctionType()->getNumParams() - 1; -#if LLVM_VERSION_MAJOR >= 14 unsigned actual = CI->arg_size(); -#else - unsigned actual = CI->getNumArgOperands(); -#endif if (actual - 3 != expected) { EmitFailure("IllegalNumberOfArguments", CI->getDebugLoc(), CI, "Illegal number of arguments passed to call to " @@ -3284,18 +3184,9 @@ class EnzymeBase { PB.registerLoopAnalyses(LAM); PB.registerCGSCCAnalyses(CGAM); PB.crossRegisterProxies(LAM, FAM, CGAM, MAM); -#if LLVM_VERSION_MAJOR >= 14 auto PM = PB.buildModuleSimplificationPipeline(OptimizationLevel::O2, ThinOrFullLTOPhase::None); -#elif LLVM_VERSION_MAJOR >= 12 - auto PM = PB.buildModuleSimplificationPipeline( - PassBuilder::OptimizationLevel::O2, ThinOrFullLTOPhase::None); -#else - auto PM = PB.buildModuleSimplificationPipeline( - PassBuilder::OptimizationLevel::O2, PassBuilder::ThinLTOPhase::None); -#endif PM.run(M, MAM); -#if LLVM_VERSION_MAJOR >= 13 if (EnzymeOMPOpt) { OpenMPOptPass().run(M, MAM); /// Attributor is run second time for promoted args to get attributes. @@ -3304,7 +3195,6 @@ class EnzymeBase { if (!F.empty()) PromotePass().run(F, FAM); } -#endif } for (auto &F : M) { @@ -3380,7 +3270,6 @@ AnalysisKey EnzymeNewPM::Key; #include "TypeAnalysis/TypeAnalysisPrinter.h" #include "llvm/Passes/PassBuilder.h" #include "llvm/Transforms/IPO/AlwaysInliner.h" -#if LLVM_VERSION_MAJOR >= 15 #include "llvm/Transforms/AggressiveInstCombine/AggressiveInstCombine.h" #include "llvm/Transforms/IPO/CalledValuePropagation.h" #include "llvm/Transforms/IPO/ConstantMerge.h" @@ -3388,15 +3277,12 @@ AnalysisKey EnzymeNewPM::Key; #include "llvm/Transforms/IPO/DeadArgumentElimination.h" #include "llvm/Transforms/IPO/FunctionAttrs.h" #include "llvm/Transforms/IPO/GlobalDCE.h" -#endif #include "llvm/Transforms/IPO/GlobalOpt.h" -#if LLVM_VERSION_MAJOR >= 15 #include "llvm/Transforms/IPO/GlobalSplit.h" #include "llvm/Transforms/IPO/InferFunctionAttrs.h" #include "llvm/Transforms/IPO/SCCP.h" #include "llvm/Transforms/InstCombine/InstCombine.h" #include "llvm/Transforms/Scalar/CallSiteSplitting.h" -#endif #include "llvm/Transforms/Scalar/EarlyCSE.h" #include "llvm/Transforms/Scalar/Float2Int.h" #include "llvm/Transforms/Scalar/GVN.h" @@ -3404,7 +3290,6 @@ AnalysisKey EnzymeNewPM::Key; #include "llvm/Transforms/Scalar/LoopRotation.h" #include "llvm/Transforms/Scalar/LoopUnrollPass.h" #include "llvm/Transforms/Scalar/SROA.h" -#if LLVM_VERSION_MAJOR >= 12 // #include "llvm/Transforms/IPO/MemProfContextDisambiguation.h" #include "llvm/Transforms/IPO/ArgumentPromotion.h" #include "llvm/Transforms/Scalar/ConstraintElimination.h" @@ -3421,19 +3306,11 @@ AnalysisKey EnzymeNewPM::Key; #include "llvm/Transforms/Scalar/LoopFlatten.h" #include "llvm/Transforms/Scalar/MergedLoadStoreMotion.h" -#if LLVM_VERSION_MAJOR >= 15 -#if LLVM_VERSION_MAJOR < 14 -static InlineParams -getInlineParamsFromOptLevel(llvm::PassBuilder::OptimizationLevel Level) -#else static InlineParams getInlineParamsFromOptLevel(OptimizationLevel Level) -#endif { return getInlineParams(Level.getSpeedupLevel(), Level.getSizeLevel()); } -#endif -#if LLVM_VERSION_MAJOR >= 12 #include "llvm/Transforms/Scalar/LowerConstantIntrinsics.h" #include "llvm/Transforms/Scalar/LowerMatrixIntrinsics.h" namespace llvm { @@ -3448,124 +3325,15 @@ extern cl::opt SetLicmMssaOptCap; // extern cl::opt EnableMatrix; #define EnableMatrix false #define EnableModuleInliner false -#if LLVM_VERSION_MAJOR <= 14 -// extern cl::opt EnableFunctionSpecialization; -#define EnableFunctionSpecialization false -// extern cl::opt RunPartialInlining; -#define RunPartialInlining false -#endif } // namespace llvm -#if LLVM_VERSION_MAJOR <= 14 -#include "llvm/Transforms/IPO/CalledValuePropagation.h" -#include "llvm/Transforms/IPO/DeadArgumentElimination.h" -#include "llvm/Transforms/IPO/SCCP.h" -#include "llvm/Transforms/InstCombine/InstCombine.h" -#include "llvm/Transforms/Scalar/SimplifyCFG.h" -#if LLVM_VERSION_MAJOR >= 12 -#include "llvm/Transforms/Coroutines/CoroCleanup.h" -#endif -#include "llvm/Transforms/IPO/FunctionAttrs.h" -#include "llvm/Transforms/IPO/GlobalDCE.h" -#include "llvm/Transforms/IPO/PartialInlining.h" -#if LLVM_VERSION_MAJOR <= 12 -#include "llvm/Transforms/Utils/Mem2Reg.h" -#endif -#endif -#endif #endif void augmentPassBuilder(llvm::PassBuilder &PB) { -#if LLVM_VERSION_MAJOR < 14 - using OptimizationLevel = llvm::PassBuilder::OptimizationLevel; -#endif auto PB0 = new llvm::PassBuilder(PB); -#if LLVM_VERSION_MAJOR >= 12 auto prePass = [PB0](ModulePassManager &MPM, OptimizationLevel Level) -#else - auto prePass = [PB0](ModulePassManager &MPM) -#endif { -#if LLVM_VERSION_MAJOR < 12 - llvm_unreachable("New Pass manager pipeline unsupported at version <= 11"); -#else -#if LLVM_VERSION_MAJOR < 15 - ////// End of Module simplification - // Specialize functions with IPSCCP. -#if LLVM_VERSION_MAJOR >= 13 - if (EnableFunctionSpecialization && Level == OptimizationLevel::O3) - MPM.addPass(FunctionSpecializationPass()); -#endif - - // Interprocedural constant propagation now that basic cleanup has - // occurred and prior to optimizing globals. - // FIXME: This position in the pipeline hasn't been carefully - // considered in years, it should be re-analyzed. - MPM.addPass(IPSCCPPass()); - - // Attach metadata to indirect call sites indicating the set of - // functions they may target at run-time. This should follow - // IPSCCP. - MPM.addPass(CalledValuePropagationPass()); - - // Optimize globals to try and fold them into constants. - MPM.addPass(GlobalOptPass()); - - // Promote any localized globals to SSA registers. - // FIXME: Should this instead by a run of SROA? - // FIXME: We should probably run instcombine and simplifycfg - // afterward to delete control flows that are dead once globals - // have been folded to constants. - MPM.addPass(createModuleToFunctionPassAdaptor(PromotePass())); - - // Remove any dead arguments exposed by cleanups and constant - // folding globals. - MPM.addPass(DeadArgumentEliminationPass()); - - // Create a small function pass pipeline to cleanup after all the - // global optimizations. - FunctionPassManager GlobalCleanupPM; - GlobalCleanupPM.addPass(InstCombinePass()); - -#if LLVM_VERSION_MAJOR >= 14 - GlobalCleanupPM.addPass( - SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true))); -#else - GlobalCleanupPM.addPass(SimplifyCFGPass(SimplifyCFGOptions())); -#endif - MPM.addPass(createModuleToFunctionPassAdaptor(std::move(GlobalCleanupPM))); - - ThinOrFullLTOPhase Phase = ThinOrFullLTOPhase::None; -#if LLVM_VERSION >= 13 - bool EnableModuleInliner = false; - if (EnableModuleInliner) - MPM.addPass(PB0->buildModuleInlinerPipeline(Level, Phase)); - else -#endif - MPM.addPass(PB0->buildInlinerPipeline(Level, Phase)); - - FunctionPassManager CoroCleanupPM; - CoroCleanupPM.addPass(CoroCleanupPass()); - MPM.addPass(createModuleToFunctionPassAdaptor(std::move(CoroCleanupPM))); - - ////// Finished Module simplification, starting ModuleOptimization - // - // Optimize globals now that the module is fully simplified. - MPM.addPass(GlobalOptPass()); - MPM.addPass(GlobalDCEPass()); - - // Run partial inlining pass to partially inline functions that - // have large bodies. - if (RunPartialInlining) - MPM.addPass(PartialInlinerPass()); - - // Do RPO function attribute inference across the module to - // forward-propagate attributes where applicable. - // FIXME: Is this really an optimization rather than a - // canonicalization? - MPM.addPass(ReversePostOrderFunctionAttrsPass()); -#endif FunctionPassManager OptimizePM; OptimizePM.addPass(Float2IntPass()); OptimizePM.addPass(LowerConstantIntrinsicsPass()); @@ -3590,38 +3358,26 @@ void augmentPassBuilder(llvm::PassBuilder &PB) { OptimizePM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM))); MPM.addPass(createModuleToFunctionPassAdaptor(std::move(OptimizePM))); -#endif }; -#if LLVM_VERSION_MAJOR >= 12 auto loadPass = [prePass](ModulePassManager &MPM, OptimizationLevel Level) -#else - auto loadPass = [prePass](ModulePassManager &MPM) -#endif { MPM.addPass(PreserveNVVMNewPM(/*Begin*/ true)); if (!EnzymeEnable) return; -#if LLVM_VERSION_MAJOR >= 12 if (Level != OptimizationLevel::O0) prePass(MPM, Level); -#else - prePass(MPM); -#endif MPM.addPass(llvm::AlwaysInlinerPass()); FunctionPassManager OptimizerPM; FunctionPassManager OptimizerPM2; #if LLVM_VERSION_MAJOR >= 16 OptimizerPM.addPass(llvm::GVNPass()); OptimizerPM.addPass(llvm::SROAPass(llvm::SROAOptions::PreserveCFG)); -#elif LLVM_VERSION_MAJOR >= 14 +#else OptimizerPM.addPass(llvm::GVNPass()); OptimizerPM.addPass(llvm::SROAPass()); -#else - OptimizerPM.addPass(llvm::GVN()); - OptimizerPM.addPass(llvm::SROA()); #endif MPM.addPass(createModuleToFunctionPassAdaptor(std::move(OptimizerPM))); MPM.addPass(EnzymeNewPM(/*PostOpt=*/true)); @@ -3629,12 +3385,9 @@ void augmentPassBuilder(llvm::PassBuilder &PB) { #if LLVM_VERSION_MAJOR >= 16 OptimizerPM2.addPass(llvm::GVNPass()); OptimizerPM2.addPass(llvm::SROAPass(llvm::SROAOptions::PreserveCFG)); -#elif LLVM_VERSION_MAJOR >= 14 +#else OptimizerPM2.addPass(llvm::GVNPass()); OptimizerPM2.addPass(llvm::SROAPass()); -#else - OptimizerPM2.addPass(llvm::GVN()); - OptimizerPM2.addPass(llvm::SROA()); #endif LoopPassManager LPM1; @@ -3645,26 +3398,15 @@ void augmentPassBuilder(llvm::PassBuilder &PB) { MPM.addPass(GlobalOptPass()); }; // TODO need for perf reasons to move Enzyme pass to the pre vectorization. -#if LLVM_VERSION_MAJOR >= 15 PB.registerOptimizerEarlyEPCallback(loadPass); -#elif LLVM_VERSION_MAJOR >= 12 - PB.registerPipelineEarlySimplificationEPCallback(loadPass); -#else - PB.registerPipelineStartEPCallback(loadPass); -#endif -#if LLVM_VERSION_MAJOR >= 12 auto loadNVVM = [](ModulePassManager &MPM, OptimizationLevel) -#else - auto loadNVVM = [](ModulePassManager &MPM) -#endif { MPM.addPass(PreserveNVVMNewPM(/*Begin*/ true)); }; // We should register at vectorizer start for consistency, however, // that requires a functionpass, and we have a modulepass. // PB.registerVectorizerStartEPCallback(loadPass); PB.registerPipelineStartEPCallback(loadNVVM); -#if LLVM_VERSION_MAJOR >= 15 PB.registerFullLinkTimeOptimizationEarlyEPCallback(loadNVVM); auto preLTOPass = [](ModulePassManager &MPM, OptimizationLevel Level) { @@ -3904,7 +3646,6 @@ void augmentPassBuilder(llvm::PassBuilder &PB) { loadPass(MPM, Level); }; PB.registerFullLinkTimeOptimizationEarlyEPCallback(loadLTO); -#endif } void registerEnzyme(llvm::PassBuilder &PB) { diff --git a/enzyme/Enzyme/Enzyme.h b/enzyme/Enzyme/Enzyme.h index 3033477bd205..c3e9673d6bdf 100644 --- a/enzyme/Enzyme/Enzyme.h +++ b/enzyme/Enzyme/Enzyme.h @@ -25,11 +25,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Pass.h" -#if LLVM_VERSION_MAJOR >= 12 #include "llvm/Passes/PassBuilder.h" -#endif llvm::ModulePass *createEnzymePass(bool PostOpt = false); -#if LLVM_VERSION_MAJOR >= 12 void augmentPassBuilder(llvm::PassBuilder &PB); -#endif \ No newline at end of file diff --git a/enzyme/Enzyme/EnzymeLogic.cpp b/enzyme/Enzyme/EnzymeLogic.cpp index 45045d9702f8..3a31eef30a3d 100644 --- a/enzyme/Enzyme/EnzymeLogic.cpp +++ b/enzyme/Enzyme/EnzymeLogic.cpp @@ -90,11 +90,9 @@ #include "TraceGenerator.h" #include "Utils.h" -#if LLVM_VERSION_MAJOR >= 14 #define addAttribute addAttributeAtIndex #define getAttribute getAttributeAtIndex #define removeAttribute removeAttributeAtIndex -#endif using namespace llvm; @@ -337,10 +335,8 @@ struct CacheAnalysis { if (!inst2->mayWriteToMemory()) return false; -#if LLVM_VERSION_MAJOR >= 12 if (isa(inst2)) return false; -#endif if (unnecessaryBlocks.count(inst2->getParent())) { return false; @@ -367,10 +363,8 @@ struct CacheAnalysis { if (!mid->mayWriteToMemory()) return false; -#if LLVM_VERSION_MAJOR >= 12 if (isa(mid)) return false; -#endif if (unnecessaryBlocks.count(mid->getParent())) { return false; @@ -510,11 +504,7 @@ struct CacheAnalysis { // function to the callee. // because memory location x modified after parent returns => x modified // after callee returns. -#if LLVM_VERSION_MAJOR >= 14 for (unsigned i = 0; i < callsite_op->arg_size(); ++i) -#else - for (unsigned i = 0; i < callsite_op->getNumArgOperands(); ++i) -#endif { args.push_back(callsite_op->getArgOperand(i)); @@ -817,11 +807,7 @@ void calculateUnusedValuesInFunction( if (shouldDisableNoWrite(CI)) { writeOnlyNoCapture = false; } -#if LLVM_VERSION_MAJOR >= 14 for (size_t i = 0; i < CI->arg_size(); i++) -#else - for (size_t i = 0; i < CI->getNumArgOperands(); i++) -#endif { if (cur == CI->getArgOperand(i)) { if (!isNoCapture(CI, i)) { @@ -1095,11 +1081,7 @@ void calculateUnusedValuesInFunction( if (shouldDisableNoWrite(CI)) { writeOnlyNoCapture = false; } -#if LLVM_VERSION_MAJOR >= 14 for (size_t i = 0; i < CI->arg_size(); i++) -#else - for (size_t i = 0; i < CI->getNumArgOperands(); i++) -#endif { if (val == CI->getArgOperand(i)) { if (!isNoCapture(CI, i)) { @@ -1336,11 +1318,7 @@ bool shouldAugmentCall(CallInst *op, const GradientUtils *gutils) { if (!called || called->empty()) modifyPrimal = true; -#if LLVM_VERSION_MAJOR >= 14 for (unsigned i = 0; i < op->arg_size(); ++i) -#else - for (unsigned i = 0; i < op->getNumArgOperands(); ++i) -#endif { if (gutils->isConstantValue(op->getArgOperand(i)) && called && !called->empty()) { @@ -1388,14 +1366,6 @@ static inline llvm::raw_ostream &operator<<(llvm::raw_ostream &os, return os << "mod"; else if (mri == ModRefInfo::Ref) return os << "ref"; -#if LLVM_VERSION_MAJOR <= 14 - else if (mri == ModRefInfo::MustModRef) - return os << "mustmodref"; - else if (mri == ModRefInfo::MustMod) - return os << "mustmod"; - else if (mri == ModRefInfo::MustRef) - return os << "mustref"; -#endif else llvm_unreachable("unknown modref"); return os; @@ -1749,26 +1719,13 @@ void clearFunctionAttributes(Function *f) { if (f->hasFnAttribute(Attribute::OptimizeNone)) f->removeFnAttr(Attribute::OptimizeNone); -#if LLVM_VERSION_MAJOR >= 14 if (f->getAttributes().getRetDereferenceableBytes()) -#else - if (f->getDereferenceableBytes(llvm::AttributeList::ReturnIndex)) -#endif { -#if LLVM_VERSION_MAJOR >= 14 f->removeRetAttr(Attribute::Dereferenceable); -#else - f->removeAttribute(llvm::AttributeList::ReturnIndex, - Attribute::Dereferenceable); -#endif } if (f->getAttributes().getRetAlignment()) { -#if LLVM_VERSION_MAJOR >= 14 f->removeRetAttr(Attribute::Alignment); -#else - f->removeAttribute(llvm::AttributeList::ReturnIndex, Attribute::Alignment); -#endif } Attribute::AttrKind attrs[] = { #if LLVM_VERSION_MAJOR >= 17 @@ -1781,27 +1738,14 @@ void clearFunctionAttributes(Function *f) { Attribute::NoAlias }; for (auto attr : attrs) { -#if LLVM_VERSION_MAJOR >= 14 if (f->hasRetAttribute(attr)) { f->removeRetAttr(attr); } -#else - if (f->hasAttribute(llvm::AttributeList::ReturnIndex, attr)) { - f->removeAttribute(llvm::AttributeList::ReturnIndex, attr); - } -#endif } for (auto attr : {"enzyme_inactive", "enzyme_type"}) { -#if LLVM_VERSION_MAJOR >= 14 if (f->getAttributes().hasRetAttr(attr)) { f->removeRetAttr(attr); } -#else - if (f->getAttributes().hasAttribute(llvm::AttributeList::ReturnIndex, - attr)) { - f->removeAttribute(llvm::AttributeList::ReturnIndex, attr); - } -#endif } } @@ -2161,12 +2105,8 @@ const AugmentedReturn &EnzymeLogic::CreateAugmentedPrimal( if (!foundcalled->hasParamAttribute(i, Attribute::StructRet)) args.push_back(arg.getType()); else { -#if LLVM_VERSION_MAJOR >= 12 sretTy = foundcalled->getParamAttribute(0, Attribute::StructRet) .getValueAsType(); -#else - sretTy = arg.getType()->getPointerElementType(); -#endif } i++; } @@ -2606,29 +2546,14 @@ const AugmentedReturn &EnzymeLogic::CreateAugmentedPrimal( if (gutils->newFunc->hasFnAttribute(Attribute::OptimizeNone)) gutils->newFunc->removeFnAttr(Attribute::OptimizeNone); -#if LLVM_VERSION_MAJOR >= 14 if (gutils->newFunc->getAttributes().getRetDereferenceableBytes()) -#else - if (gutils->newFunc->getDereferenceableBytes( - llvm::AttributeList::ReturnIndex)) -#endif { -#if LLVM_VERSION_MAJOR >= 14 gutils->newFunc->removeRetAttr(Attribute::Dereferenceable); -#else - gutils->newFunc->removeAttribute(llvm::AttributeList::ReturnIndex, - Attribute::Dereferenceable); -#endif } // TODO could keep nonnull if returning value -1 if (gutils->newFunc->getAttributes().getRetAlignment()) { -#if LLVM_VERSION_MAJOR >= 14 gutils->newFunc->removeRetAttr(Attribute::Alignment); -#else - gutils->newFunc->removeAttribute(llvm::AttributeList::ReturnIndex, - Attribute::Alignment); -#endif } llvm::Attribute::AttrKind attrs[] = { @@ -2642,27 +2567,14 @@ const AugmentedReturn &EnzymeLogic::CreateAugmentedPrimal( llvm::Attribute::SExt, }; for (auto attr : attrs) { -#if LLVM_VERSION_MAJOR >= 14 if (gutils->newFunc->hasRetAttribute(attr)) { gutils->newFunc->removeRetAttr(attr); } -#else - if (gutils->newFunc->hasAttribute(llvm::AttributeList::ReturnIndex, attr)) { - gutils->newFunc->removeAttribute(llvm::AttributeList::ReturnIndex, attr); - } -#endif } for (auto attr : {"enzyme_inactive", "enzyme_type"}) { -#if LLVM_VERSION_MAJOR >= 14 if (gutils->newFunc->getAttributes().hasRetAttr(attr)) { gutils->newFunc->removeRetAttr(attr); } -#else - if (gutils->newFunc->getAttributes().hasAttribute( - llvm::AttributeList::ReturnIndex, attr)) { - gutils->newFunc->removeAttribute(llvm::AttributeList::ReturnIndex, attr); - } -#endif } gutils->eraseFictiousPHIs(); @@ -2820,7 +2732,6 @@ const AugmentedReturn &EnzymeLogic::CreateAugmentedPrimal( ++attrIndex; } -#if LLVM_VERSION_MAJOR >= 14 for (auto attr : {"enzyme_ta_norecur"}) if (nf->getAttributes().hasAttributeAtIndex(AttributeList::FunctionIndex, attr)) { @@ -2836,30 +2747,10 @@ const AugmentedReturn &EnzymeLogic::CreateAugmentedPrimal( AttributeList::ReturnIndex, nf->getAttributes().getAttribute(AttributeList::ReturnIndex, attr)); } -#else - for (auto attr : {"enzyme_ta_norecur"}) - if (nf->getAttributes().hasAttribute(AttributeList::FunctionIndex, attr)) { - NewF->addFnAttr( - nf->getAttributes().getAttribute(AttributeList::FunctionIndex, attr)); - } - - for (auto attr : - {"enzyme_type", "enzymejl_parmtype", "enzymejl_parmtype_ref"}) - if (nf->getAttributes().hasAttribute(AttributeList::ReturnIndex, attr)) { - NewF->addAttribute( - AttributeList::ReturnIndex, - nf->getAttributes().getAttribute(AttributeList::ReturnIndex, attr)); - } -#endif SmallVector Returns; -#if LLVM_VERSION_MAJOR >= 13 CloneFunctionInto(NewF, nf, VMap, CloneFunctionChangeType::LocalChangesOnly, Returns, "", nullptr); -#else - CloneFunctionInto(NewF, nf, VMap, nf->getSubprogram() != nullptr, Returns, "", - nullptr); -#endif IRBuilder<> ib(NewF->getEntryBlock().getFirstNonPHI()); @@ -5642,13 +5533,9 @@ llvm::Function *EnzymeLogic::CreateTruncateFunc(RequestContext context, } SmallVector Returns; -#if LLVM_VERSION_MAJOR >= 13 CloneFunctionInto(NewF, totrunc, originalToNewFn, CloneFunctionChangeType::LocalChangesOnly, Returns, "", nullptr); -#else - CloneFunctionInto(NewF, totrunc, originalToNewFn, true, Returns, "", nullptr); -#endif NewF->setLinkage(Function::LinkageTypes::InternalLinkage); @@ -5758,13 +5645,9 @@ llvm::Function *EnzymeLogic::CreateBatch(RequestContext context, } SmallVector Returns; -#if LLVM_VERSION_MAJOR >= 13 CloneFunctionInto(NewF, tobatch, vmap, CloneFunctionChangeType::LocalChangesOnly, Returns, "", nullptr); -#else - CloneFunctionInto(NewF, tobatch, vmap, true, Returns, "", nullptr); -#endif NewF->setLinkage(Function::LinkageTypes::InternalLinkage); @@ -6555,12 +6438,8 @@ llvm::Function *EnzymeLogic::CreateNoFree(RequestContext context, Function *F) { } SmallVector Returns; -#if LLVM_VERSION_MAJOR >= 13 CloneFunctionInto(NewF, F, VMap, CloneFunctionChangeType::LocalChangesOnly, Returns, "", nullptr); -#else - CloneFunctionInto(NewF, F, VMap, true, Returns, "", nullptr); -#endif NewF->setVisibility(llvm::GlobalValue::DefaultVisibility); NewF->setLinkage(llvm::GlobalValue::InternalLinkage); diff --git a/enzyme/Enzyme/FunctionUtils.cpp b/enzyme/Enzyme/FunctionUtils.cpp index cf2afd3b5863..a1b39dfa5642 100644 --- a/enzyme/Enzyme/FunctionUtils.cpp +++ b/enzyme/Enzyme/FunctionUtils.cpp @@ -114,12 +114,10 @@ #include "CacheUtility.h" -#if LLVM_VERSION_MAJOR >= 14 #define addAttribute addAttributeAtIndex #define removeAttribute removeAttributeAtIndex #define getAttribute getAttributeAtIndex #define hasAttribute hasAttributeAtIndex -#endif #define DEBUG_TYPE "enzyme" using namespace llvm; @@ -197,11 +195,7 @@ bool couldFunctionArgumentCapture(llvm::CallInst *CI, llvm::Value *val) { return false; auto arg = F->arg_begin(); -#if LLVM_VERSION_MAJOR >= 14 for (size_t i = 0, size = CI->arg_size(); i < size; i++) -#else - for (size_t i = 0, size = CI->getNumArgOperands(); i < size; i++) -#endif { if (val == CI->getArgOperand(i)) { // This is a vararg, assume captured @@ -365,12 +359,10 @@ void RecursivelyReplaceAddressSpace(Value *AI, Value *rep, bool legal) { IRBuilder<> B(II); auto nII = cast(B.CreateCall(II->getCalledFunction(), args)); -#if LLVM_VERSION_MAJOR >= 13 // Must copy the elementtype attribute as it is needed by the intrinsic nII->addParamAttr( ptrArgIndex, II->getParamAttr(ptrArgIndex, Attribute::AttrKind::ElementType)); -#endif nII->takeName(II); for (auto U : II->users()) { Todo.push_back( @@ -445,11 +437,7 @@ void RecursivelyReplaceAddressSpace(Value *AI, Value *rep, bool legal) { } IRBuilder<> B(CI); auto Addr = B.CreateAddrSpaceCast(rep, prev->getType()); -#if LLVM_VERSION_MAJOR >= 14 for (size_t i = 0; i < CI->arg_size(); i++) -#else - for (size_t i = 0; i < CI->getNumArgOperands(); i++) -#endif { if (CI->getArgOperand(i) == prev) { CI->setArgOperand(i, Addr); @@ -703,12 +691,7 @@ OldAllocationSize(Value *Ptr, CallInst *Loc, Function *NewF, IntegerType *T, } AttributeList list; -#if LLVM_VERSION_MAJOR >= 14 list = list.addFnAttribute(NewF->getContext(), Attribute::ReadOnly); -#else - list = list.addAttribute(NewF->getContext(), AttributeList::FunctionIndex, - Attribute::ReadOnly); -#endif list = list.addParamAttribute(NewF->getContext(), 0, Attribute::ReadNone); list = list.addParamAttribute(NewF->getContext(), 0, Attribute::NoCapture); auto allocSize = NewF->getParent()->getOrInsertFunction( @@ -970,9 +953,7 @@ Function *CreateMPIWrapper(Function *F) { F->getParent()); llvm::Attribute::AttrKind attrs[] = { Attribute::WillReturn, -#if LLVM_VERSION_MAJOR >= 12 Attribute::MustProgress, -#endif #if LLVM_VERSION_MAJOR < 16 Attribute::ReadOnly, #endif @@ -985,23 +966,13 @@ Function *CreateMPIWrapper(Function *F) { Attribute::InaccessibleMemOnly #endif }; - for (auto attr : attrs) { -#if LLVM_VERSION_MAJOR >= 14 W->addFnAttr(attr); -#else - W->addAttribute(AttributeList::FunctionIndex, attr); -#endif } #if LLVM_VERSION_MAJOR >= 16 W->setOnlyAccessesInaccessibleMemory(); W->setOnlyReadsMemory(); #endif -#if LLVM_VERSION_MAJOR >= 14 W->addFnAttr(Attribute::get(F->getContext(), "enzyme_inactive")); -#else - W->addAttribute(AttributeList::FunctionIndex, - Attribute::get(F->getContext(), "enzyme_inactive")); -#endif BasicBlock *entry = BasicBlock::Create(W->getContext(), "entry", W); IRBuilder<> B(entry); auto alloc = B.CreateAlloca(F->getReturnType()); @@ -1072,16 +1043,12 @@ static void SimplifyMPIQueries(Function &NewF, FunctionAnalysisManager &FAM) { if (auto PT = dyn_cast(storePointer->getType())) { (void)PT; #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 15 if (PT->getContext().supportsTypedPointers()) { -#endif if (PT->getPointerElementType() != res->getType()) storePointer = B.CreateBitCast( storePointer, PointerType::get(res->getType(), PT->getAddressSpace())); -#if LLVM_VERSION_MAJOR >= 15 } -#endif #endif } else { assert(isa(storePointer->getType())); @@ -1318,32 +1285,17 @@ void setFullWillReturn(Function *NewF) { for (auto &BB : *NewF) { for (auto &I : BB) { if (auto CI = dyn_cast(&I)) { -#if LLVM_VERSION_MAJOR >= 14 CI->addFnAttr(Attribute::WillReturn); CI->addFnAttr(Attribute::MustProgress); -#elif LLVM_VERSION_MAJOR >= 12 - CI->addAttribute(AttributeList::FunctionIndex, Attribute::WillReturn); - CI->addAttribute(AttributeList::FunctionIndex, Attribute::MustProgress); -#else - CI->addAttribute(AttributeList::FunctionIndex, Attribute::WillReturn); -#endif } if (auto CI = dyn_cast(&I)) { -#if LLVM_VERSION_MAJOR >= 14 CI->addFnAttr(Attribute::WillReturn); CI->addFnAttr(Attribute::MustProgress); -#elif LLVM_VERSION_MAJOR >= 12 - CI->addAttribute(AttributeList::FunctionIndex, Attribute::WillReturn); - CI->addAttribute(AttributeList::FunctionIndex, Attribute::MustProgress); -#else - CI->addAttribute(AttributeList::FunctionIndex, Attribute::WillReturn); -#endif } } } } -#if LLVM_VERSION_MAJOR >= 12 void SplitPHIs(llvm::Function &F) { SetVector todo; for (auto &BB : F) { @@ -1413,7 +1365,6 @@ void SplitPHIs(llvm::Function &F) { cur->eraseFromParent(); } } -#endif Function *PreProcessCache::preprocessForClone(Function *F, DerivativeMode mode) { @@ -1450,16 +1401,10 @@ Function *PreProcessCache::preprocessForClone(Function *F, SmallVector Returns; if (!F->empty()) { -#if LLVM_VERSION_MAJOR >= 13 CloneFunctionInto( NewF, F, VMap, /*ModuleLevelChanges*/ CloneFunctionChangeType::LocalChangesOnly, Returns, "", nullptr); -#else - CloneFunctionInto(NewF, F, VMap, - /*ModuleLevelChanges*/ F->getSubprogram() != nullptr, - Returns, "", nullptr); -#endif } CloneOrigin[NewF] = F; NewF->setAttributes(F->getAttributes()); @@ -1469,15 +1414,8 @@ Function *PreProcessCache::preprocessForClone(Function *F, j->addAttr(Attribute::NoAlias); } } -#if LLVM_VERSION_MAJOR >= 14 NewF->addFnAttr(Attribute::WillReturn); NewF->addFnAttr(Attribute::MustProgress); -#else - NewF->addAttribute(AttributeList::FunctionIndex, Attribute::WillReturn); -#if LLVM_VERSION_MAJOR >= 12 - NewF->addAttribute(AttributeList::FunctionIndex, Attribute::MustProgress); -#endif -#endif setFullWillReturn(NewF); if (EnzymePreopt) { @@ -1605,11 +1543,7 @@ Function *PreProcessCache::preprocessForClone(Function *F, bool activeCall = false; bool hasWrite = false; MemoryLocation -#if LLVM_VERSION_MAJOR >= 12 Loc = MemoryLocation(&g, LocationSize::beforeOrAfterPointer()); -#else - Loc = MemoryLocation(&g, LocationSize::unknown()); -#endif for (CallInst *CI : Calls) { if (isa(CI)) @@ -1819,20 +1753,11 @@ Function *PreProcessCache::preprocessForClone(Function *F, } } -#if LLVM_VERSION_MAJOR < 14 - using OptimizationLevel = llvm::PassBuilder::OptimizationLevel; -#endif - auto Level = OptimizationLevel::O2; PassBuilder PB; -#if LLVM_VERSION_MAJOR >= 12 FunctionPassManager FPM = PB.buildFunctionSimplificationPipeline(Level, ThinOrFullLTOPhase::None); -#else - FunctionPassManager FPM = PB.buildFunctionSimplificationPipeline( - Level, PassBuilder::ThinLTOPhase::None); -#endif auto PA = FPM.run(*F, FAM); FAM.invalidate(*F, PA); } @@ -1855,7 +1780,7 @@ Function *PreProcessCache::preprocessForClone(Function *F, { #if LLVM_VERSION_MAJOR >= 16 && !defined(FLANG) auto PA = SROAPass(llvm::SROAOptions::ModifyCFG).run(*NewF, FAM); -#elif LLVM_VERSION_MAJOR >= 14 && !defined(FLANG) +#elif !defined(FLANG) auto PA = SROAPass().run(*NewF, FAM); #else auto PA = SROA().run(*NewF, FAM); @@ -1869,7 +1794,7 @@ Function *PreProcessCache::preprocessForClone(Function *F, { #if LLVM_VERSION_MAJOR >= 16 && !defined(FLANG) auto PA = SROAPass(llvm::SROAOptions::PreserveCFG).run(*NewF, FAM); -#elif LLVM_VERSION_MAJOR >= 14 && !defined(FLANG) +#elif !defined(FLANG) auto PA = SROAPass().run(*NewF, FAM); #else auto PA = SROA().run(*NewF, FAM); @@ -1877,14 +1802,7 @@ Function *PreProcessCache::preprocessForClone(Function *F, FAM.invalidate(*NewF, PA); } -#if LLVM_VERSION_MAJOR >= 12 SimplifyCFGOptions scfgo; -#else - SimplifyCFGOptions scfgo( - /*unsigned BonusThreshold=*/1, /*bool ForwardSwitchCond=*/false, - /*bool SwitchToLookup=*/false, /*bool CanonicalLoops=*/true, - /*bool SinkCommon=*/true, /*AssumptionCache *AssumpCache=*/nullptr); -#endif { auto PA = SimplifyCFGPass(scfgo).run(*NewF, FAM); FAM.invalidate(*NewF, PA); @@ -1892,9 +1810,7 @@ Function *PreProcessCache::preprocessForClone(Function *F, } { -#if LLVM_VERSION_MAJOR >= 12 SplitPHIs(*NewF); -#endif PreservedAnalyses PA; PA.preserve(); PA.preserve(); @@ -2253,13 +2169,8 @@ Function *PreProcessCache::CloneFunctionWithReturns( } SmallVector Returns; if (!F->empty()) { -#if LLVM_VERSION_MAJOR >= 13 CloneFunctionInto(NewF, F, VMap, CloneFunctionChangeType::LocalChangesOnly, Returns, "", nullptr); -#else - CloneFunctionInto(NewF, F, VMap, F->getSubprogram() != nullptr, Returns, "", - nullptr); -#endif } if (NewF->empty()) { auto entry = BasicBlock::Create(NewF->getContext(), "entry", NewF); @@ -2295,7 +2206,6 @@ Function *PreProcessCache::CloneFunctionWithReturns( for (auto i = F->arg_begin(), j = NewF->arg_begin(); i != F->arg_end();) { if (F->hasParamAttribute(ii, Attribute::StructRet)) { NewF->addParamAttr(jj, Attribute::get(F->getContext(), "enzyme_sret")); -#if LLVM_VERSION_MAJOR >= 13 // TODO // NewF->addParamAttr( // jj, @@ -2303,16 +2213,13 @@ Function *PreProcessCache::CloneFunctionWithReturns( // F->getContext(), Attribute::AttrKind::ElementType, // F->getParamAttribute(ii, // Attribute::StructRet).getValueAsType())); -#endif } if (F->getAttributes().hasParamAttr(ii, "enzymejl_returnRoots")) { NewF->addParamAttr( jj, F->getAttributes().getParamAttr(ii, "enzymejl_returnRoots")); -#if LLVM_VERSION_MAJOR >= 13 // TODO // NewF->addParamAttr(jj, F->getParamAttribute(ii, // Attribute::ElementType)); -#endif } for (auto attr : {"enzymejl_parmtype", "enzymejl_parmtype_ref", "enzyme_type"}) @@ -2377,24 +2284,16 @@ Function *PreProcessCache::CloneFunctionWithReturns( NewF->addParamAttr(jj + 1, Attribute::get(F->getContext(), "enzymejl_returnRoots_v")); } -#if LLVM_VERSION_MAJOR >= 13 // TODO // NewF->addParamAttr(jj + 1, // F->getParamAttribute(ii, // Attribute::ElementType)); -#endif } if (F->hasParamAttribute(ii, Attribute::StructRet)) { if (width == 1) { -#if LLVM_VERSION_MAJOR >= 12 NewF->addParamAttr(jj + 1, Attribute::get(F->getContext(), "enzyme_sret")); -#else - NewF->addParamAttr(jj + 1, - Attribute::get(F->getContext(), "enzyme_sret")); -#endif -#if LLVM_VERSION_MAJOR >= 13 // TODO // NewF->addParamAttr( // jj + 1, @@ -2403,16 +2302,9 @@ Function *PreProcessCache::CloneFunctionWithReturns( // F->getParamAttribute(ii, // Attribute::StructRet) // .getValueAsType())); -#endif } else { -#if LLVM_VERSION_MAJOR >= 12 NewF->addParamAttr(jj + 1, Attribute::get(F->getContext(), "enzyme_sret_v")); -#else - NewF->addParamAttr(jj + 1, - Attribute::get(F->getContext(), "enzyme_sret_v")); -#endif -#if LLVM_VERSION_MAJOR >= 13 // TODO // NewF->addParamAttr( // jj + 1, @@ -2421,7 +2313,6 @@ Function *PreProcessCache::CloneFunctionWithReturns( // F->getParamAttribute(ii, // Attribute::StructRet) // .getValueAsType())); -#endif } } @@ -2634,7 +2525,7 @@ void PreProcessCache::optimizeIntermediate(Function *F) { PreservedAnalyses PA; PA = PromotePass().run(*F, FAM); FAM.invalidate(*F, PA); -#if LLVM_VERSION_MAJOR >= 14 && !defined(FLANG) +#if !defined(FLANG) PA = GVNPass().run(*F, FAM); #else PA = GVN().run(*F, FAM); @@ -2642,7 +2533,7 @@ void PreProcessCache::optimizeIntermediate(Function *F) { FAM.invalidate(*F, PA); #if LLVM_VERSION_MAJOR >= 16 && !defined(FLANG) PA = SROAPass(llvm::SROAOptions::PreserveCFG).run(*F, FAM); -#elif LLVM_VERSION_MAJOR >= 14 && !defined(FLANG) +#elif !defined(FLANG) PA = SROAPass().run(*F, FAM); #else PA = SROA().run(*F, FAM); @@ -2650,14 +2541,7 @@ void PreProcessCache::optimizeIntermediate(Function *F) { FAM.invalidate(*F, PA); if (EnzymeSelectOpt) { -#if LLVM_VERSION_MAJOR >= 12 SimplifyCFGOptions scfgo; -#else - SimplifyCFGOptions scfgo( - /*unsigned BonusThreshold=*/1, /*bool ForwardSwitchCond=*/false, - /*bool SwitchToLookup=*/false, /*bool CanonicalLoops=*/true, - /*bool SinkCommon=*/true, /*AssumptionCache *AssumpCache=*/nullptr); -#endif PA = SimplifyCFGPass(scfgo).run(*F, FAM); FAM.invalidate(*F, PA); PA = CorrelatedValuePropagationPass().run(*F, FAM); @@ -2676,9 +2560,6 @@ void PreProcessCache::optimizeIntermediate(Function *F) { FAM.invalidate(*F, PA); } -#if LLVM_VERSION_MAJOR < 14 - using OptimizationLevel = llvm::PassBuilder::OptimizationLevel; -#endif OptimizationLevel Level = OptimizationLevel::O0; switch (EnzymePostOptLevel) { @@ -2698,13 +2579,8 @@ void PreProcessCache::optimizeIntermediate(Function *F) { } if (Level != OptimizationLevel::O0) { PassBuilder PB; -#if LLVM_VERSION_MAJOR >= 12 FunctionPassManager FPM = PB.buildFunctionSimplificationPipeline(Level, ThinOrFullLTOPhase::None); -#else - FunctionPassManager FPM = PB.buildFunctionSimplificationPipeline( - Level, PassBuilder::ThinLTOPhase::None); -#endif PA = FPM.run(*F, FAM); FAM.invalidate(*F, PA); } @@ -2843,14 +2719,12 @@ Function *getProductIntrinsic(llvm::Module &M, llvm::Type *T) { Attribute::ReadNone); AL = AL.addAttribute(T->getContext(), AttributeList::FunctionIndex, Attribute::NoUnwind); -#if LLVM_VERSION_MAJOR >= 14 AL = AL.addAttribute(T->getContext(), AttributeList::FunctionIndex, Attribute::NoFree); AL = AL.addAttribute(T->getContext(), AttributeList::FunctionIndex, Attribute::NoSync); AL = AL.addAttribute(T->getContext(), AttributeList::FunctionIndex, Attribute::WillReturn); -#endif return cast(M.getOrInsertFunction(name, FT, AL).getCallee()); } @@ -2870,14 +2744,12 @@ Function *getSumIntrinsic(llvm::Module &M, llvm::Type *T) { Attribute::ReadNone); AL = AL.addAttribute(T->getContext(), AttributeList::FunctionIndex, Attribute::NoUnwind); -#if LLVM_VERSION_MAJOR >= 14 AL = AL.addAttribute(T->getContext(), AttributeList::FunctionIndex, Attribute::NoFree); AL = AL.addAttribute(T->getContext(), AttributeList::FunctionIndex, Attribute::NoSync); AL = AL.addAttribute(T->getContext(), AttributeList::FunctionIndex, Attribute::WillReturn); -#endif return cast(M.getOrInsertFunction(name, FT, AL).getCallee()); } @@ -2898,12 +2770,7 @@ CallInst *isSum(llvm::Value *v) { } SmallVector callOperands(llvm::CallBase *CB) { -#if LLVM_VERSION_MAJOR >= 14 return SmallVector(CB->args().begin(), CB->args().end()); -#else - return SmallVector(CB->arg_operands().begin(), - CB->arg_operands().end()); -#endif } bool guaranteedDataDependent(Value *z) { @@ -5684,10 +5551,8 @@ std::optional fixSparse_inner(Instruction *cur, llvm::Function &F, // instruction and must thus be expanded after all phi's newIV = Exp.expandCodeFor(S, tmp->getType(), point); // sadly this doesn't exist on 11 -#if LLVM_VERSION_MAJOR >= 12 for (auto I : Exp.getAllInsertedInstructions()) Q.insert(I); -#endif } tmp->replaceAllUsesWith(newIV); @@ -7699,13 +7564,7 @@ void fixSparseIndices(llvm::Function &F, llvm::FunctionAnalysisManager &FAM, #endif CodeExtractorAnalysisCache cache(F); SetVector Inputs, Outputs; -#if LLVM_VERSION_MAJOR >= 14 auto F2 = ext.extractCodeRegion(cache, Inputs, Outputs); -#else - SetVector Sinking; - ext.findInputsOutputs(Inputs, Outputs, Sinking); - auto F2 = ext.extractCodeRegion(cache); -#endif assert(F2); F2->addFnAttr(Attribute::AlwaysInline); @@ -7804,11 +7663,7 @@ void fixSparseIndices(llvm::Function &F, llvm::FunctionAnalysisManager &FAM, auto off = en.index(); auto &solutions = en.value().second; ConstraintContext ctx(SE, L, Assumptions, DT); -#if LLVM_VERSION_MAJOR >= 12 SCEVExpander Exp(SE, DL, "sparseenzyme", /*preservelcssa*/ false); -#else - SCEVExpander Exp(SE, DL, "sparseenzyme"); -#endif auto sols = solutions->allSolutions(Exp, idxty, phterm, ctx, B); SmallVector prevSols; for (auto [sol, condition] : sols) { @@ -7921,11 +7776,7 @@ void replaceToDense(llvm::CallBase *CI, bool replaceAll, llvm::Function *F, auto load_fn = cast(getBaseObject(CI->getArgOperand(0))); auto store_fn = cast(getBaseObject(CI->getArgOperand(1))); size_t argstart = 2; -#if LLVM_VERSION_MAJOR >= 14 size_t num_args = CI->arg_size(); -#else - size_t num_args = CI->getNumArgOperands(); -#endif SmallVector, 1> users; for (auto U : CI->users()) { @@ -7936,17 +7787,13 @@ void replaceToDense(llvm::CallBase *CI, bool replaceAll, llvm::Function *F, if (auto PT = dyn_cast(V->getType())) { if (PT->getAddressSpace() != 0) { #if LLVM_VERSION_MAJOR < 17 -#if LLVM_VERSION_MAJOR >= 15 if (CI->getContext().supportsTypedPointers()) { -#endif V = B.CreateAddrSpaceCast( V, PointerType::getUnqual(PT->getPointerElementType())); -#if LLVM_VERSION_MAJOR >= 15 } else { V = B.CreateAddrSpaceCast(V, PointerType::getUnqual(PT->getContext())); } -#endif #else V = B.CreateAddrSpaceCast(V, PointerType::getUnqual(PT->getContext())); #endif @@ -8015,11 +7862,7 @@ void replaceToDense(llvm::CallBase *CI, bool replaceAll, llvm::Function *F, auto *F = CI->getCalledOperand(); SmallVector args; -#if LLVM_VERSION_MAJOR >= 14 for (auto &arg : CI->args()) -#else - for (auto &arg : CI->arg_operands()) -#endif args.push_back(replacements[arg]); auto FT = CI->getFunctionType(); From ee817722bf834612fe2efae21b72b618552d8b9e Mon Sep 17 00:00:00 2001 From: Billy Moses Date: Tue, 10 Sep 2024 00:47:11 +0000 Subject: [PATCH 02/19] No Julia 1.11 available yet --- .github/workflows/enzyme-julia.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/enzyme-julia.yml b/.github/workflows/enzyme-julia.yml index da5c2950d7a0..6ae9f3d0ff5a 100644 --- a/.github/workflows/enzyme-julia.yml +++ b/.github/workflows/enzyme-julia.yml @@ -19,7 +19,6 @@ jobs: matrix: version: - '1.10' - - '1.11' os: - ubuntu-latest - macOS-latest From 4b35b0d7fb7ddfd6fc857b88c11638af7a24f4a3 Mon Sep 17 00:00:00 2001 From: Billy Moses Date: Tue, 10 Sep 2024 00:52:44 +0000 Subject: [PATCH 03/19] fixup? --- enzyme/Enzyme/Enzyme.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/enzyme/Enzyme/Enzyme.cpp b/enzyme/Enzyme/Enzyme.cpp index e0cba6f3677c..a33306489c27 100644 --- a/enzyme/Enzyme/Enzyme.cpp +++ b/enzyme/Enzyme/Enzyme.cpp @@ -3326,7 +3326,6 @@ extern cl::opt SetLicmMssaOptCap; #define EnableMatrix false #define EnableModuleInliner false } // namespace llvm -#endif void augmentPassBuilder(llvm::PassBuilder &PB) { From b3c7e2670110cf617bd3b1d80543058038e0a088 Mon Sep 17 00:00:00 2001 From: Billy Moses Date: Tue, 10 Sep 2024 03:43:26 +0000 Subject: [PATCH 04/19] fix --- enzyme/Enzyme/FunctionUtils.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/enzyme/Enzyme/FunctionUtils.cpp b/enzyme/Enzyme/FunctionUtils.cpp index a1b39dfa5642..3da24e8ad0fd 100644 --- a/enzyme/Enzyme/FunctionUtils.cpp +++ b/enzyme/Enzyme/FunctionUtils.cpp @@ -966,6 +966,7 @@ Function *CreateMPIWrapper(Function *F) { Attribute::InaccessibleMemOnly #endif }; + for (auto attr : attrs) { W->addFnAttr(attr); } #if LLVM_VERSION_MAJOR >= 16 From 233d5d65e5dfaaa7b8c2c01e665ccf7c7cfe0d6f Mon Sep 17 00:00:00 2001 From: "William S. Moses" Date: Tue, 10 Sep 2024 10:08:16 -0400 Subject: [PATCH 05/19] fix --- enzyme/Enzyme/Clang/EnzymeClang.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/enzyme/Enzyme/Clang/EnzymeClang.cpp b/enzyme/Enzyme/Clang/EnzymeClang.cpp index 0e1e324dbc3c..90ac5e562e30 100644 --- a/enzyme/Enzyme/Clang/EnzymeClang.cpp +++ b/enzyme/Enzyme/Clang/EnzymeClang.cpp @@ -47,8 +47,6 @@ constexpr auto StructKind = clang::TagTypeKind::Struct; constexpr auto StructKind = clang::TagTypeKind::TTK_Struct; #endif -constexpr auto stringkind = clang::StringLiteral::StringKind::Ascii; - template class EnzymeAction final : public clang::PluginASTAction { protected: From 895810ad582eef75ae9aa7536ab42d2df6eabe0c Mon Sep 17 00:00:00 2001 From: "William S. Moses" Date: Tue, 10 Sep 2024 10:08:47 -0400 Subject: [PATCH 06/19] fmt --- enzyme/Enzyme/ActivityAnalysis.cpp | 15 +++---- enzyme/Enzyme/AdjointGenerator.h | 48 ++++++++++------------- enzyme/Enzyme/CApi.cpp | 9 ++--- enzyme/Enzyme/CallDerivatives.cpp | 28 +++++-------- enzyme/Enzyme/Clang/EnzymeClang.cpp | 19 +++++---- enzyme/Enzyme/DifferentialUseAnalysis.cpp | 9 ++--- enzyme/Enzyme/Enzyme.cpp | 36 ++++++----------- enzyme/Enzyme/EnzymeLogic.cpp | 18 +++------ enzyme/Enzyme/FunctionUtils.cpp | 10 ++--- 9 files changed, 72 insertions(+), 120 deletions(-) diff --git a/enzyme/Enzyme/ActivityAnalysis.cpp b/enzyme/Enzyme/ActivityAnalysis.cpp index 0d162e621283..265539ced153 100644 --- a/enzyme/Enzyme/ActivityAnalysis.cpp +++ b/enzyme/Enzyme/ActivityAnalysis.cpp @@ -555,8 +555,7 @@ bool ActivityAnalyzer::isFunctionArgumentConstant(CallInst *CI, Value *val) { bool all_inactive = val != CI->getCalledOperand(); - for (size_t i = 0; i < CI->arg_size(); i++) - { + for (size_t i = 0; i < CI->arg_size(); i++) { if (val == CI->getArgOperand(i)) { if (!CI->getAttributes().hasParamAttr(i, "enzyme_inactive") && !(F && F->getCallingConv() == CI->getCallingConv() && @@ -655,8 +654,7 @@ static inline void propagateArgumentInformation( } if (Name == "julia.call" || Name == "julia.call2") { - for (size_t i = 1; i < CI.arg_size(); i++) - { + for (size_t i = 1; i < CI.arg_size(); i++) { propagateFromOperand(CI.getOperand(i)); } return; @@ -695,8 +693,7 @@ static inline void propagateArgumentInformation( // For other calls, check all operands of the instruction // as conservatively they may impact the activity of the call size_t i = 0; - for (auto &a : CI.args()) - { + for (auto &a : CI.args()) { if (CI.getAttributes().hasParamAttr(i, "enzyme_inactive") || (F && F->getCallingConv() == CI.getCallingConv() && @@ -2953,8 +2950,7 @@ bool ActivityAnalyzer::isValueInactiveFromUsers(TypeResults const &TR, auto F = getFunctionFromCall(call); size_t idx = 0; - for (auto &arg : call->args()) - { + for (auto &arg : call->args()) { if (arg != parent) { idx++; continue; @@ -3113,8 +3109,7 @@ bool ActivityAnalyzer::isValueInactiveFromUsers(TypeResults const &TR, if (isa(operand)) { bool legal = true; - for (unsigned i = 0; i < call->arg_size() + 1; ++i) - { + for (unsigned i = 0; i < call->arg_size() + 1; ++i) { Value *a = call->getOperand(i); if (isa(a)) diff --git a/enzyme/Enzyme/AdjointGenerator.h b/enzyme/Enzyme/AdjointGenerator.h index e807d568e76d..c553e17f6561 100644 --- a/enzyme/Enzyme/AdjointGenerator.h +++ b/enzyme/Enzyme/AdjointGenerator.h @@ -2826,8 +2826,7 @@ class AdjointGenerator : public llvm::InstVisitor { Value *op1 = gutils->getNewFromOriginal(MS.getArgOperand(1)); Value *op2 = gutils->getNewFromOriginal(MS.getArgOperand(2)); Value *op3 = nullptr; - if (3 < MS.arg_size()) - { + if (3 < MS.arg_size()) { op3 = gutils->getNewFromOriginal(MS.getOperand(3)); } @@ -3068,8 +3067,7 @@ class AdjointGenerator : public llvm::InstVisitor { Value *op1 = gutils->getNewFromOriginal(MS.getArgOperand(1)); Value *new_size = gutils->getNewFromOriginal(MS.getArgOperand(2)); Value *op3 = nullptr; - if (3 < MS.arg_size()) - { + if (3 < MS.arg_size()) { op3 = gutils->getNewFromOriginal(MS.getOperand(3)); } @@ -4000,8 +3998,7 @@ class AdjointGenerator : public llvm::InstVisitor { SmallVector OutTypes; SmallVector OutFPTypes; - for (unsigned i = 3; i < call.arg_size(); ++i) - { + for (unsigned i = 3; i < call.arg_size(); ++i) { auto argi = gutils->getNewFromOriginal(call.getArgOperand(i)); @@ -4680,13 +4677,11 @@ class AdjointGenerator : public llvm::InstVisitor { std::map gradByVal; std::map> structAttrs; - for (unsigned i = 0; i < call.arg_size(); ++i) - { + for (unsigned i = 0; i < call.arg_size(); ++i) { if (call.paramHasAttr(i, Attribute::StructRet)) { structAttrs[args.size()].push_back( - Attribute::get(call.getContext(), "enzyme_sret") - ); + Attribute::get(call.getContext(), "enzyme_sret")); // TODO // structAttrs[args.size()].push_back(Attribute::get( // call.getContext(), Attribute::AttrKind::ElementType, @@ -4765,7 +4760,8 @@ class AdjointGenerator : public llvm::InstVisitor { if (gutils->getWidth() == 1) { structAttrs[args.size()].push_back( Attribute::get(call.getContext(), "enzyme_sret") - // orig->getParamAttr(i, Attribute::StructRet).getValueAsType()); + // orig->getParamAttr(i, + // Attribute::StructRet).getValueAsType()); ); // TODO // structAttrs[args.size()].push_back(Attribute::get( @@ -4774,8 +4770,7 @@ class AdjointGenerator : public llvm::InstVisitor { // Attribute::StructRet).getValueAsType())); } else { structAttrs[args.size()].push_back( - Attribute::get(call.getContext(), "enzyme_sret_v") - ); + Attribute::get(call.getContext(), "enzyme_sret_v")); // TODO // structAttrs[args.size()].push_back(Attribute::get( // call.getContext(), Attribute::AttrKind::ElementType, @@ -4967,8 +4962,7 @@ class AdjointGenerator : public llvm::InstVisitor { SmallVector PreBundleTypes; SmallVector BundleTypes; - for (unsigned i = 0; i < call.arg_size(); ++i) - { + for (unsigned i = 0; i < call.arg_size(); ++i) { auto argi = gutils->getNewFromOriginal(call.getArgOperand(i)); @@ -4984,8 +4978,8 @@ class AdjointGenerator : public llvm::InstVisitor { structAttrs[pre_args.size()].push_back( // TODO persist types Attribute::get(call.getContext(), "enzyme_sret") - // Attribute::get(orig->getContext(), "enzyme_sret", - // orig->getParamAttr(ii, Attribute::StructRet).getValueAsType()); + // Attribute::get(orig->getContext(), "enzyme_sret", + // orig->getParamAttr(ii, Attribute::StructRet).getValueAsType()); ); } for (auto ty : PrimalParamAttrsToPreserve) @@ -5082,16 +5076,17 @@ class AdjointGenerator : public llvm::InstVisitor { structAttrs[pre_args.size()].push_back( // TODO persist types Attribute::get(call.getContext(), "enzyme_sret") - // Attribute::get(orig->getContext(), "enzyme_sret", - // orig->getParamAttr(ii, Attribute::StructRet).getValueAsType()); + // Attribute::get(orig->getContext(), "enzyme_sret", + // orig->getParamAttr(ii, + // Attribute::StructRet).getValueAsType()); ); } else { structAttrs[pre_args.size()].push_back( // TODO persist types Attribute::get(call.getContext(), "enzyme_sret_v") - // Attribute::get(orig->getContext(), "enzyme_sret_v", - // gutils->getShadowType(orig->getParamAttr(ii, - // Attribute::StructRet).getValueAsType())); + // Attribute::get(orig->getContext(), "enzyme_sret_v", + // gutils->getShadowType(orig->getParamAttr(ii, + // Attribute::StructRet).getValueAsType())); ); } } @@ -5132,8 +5127,7 @@ class AdjointGenerator : public llvm::InstVisitor { } if (called) { if (call.arg_size() != - cast(called)->getFunctionType()->getNumParams()) - { + cast(called)->getFunctionType()->getNumParams()) { llvm::errs() << *gutils->oldFunc->getParent() << "\n"; llvm::errs() << *gutils->oldFunc << "\n"; llvm::errs() << call << "\n"; @@ -5767,8 +5761,7 @@ class AdjointGenerator : public llvm::InstVisitor { structidx++; } - for (unsigned i = 0; i < call.arg_size(); ++i) - { + for (unsigned i = 0; i < call.arg_size(); ++i) { if (argsInverted[i] == DIFFE_TYPE::OUT_DIFF) { Value *diffeadd = Builder2.CreateExtractValue(diffes, {structidx}); ++structidx; @@ -6212,8 +6205,7 @@ class AdjointGenerator : public llvm::InstVisitor { if (!noFree && !EnzymeGlobalActivity) { bool mayActiveFree = false; - for (unsigned i = 0; i < call.arg_size(); ++i) - { + for (unsigned i = 0; i < call.arg_size(); ++i) { Value *a = call.getOperand(i); if (EnzymeJuliaAddrLoad && isSpecialPtr(a->getType())) diff --git a/enzyme/Enzyme/CApi.cpp b/enzyme/Enzyme/CApi.cpp index 2dbbea9419f5..58eb4306ed07 100644 --- a/enzyme/Enzyme/CApi.cpp +++ b/enzyme/Enzyme/CApi.cpp @@ -1080,8 +1080,7 @@ void EnzymeSetCalledFunction(LLVMValueRef C_CI, LLVMValueRef C_F, size_t argremsz = 0; size_t nexti = 0; SmallVector vals; - for (size_t i = 0, end = CI->arg_size(); i < end; i++) - { + for (size_t i = 0, end = CI->arg_size(); i < end; i++) { if (argremsz < num_argrem) { if (i == argrem[argremsz]) { argremsz++; @@ -1418,8 +1417,7 @@ void EnzymeFixupBatchedJuliaCallingConvention(LLVMValueRef F_C) { AttributeList::ReturnIndex, attr); SmallVector vals; - for (size_t j = 0, end = CI->arg_size(); j < end; j++) - { + for (size_t j = 0, end = CI->arg_size(); j < end; j++) { auto T = CI->getArgOperand(j)->getType(); if (auto AT = dyn_cast(T)) { @@ -1876,8 +1874,7 @@ void EnzymeFixupJuliaCallingConvention(LLVMValueRef F_C) { SmallVector sret_vals; SmallVector sretv_vals; - for (size_t i = 0, end = CI->arg_size(); i < end; i++) - { + for (size_t i = 0, end = CI->arg_size(); i < end; i++) { if (rroots.count(i) || rroots_v.count(i)) { continue; } diff --git a/enzyme/Enzyme/CallDerivatives.cpp b/enzyme/Enzyme/CallDerivatives.cpp index de29e42be47e..8ec903f72c62 100644 --- a/enzyme/Enzyme/CallDerivatives.cpp +++ b/enzyme/Enzyme/CallDerivatives.cpp @@ -2356,8 +2356,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( IRBuilder<> Builder2(&call); getReverseBuilder(Builder2); SmallVector args; - for (auto &arg : begin_call->args()) - { + for (auto &arg : begin_call->args()) { bool primalUsed = false; bool shadowUsed = false; gutils->getReturnDiffeType(arg, &primalUsed, &shadowUsed); @@ -2397,8 +2396,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( } if (funcName == "llvm.julia.gc_preserve_begin") { SmallVector args; - for (auto &arg : call.args()) - { + for (auto &arg : call.args()) { bool primalUsed = false; bool shadowUsed = false; gutils->getReturnDiffeType(arg, &primalUsed, &shadowUsed); @@ -2582,8 +2580,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( if (gutils->isConstantValue(call.getArgOperand(3))) return true; SmallVector args; - for (auto &arg : call.args()) - { + for (auto &arg : call.args()) { if (gutils->isConstantValue(arg)) args.push_back(gutils->getNewFromOriginal(arg)); else @@ -2659,8 +2656,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( else { SmallVector args; size_t i = 0; - for (auto &arg : call.args()) - { + for (auto &arg : call.args()) { if (gutils->isConstantValue(arg) || (funcName == "__dynamic_cast" && i > 0) || (funcName == "jl_ptr_to_array_1d" && i != 1) || @@ -2754,8 +2750,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( (Mode == DerivativeMode::ReverseModeGradient && backwardsShadow)) { SmallVector iargs; IRBuilder<> BuilderZ(gutils->getNewFromOriginal(&call)); - for (auto &arg : call.args()) - { + for (auto &arg : call.args()) { if (!gutils->isConstantValue(arg)) { Value *ptrshadow = gutils->invertPointerM(arg, BuilderZ); applyChainRule( @@ -2936,8 +2931,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( IRBuilder<> bb(placeholder); SmallVector args; - for (auto &arg : call.args()) - { + for (auto &arg : call.args()) { args.push_back(gutils->getNewFromOriginal(arg)); } @@ -3226,8 +3220,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( getForwardBuilder(Builder2); SmallVector args; - for (unsigned i = 0; i < call.arg_size(); ++i) - { + for (unsigned i = 0; i < call.arg_size(); ++i) { auto arg = call.getArgOperand(i); args.push_back(gutils->getNewFromOriginal(arg)); } @@ -3338,7 +3331,6 @@ bool AdjointGenerator::handleKnownCallDerivatives( replacement = B.CreatePointerCast( replacement, PointerType::getUnqual(call.getType()->getPointerElementType())); - } #endif if (int AS = cast(call.getType())->getAddressSpace()) { @@ -3802,8 +3794,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( SmallVector valtys; args.push_back(ptrshadow); valtys.push_back(ValueType::Shadow); - for (size_t i = 1; i < call.arg_size(); ++i) - { + for (size_t i = 1; i < call.arg_size(); ++i) { args.push_back(gutils->getNewFromOriginal(call.getArgOperand(i))); valtys.push_back(ValueType::Primal); } @@ -4066,8 +4057,7 @@ bool AdjointGenerator::handleKnownCallDerivatives( auto rule = [&args](Value *tofree) { args.push_back(tofree); }; applyChainRule(Builder2, rule, tofree); - for (size_t i = 1; i < call.arg_size(); i++) - { + for (size_t i = 1; i < call.arg_size(); i++) { args.push_back(gutils->getNewFromOriginal(call.getArgOperand(i))); } diff --git a/enzyme/Enzyme/Clang/EnzymeClang.cpp b/enzyme/Enzyme/Clang/EnzymeClang.cpp index 90ac5e562e30..8891d1b75772 100644 --- a/enzyme/Enzyme/Clang/EnzymeClang.cpp +++ b/enzyme/Enzyme/Clang/EnzymeClang.cpp @@ -321,16 +321,15 @@ struct EnzymeFunctionLikeAttrInfo : public ParsedAttrInfo { auto rval = ExprValueKind::VK_PRValue; StringRef cstr = Literal->getString(); Expr *exprs[2] = { - ImplicitCastExpr::Create(AST, FT, CastKind::CK_FunctionToPointerDecay, DR, - nullptr, rval, FPOptionsOverride()), - ImplicitCastExpr::Create( - AST, AST.getPointerType(CharTy), CastKind::CK_ArrayToPointerDecay, - StringLiteral::Create( - AST, cstr, stringkind, - /*Pascal*/ false, - AST.getStringLiteralArrayType(CharTy, cstr.size()), loc), - nullptr, rval, FPOptionsOverride()) - }; + ImplicitCastExpr::Create(AST, FT, CastKind::CK_FunctionToPointerDecay, + DR, nullptr, rval, FPOptionsOverride()), + ImplicitCastExpr::Create( + AST, AST.getPointerType(CharTy), CastKind::CK_ArrayToPointerDecay, + StringLiteral::Create( + AST, cstr, stringkind, + /*Pascal*/ false, + AST.getStringLiteralArrayType(CharTy, cstr.size()), loc), + nullptr, rval, FPOptionsOverride())}; auto IL = new (AST) InitListExpr(AST, loc, exprs, loc); V->setInit(IL); IL->setType(T); diff --git a/enzyme/Enzyme/DifferentialUseAnalysis.cpp b/enzyme/Enzyme/DifferentialUseAnalysis.cpp index b36dfe37d0ea..1078ad1fd1e5 100644 --- a/enzyme/Enzyme/DifferentialUseAnalysis.cpp +++ b/enzyme/Enzyme/DifferentialUseAnalysis.cpp @@ -624,8 +624,7 @@ bool DifferentialUseAnalysis::is_use_directly_needed_in_reverse( if (shouldDisableNoWrite(CI)) { writeOnlyNoCapture = false; } - for (size_t i = 0; i < CI->arg_size(); i++) - { + for (size_t i = 0; i < CI->arg_size(); i++) { if (val == CI->getArgOperand(i)) { if (!isNoCapture(CI, i)) { writeOnlyNoCapture = false; @@ -935,8 +934,7 @@ void DifferentialUseAnalysis::minCut(const DataLayout &DL, LoopInfo &OrigLI, noncapture = true; } else if (auto CI = dyn_cast(next)) { bool captures = false; - for (size_t i = 0; i < CI->arg_size(); i++) - { + for (size_t i = 0; i < CI->arg_size(); i++) { if (CI->getArgOperand(i) == V && !isNoCapture(CI, i)) { captures = true; break; @@ -1058,8 +1056,7 @@ bool DifferentialUseAnalysis::callShouldNotUseDerivative( // Next test if any allocation could be stored into one of the // arguments. if (!escapingNeededAllocation) - for (unsigned i = 0; i < call.arg_size(); ++i) - { + for (unsigned i = 0; i < call.arg_size(); ++i) { Value *a = call.getOperand(i); if (EnzymeJuliaAddrLoad && isSpecialPtr(a->getType())) diff --git a/enzyme/Enzyme/Enzyme.cpp b/enzyme/Enzyme/Enzyme.cpp index a33306489c27..2d7cc4b6eec4 100644 --- a/enzyme/Enzyme/Enzyme.cpp +++ b/enzyme/Enzyme/Enzyme.cpp @@ -677,8 +677,7 @@ class EnzymeBase { { unsigned width = 1; - for (auto [i, found] = std::tuple{0u, false}; i < CI->arg_size(); ++i) - { + for (auto [i, found] = std::tuple{0u, false}; i < CI->arg_size(); ++i) { Value *arg = CI->getArgOperand(i); if (auto MDName = getMetadataName(arg)) { @@ -690,8 +689,7 @@ class EnzymeBase { return {}; } - if (i + 1 >= CI->arg_size()) - { + if (i + 1 >= CI->arg_size()) { EmitFailure("MissingVectorWidth", CI->getDebugLoc(), CI, "constant integer followong enzyme_width is missing", *CI->getArgOperand(i), " in", *CI); @@ -795,8 +793,7 @@ class EnzymeBase { fn->getFunctionType()->getNumParams(), !(mode == DerivativeMode::ReverseModeCombined)); - for (unsigned i = 1 + sret; i < CI->arg_size(); ++i) - { + for (unsigned i = 1 + sret; i < CI->arg_size(); ++i) { Value *res = CI->getArgOperand(i); auto metaString = getMetadataName(res); // handle metadata @@ -1515,8 +1512,7 @@ class EnzymeBase { arg_types.push_back(BATCH_TYPE::VECTOR); } - for (unsigned i = 1 + sret; i < CI->arg_size(); ++i) - { + for (unsigned i = 1 + sret; i < CI->arg_size(); ++i) { Value *res = CI->getArgOperand(i); if (truei >= FT->getNumParams()) { @@ -1572,8 +1568,7 @@ class EnzymeBase { bool batch = batchOffset.count(i - 1) != 0; for (unsigned v = 0; v < width; ++v) { - if (i >= CI->arg_size()) - { + if (i >= CI->arg_size()) { EmitFailure("MissingVectorArg", CI->getDebugLoc(), CI, "__enzyme_batch missing vector argument at index ", i, ", need argument of type ", *PTy, " at call ", *CI); @@ -2738,8 +2733,7 @@ class EnzymeBase { Value *fn = CI->getArgOperand(0); SmallVector Args; SmallVector ArgTypes; - for (size_t i = 1; i < CI->arg_size(); ++i) - { + for (size_t i = 1; i < CI->arg_size(); ++i) { Args.push_back(CI->getArgOperand(i)); ArgTypes.push_back(CI->getArgOperand(i)->getType()); } @@ -3269,8 +3263,8 @@ AnalysisKey EnzymeNewPM::Key; #include "PreserveNVVM.h" #include "TypeAnalysis/TypeAnalysisPrinter.h" #include "llvm/Passes/PassBuilder.h" -#include "llvm/Transforms/IPO/AlwaysInliner.h" #include "llvm/Transforms/AggressiveInstCombine/AggressiveInstCombine.h" +#include "llvm/Transforms/IPO/AlwaysInliner.h" #include "llvm/Transforms/IPO/CalledValuePropagation.h" #include "llvm/Transforms/IPO/ConstantMerge.h" #include "llvm/Transforms/IPO/CrossDSOCFI.h" @@ -3306,8 +3300,7 @@ AnalysisKey EnzymeNewPM::Key; #include "llvm/Transforms/Scalar/LoopFlatten.h" #include "llvm/Transforms/Scalar/MergedLoadStoreMotion.h" -static InlineParams getInlineParamsFromOptLevel(OptimizationLevel Level) -{ +static InlineParams getInlineParamsFromOptLevel(OptimizationLevel Level) { return getInlineParams(Level.getSpeedupLevel(), Level.getSizeLevel()); } @@ -3330,9 +3323,7 @@ extern cl::opt SetLicmMssaOptCap; void augmentPassBuilder(llvm::PassBuilder &PB) { auto PB0 = new llvm::PassBuilder(PB); - auto prePass = [PB0](ModulePassManager &MPM, OptimizationLevel Level) - { - + auto prePass = [PB0](ModulePassManager &MPM, OptimizationLevel Level) { FunctionPassManager OptimizePM; OptimizePM.addPass(Float2IntPass()); OptimizePM.addPass(LowerConstantIntrinsicsPass()); @@ -3359,8 +3350,7 @@ void augmentPassBuilder(llvm::PassBuilder &PB) { MPM.addPass(createModuleToFunctionPassAdaptor(std::move(OptimizePM))); }; - auto loadPass = [prePass](ModulePassManager &MPM, OptimizationLevel Level) - { + auto loadPass = [prePass](ModulePassManager &MPM, OptimizationLevel Level) { MPM.addPass(PreserveNVVMNewPM(/*Begin*/ true)); if (!EnzymeEnable) @@ -3396,11 +3386,11 @@ void augmentPassBuilder(llvm::PassBuilder &PB) { MPM.addPass(createModuleToFunctionPassAdaptor(std::move(OptimizerPM2))); MPM.addPass(GlobalOptPass()); }; -// TODO need for perf reasons to move Enzyme pass to the pre vectorization. + // TODO need for perf reasons to move Enzyme pass to the pre vectorization. PB.registerOptimizerEarlyEPCallback(loadPass); - auto loadNVVM = [](ModulePassManager &MPM, OptimizationLevel) - { MPM.addPass(PreserveNVVMNewPM(/*Begin*/ true)); }; + auto loadNVVM = [](ModulePassManager &MPM, OptimizationLevel) { MPM.addPass(PreserveNVVMNewPM(/*Begin*/ true)); + }; // We should register at vectorizer start for consistency, however, // that requires a functionpass, and we have a modulepass. diff --git a/enzyme/Enzyme/EnzymeLogic.cpp b/enzyme/Enzyme/EnzymeLogic.cpp index 3a31eef30a3d..53025be7c441 100644 --- a/enzyme/Enzyme/EnzymeLogic.cpp +++ b/enzyme/Enzyme/EnzymeLogic.cpp @@ -504,8 +504,7 @@ struct CacheAnalysis { // function to the callee. // because memory location x modified after parent returns => x modified // after callee returns. - for (unsigned i = 0; i < callsite_op->arg_size(); ++i) - { + for (unsigned i = 0; i < callsite_op->arg_size(); ++i) { args.push_back(callsite_op->getArgOperand(i)); // If the UnderlyingObject is from one of this function's arguments, then @@ -807,8 +806,7 @@ void calculateUnusedValuesInFunction( if (shouldDisableNoWrite(CI)) { writeOnlyNoCapture = false; } - for (size_t i = 0; i < CI->arg_size(); i++) - { + for (size_t i = 0; i < CI->arg_size(); i++) { if (cur == CI->getArgOperand(i)) { if (!isNoCapture(CI, i)) { writeOnlyNoCapture = false; @@ -1081,8 +1079,7 @@ void calculateUnusedValuesInFunction( if (shouldDisableNoWrite(CI)) { writeOnlyNoCapture = false; } - for (size_t i = 0; i < CI->arg_size(); i++) - { + for (size_t i = 0; i < CI->arg_size(); i++) { if (val == CI->getArgOperand(i)) { if (!isNoCapture(CI, i)) { writeOnlyNoCapture = false; @@ -1318,8 +1315,7 @@ bool shouldAugmentCall(CallInst *op, const GradientUtils *gutils) { if (!called || called->empty()) modifyPrimal = true; - for (unsigned i = 0; i < op->arg_size(); ++i) - { + for (unsigned i = 0; i < op->arg_size(); ++i) { if (gutils->isConstantValue(op->getArgOperand(i)) && called && !called->empty()) { continue; @@ -1719,8 +1715,7 @@ void clearFunctionAttributes(Function *f) { if (f->hasFnAttribute(Attribute::OptimizeNone)) f->removeFnAttr(Attribute::OptimizeNone); - if (f->getAttributes().getRetDereferenceableBytes()) - { + if (f->getAttributes().getRetDereferenceableBytes()) { f->removeRetAttr(Attribute::Dereferenceable); } @@ -2546,8 +2541,7 @@ const AugmentedReturn &EnzymeLogic::CreateAugmentedPrimal( if (gutils->newFunc->hasFnAttribute(Attribute::OptimizeNone)) gutils->newFunc->removeFnAttr(Attribute::OptimizeNone); - if (gutils->newFunc->getAttributes().getRetDereferenceableBytes()) - { + if (gutils->newFunc->getAttributes().getRetDereferenceableBytes()) { gutils->newFunc->removeRetAttr(Attribute::Dereferenceable); } diff --git a/enzyme/Enzyme/FunctionUtils.cpp b/enzyme/Enzyme/FunctionUtils.cpp index 3da24e8ad0fd..384180656e10 100644 --- a/enzyme/Enzyme/FunctionUtils.cpp +++ b/enzyme/Enzyme/FunctionUtils.cpp @@ -195,8 +195,7 @@ bool couldFunctionArgumentCapture(llvm::CallInst *CI, llvm::Value *val) { return false; auto arg = F->arg_begin(); - for (size_t i = 0, size = CI->arg_size(); i < size; i++) - { + for (size_t i = 0, size = CI->arg_size(); i < size; i++) { if (val == CI->getArgOperand(i)) { // This is a vararg, assume captured if (arg == F->arg_end()) { @@ -437,8 +436,7 @@ void RecursivelyReplaceAddressSpace(Value *AI, Value *rep, bool legal) { } IRBuilder<> B(CI); auto Addr = B.CreateAddrSpaceCast(rep, prev->getType()); - for (size_t i = 0; i < CI->arg_size(); i++) - { + for (size_t i = 0; i < CI->arg_size(); i++) { if (CI->getArgOperand(i) == prev) { CI->setArgOperand(i, Addr); } @@ -1543,8 +1541,8 @@ Function *PreProcessCache::preprocessForClone(Function *F, if (inF) { bool activeCall = false; bool hasWrite = false; - MemoryLocation - Loc = MemoryLocation(&g, LocationSize::beforeOrAfterPointer()); + MemoryLocation Loc = + MemoryLocation(&g, LocationSize::beforeOrAfterPointer()); for (CallInst *CI : Calls) { if (isa(CI)) From 6997a01c711db921c4a2e7d94f919fd0f6ac365e Mon Sep 17 00:00:00 2001 From: "William S. Moses" Date: Tue, 10 Sep 2024 10:09:59 -0400 Subject: [PATCH 07/19] bump julia compat --- .packaging/build_tarballs.jl | 4 ++-- enzyme/Enzyme/Enzyme.cpp | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.packaging/build_tarballs.jl b/.packaging/build_tarballs.jl index c67b348b218d..f52e40d3998b 100644 --- a/.packaging/build_tarballs.jl +++ b/.packaging/build_tarballs.jl @@ -11,7 +11,7 @@ repo = "https://github.com/EnzymeAD/Enzyme.git" auto_version = "%ENZYME_VERSION%" version = VersionNumber(split(auto_version, "/")[end]) -llvm_versions = [v"11.0.1", v"12.0.1", v"13.0.1", v"14.0.2", v"15.0.7", v"16.0.6", v"17.0.6"] +llvm_versions = [v"15.0.7", v"16.0.6", v"17.0.6"] # Collection of sources required to build attr sources = [ @@ -167,6 +167,6 @@ for (i,build) in enumerate(builds) build_tarballs(i == lastindex(builds) ? non_platform_ARGS : non_reg_ARGS, name, version, sources, script, build.platforms, build.products, build.dependencies; - preferred_gcc_version=build.gcc_version, julia_compat="1.6", + preferred_gcc_version=build.gcc_version, julia_compat="1.10", augment_platform_block, lazy_artifacts=true) # drop when julia_compat >= 1.7 end diff --git a/enzyme/Enzyme/Enzyme.cpp b/enzyme/Enzyme/Enzyme.cpp index 2d7cc4b6eec4..831d3910461a 100644 --- a/enzyme/Enzyme/Enzyme.cpp +++ b/enzyme/Enzyme/Enzyme.cpp @@ -3389,7 +3389,8 @@ void augmentPassBuilder(llvm::PassBuilder &PB) { // TODO need for perf reasons to move Enzyme pass to the pre vectorization. PB.registerOptimizerEarlyEPCallback(loadPass); - auto loadNVVM = [](ModulePassManager &MPM, OptimizationLevel) { MPM.addPass(PreserveNVVMNewPM(/*Begin*/ true)); + auto loadNVVM = [](ModulePassManager &MPM, OptimizationLevel) { + MPM.addPass(PreserveNVVMNewPM(/*Begin*/ true)); }; // We should register at vectorizer start for consistency, however, From 70f924187d1b7355b6e0f80d3825f4b7355f4611 Mon Sep 17 00:00:00 2001 From: "William S. Moses" Date: Tue, 10 Sep 2024 10:22:31 -0400 Subject: [PATCH 08/19] fix --- .github/workflows/bcload.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/bcload.yml b/.github/workflows/bcload.yml index f21a609ef2be..c278f0621b28 100644 --- a/.github/workflows/bcload.yml +++ b/.github/workflows/bcload.yml @@ -11,7 +11,7 @@ jobs: fail-fast: false matrix: # BCLoad tests only run with old pass manager [aka up to and including 13] - llvm: ["16"] + llvm: ["15"] build: ["Release"] # "RelWithDebInfo" os: [ubuntu-22.04] From ce2a364e6eb026d15e8484a6cf49954c231d6e57 Mon Sep 17 00:00:00 2001 From: Billy Moses Date: Tue, 10 Sep 2024 18:18:08 +0000 Subject: [PATCH 09/19] fix cout --- enzyme/Enzyme/EnzymeLogic.cpp | 69 ++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/enzyme/Enzyme/EnzymeLogic.cpp b/enzyme/Enzyme/EnzymeLogic.cpp index 53025be7c441..f91bf16384d5 100644 --- a/enzyme/Enzyme/EnzymeLogic.cpp +++ b/enzyme/Enzyme/EnzymeLogic.cpp @@ -5614,11 +5614,6 @@ llvm::Function *EnzymeLogic::CreateBatch(RequestContext context, BasicBlock::Create(NewF->getContext(), "placeholders", NewF); IRBuilder<> PlaceholderBuilder(placeholderBB); -#if LLVM_VERSION_MAJOR >= 18 - auto It = PlaceholderBuilder.GetInsertPoint(); - It.setHeadBit(true); - PlaceholderBuilder.SetInsertPoint(It); -#endif PlaceholderBuilder.SetCurrentDebugLocation(DebugLoc()); ValueToValueMapTy vmap; auto DestArg = NewF->arg_begin(); @@ -5990,6 +5985,16 @@ llvm::Value *EnzymeLogic::CreateNoFree(RequestContext context, } } + // clang-format off + const char* NoFreeDemanglesStartsWith[] = { + "std::basic_ostream>& std::__ostream_insert>", + "std::basic_ostream>::operator<<", + "std::ostream::operator<<", + "std::ostream& std::ostream::_M_insert", + "std::basic_ostream>& std::__ostream_insert", + }; + // clang-format on + if (auto CI = dyn_cast(todiff)) { TargetLibraryInfo &TLI = PPC.FAM.getResult(*CI->getParent()->getParent()); @@ -5997,14 +6002,6 @@ llvm::Value *EnzymeLogic::CreateNoFree(RequestContext context, return CI; if (auto F = CI->getCalledFunction()) { - // clang-format off - const char* NoFreeDemanglesStartsWith[] = { - "std::basic_ostream>& std::__ostream_insert>", - "std::basic_ostream>::operator<<", - "std::ostream::operator<<", - "std::ostream& std::ostream::_M_insert", - }; - // clang-format on demangledCall = llvm::demangle(F->getName().str()); // replace all '> >' with '>>' @@ -6018,6 +6015,45 @@ llvm::Value *EnzymeLogic::CreateNoFree(RequestContext context, return CI; } } + if (auto PN = dyn_cast(todiff)) { + Value *illegal = nullptr; + for (auto &op : PN->incoming_values()) { + + if (auto CI = dyn_cast(op)) { + TargetLibraryInfo &TLI = + PPC.FAM.getResult(*CI->getParent()->getParent()); + if (isAllocationFunction(getFuncNameFromCall(CI), TLI)) + continue; + if (auto F = CI->getCalledFunction()) { + + + demangledCall = llvm::demangle(F->getName().str()); + // replace all '> >' with '>>' + size_t start = 0; + while ((start = demangledCall.find("> >", start)) != std::string::npos) { + demangledCall.replace(start, 3, ">>"); + } + + bool legal = false; + for (auto Name : NoFreeDemanglesStartsWith) + if (startsWith(demangledCall, Name)) { + legal = true; + break; + } + illegal = op; + break; + } + continue; + } + } + demangledCall = ""; + illegal = op; + break; + } + if (!illegal) + return PN; + + } if (auto GV = dyn_cast(todiff)) { if (GV->getName() == "_ZSt4cerr") @@ -6072,7 +6108,12 @@ llvm::Value *EnzymeLogic::CreateNoFree(RequestContext context, std::string s; llvm::raw_string_ostream ss(s); ss << "No create nofree of unknown value\n"; - ss << *todiff << "\n"; + ss << *todiff << "\n"; + if (auto PN = dyn_cast(todiff)) { + for (auto &op : PN->incoming_values()) { + ss << " - " << *op << "\n"; + } + } if (demangledCall.size()) { ss << " demangled (" << demangledCall << ")\n"; } From a7cf51f9c150eb9bbe882f44b4aa30bc9e46a17f Mon Sep 17 00:00:00 2001 From: Billy Moses Date: Tue, 10 Sep 2024 18:20:16 +0000 Subject: [PATCH 10/19] fix --- enzyme/Enzyme/EnzymeLogic.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/enzyme/Enzyme/EnzymeLogic.cpp b/enzyme/Enzyme/EnzymeLogic.cpp index f91bf16384d5..613e2216709c 100644 --- a/enzyme/Enzyme/EnzymeLogic.cpp +++ b/enzyme/Enzyme/EnzymeLogic.cpp @@ -6044,7 +6044,6 @@ llvm::Value *EnzymeLogic::CreateNoFree(RequestContext context, break; } continue; - } } demangledCall = ""; illegal = op; From 373e5b17b538dc3efa19fd037bcd2f48af0f9ad3 Mon Sep 17 00:00:00 2001 From: "William S. Moses" Date: Tue, 10 Sep 2024 14:21:19 -0400 Subject: [PATCH 11/19] fix --- enzyme/Enzyme/EnzymeLogic.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enzyme/Enzyme/EnzymeLogic.cpp b/enzyme/Enzyme/EnzymeLogic.cpp index 613e2216709c..9b761b3068aa 100644 --- a/enzyme/Enzyme/EnzymeLogic.cpp +++ b/enzyme/Enzyme/EnzymeLogic.cpp @@ -6043,7 +6043,7 @@ llvm::Value *EnzymeLogic::CreateNoFree(RequestContext context, illegal = op; break; } - continue; + continue; } demangledCall = ""; illegal = op; From db0d003643a3b42b08825b3316aaf38440dc1bec Mon Sep 17 00:00:00 2001 From: "William S. Moses" Date: Tue, 10 Sep 2024 14:21:34 -0400 Subject: [PATCH 12/19] fix --- enzyme/Enzyme/EnzymeLogic.cpp | 64 +++++++++++++++++------------------ 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/enzyme/Enzyme/EnzymeLogic.cpp b/enzyme/Enzyme/EnzymeLogic.cpp index 9b761b3068aa..68a9f29ade28 100644 --- a/enzyme/Enzyme/EnzymeLogic.cpp +++ b/enzyme/Enzyme/EnzymeLogic.cpp @@ -5994,7 +5994,7 @@ llvm::Value *EnzymeLogic::CreateNoFree(RequestContext context, "std::basic_ostream>& std::__ostream_insert", }; // clang-format on - + if (auto CI = dyn_cast(todiff)) { TargetLibraryInfo &TLI = PPC.FAM.getResult(*CI->getParent()->getParent()); @@ -6002,7 +6002,6 @@ llvm::Value *EnzymeLogic::CreateNoFree(RequestContext context, return CI; if (auto F = CI->getCalledFunction()) { - demangledCall = llvm::demangle(F->getName().str()); // replace all '> >' with '>>' size_t start = 0; @@ -6018,40 +6017,39 @@ llvm::Value *EnzymeLogic::CreateNoFree(RequestContext context, if (auto PN = dyn_cast(todiff)) { Value *illegal = nullptr; for (auto &op : PN->incoming_values()) { - + if (auto CI = dyn_cast(op)) { - TargetLibraryInfo &TLI = - PPC.FAM.getResult(*CI->getParent()->getParent()); - if (isAllocationFunction(getFuncNameFromCall(CI), TLI)) - continue; - if (auto F = CI->getCalledFunction()) { - - - demangledCall = llvm::demangle(F->getName().str()); - // replace all '> >' with '>>' - size_t start = 0; - while ((start = demangledCall.find("> >", start)) != std::string::npos) { - demangledCall.replace(start, 3, ">>"); - } - - bool legal = false; - for (auto Name : NoFreeDemanglesStartsWith) - if (startsWith(demangledCall, Name)) { - legal = true; - break; - } - illegal = op; - break; - } - continue; + TargetLibraryInfo &TLI = PPC.FAM.getResult( + *CI->getParent()->getParent()); + if (isAllocationFunction(getFuncNameFromCall(CI), TLI)) + continue; + if (auto F = CI->getCalledFunction()) { + + demangledCall = llvm::demangle(F->getName().str()); + // replace all '> >' with '>>' + size_t start = 0; + while ((start = demangledCall.find("> >", start)) != + std::string::npos) { + demangledCall.replace(start, 3, ">>"); + } + + bool legal = false; + for (auto Name : NoFreeDemanglesStartsWith) + if (startsWith(demangledCall, Name)) { + legal = true; + break; + } + illegal = op; + break; + } + continue; } demangledCall = ""; illegal = op; break; } if (!illegal) - return PN; - + return PN; } if (auto GV = dyn_cast(todiff)) { @@ -6107,11 +6105,11 @@ llvm::Value *EnzymeLogic::CreateNoFree(RequestContext context, std::string s; llvm::raw_string_ostream ss(s); ss << "No create nofree of unknown value\n"; - ss << *todiff << "\n"; + ss << *todiff << "\n"; if (auto PN = dyn_cast(todiff)) { - for (auto &op : PN->incoming_values()) { - ss << " - " << *op << "\n"; - } + for (auto &op : PN->incoming_values()) { + ss << " - " << *op << "\n"; + } } if (demangledCall.size()) { ss << " demangled (" << demangledCall << ")\n"; From c232f4a2fcac4d585a752140ab61f29b66c8a406 Mon Sep 17 00:00:00 2001 From: Billy Moses Date: Tue, 10 Sep 2024 18:22:51 +0000 Subject: [PATCH 13/19] fix --- enzyme/Enzyme/EnzymeLogic.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/enzyme/Enzyme/EnzymeLogic.cpp b/enzyme/Enzyme/EnzymeLogic.cpp index 68a9f29ade28..abdedc24fc8f 100644 --- a/enzyme/Enzyme/EnzymeLogic.cpp +++ b/enzyme/Enzyme/EnzymeLogic.cpp @@ -6039,8 +6039,10 @@ llvm::Value *EnzymeLogic::CreateNoFree(RequestContext context, legal = true; break; } - illegal = op; - break; + if (!legal) { + illegal = op; + break; + } } continue; } From f09df0ee5064064928af9b8d6cd3f0f92d4c4b44 Mon Sep 17 00:00:00 2001 From: "William S. Moses" Date: Tue, 10 Sep 2024 14:23:08 -0400 Subject: [PATCH 14/19] fmt --- enzyme/Enzyme/EnzymeLogic.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/enzyme/Enzyme/EnzymeLogic.cpp b/enzyme/Enzyme/EnzymeLogic.cpp index abdedc24fc8f..fb480ba16296 100644 --- a/enzyme/Enzyme/EnzymeLogic.cpp +++ b/enzyme/Enzyme/EnzymeLogic.cpp @@ -6039,10 +6039,10 @@ llvm::Value *EnzymeLogic::CreateNoFree(RequestContext context, legal = true; break; } - if (!legal) { + if (!legal) { illegal = op; break; - } + } } continue; } From bee972c8f105f22420e6bcb2104f74463f235a27 Mon Sep 17 00:00:00 2001 From: Billy Moses Date: Tue, 10 Sep 2024 22:06:38 +0000 Subject: [PATCH 15/19] fix opaque ptr --- enzyme/test/Enzyme/ReverseMode/freefn.ll | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/enzyme/test/Enzyme/ReverseMode/freefn.ll b/enzyme/test/Enzyme/ReverseMode/freefn.ll index ba71925a21ad..73ba033b3509 100644 --- a/enzyme/test/Enzyme/ReverseMode/freefn.ll +++ b/enzyme/test/Enzyme/ReverseMode/freefn.ll @@ -1,26 +1,26 @@ ; RUN: if [ %llvmver -ge 15 ]; then %opt < %s %newLoadEnzyme -enzyme-preopt=false -passes="enzyme,function(mem2reg,sroa,instsimplify)" -S | FileCheck %s; fi -define double @_f2(ptr %0, i64 %1) personality ptr null { - call void @__rust_dealloc(ptr %0, i64 %1) +define double @_f2(i8* %0, i64 %1) { + call void @__rust_dealloc(i8* %0, i64 %1) ret double 0.000000e+00 } -declare void @__rust_dealloc(ptr, i64) +declare void @__rust_dealloc(i8*, i64) declare double @__enzyme_fwddiff(...) define double @enzyme_opt_helper_0() { - %1 = call double (...) @__enzyme_fwddiff(ptr @_f2, metadata !"enzyme_dup", ptr null, ptr null, metadata !"enzyme_const", i64 0) + %1 = call double (...) @__enzyme_fwddiff(double (i8*, i64)* @_f2, metadata !"enzyme_dup", i8* null, i8* null, metadata !"enzyme_const", i64 0) ret double 0.000000e+00 } -; CHECK: define internal double @fwddiffe_f2(ptr %0, ptr %"'", i64 %1) -; CHECK-NEXT: call void @__rust_dealloc(ptr %0, i64 %1) -; CHECK-NEXT: %3 = icmp ne ptr %0, %"'" +; CHECK: define internal double @fwddiffe_f2(i8* %0, i8* %"'", i64 %1) +; CHECK-NEXT: call void @__rust_dealloc(i8* %0, i64 %1) +; CHECK-NEXT: %3 = icmp ne i8* %0, %"'" ; CHECK-NEXT: br i1 %3, label %free0.i, label %__enzyme_checked_free_1___rust_dealloc.exit ; CHECK: free0.i: -; CHECK-NEXT: call void @__rust_dealloc(ptr %"'", i64 %1) +; CHECK-NEXT: call void @__rust_dealloc(i8* %"'", i64 %1) ; CHECK-NEXT: br label %__enzyme_checked_free_1___rust_dealloc.exit ; CHECK: __enzyme_checked_free_1___rust_dealloc.exit: From eaaadd497aa876222820591ae0aceb31d6b67035 Mon Sep 17 00:00:00 2001 From: Billy Moses Date: Tue, 10 Sep 2024 22:12:38 +0000 Subject: [PATCH 16/19] unblock integration test --- enzyme/test/Integration/ReverseMode/integrateexp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enzyme/test/Integration/ReverseMode/integrateexp.cpp b/enzyme/test/Integration/ReverseMode/integrateexp.cpp index b0af87422627..da89a0049049 100644 --- a/enzyme/test/Integration/ReverseMode/integrateexp.cpp +++ b/enzyme/test/Integration/ReverseMode/integrateexp.cpp @@ -5,7 +5,7 @@ // RUN: %clang++ -fno-use-cxa-atexit -ffast-math -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O2 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli - // RUN: %clang++ -Xclang -new-struct-path-tbaa -fno-use-cxa-atexit -ffast-math -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O1 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli - // note not doing O0 below as to ensure we get tbaa -// RUN: %clang++ -Xclang -new-struct-path-tbaa -fno-use-cxa-atexit -ffast-math -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions %O0TBAA %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli - +// TODO: %clang++ -Xclang -new-struct-path-tbaa -fno-use-cxa-atexit -ffast-math -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions %O0TBAA %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli - // RUN: %clang++ -fno-use-cxa-atexit -ffast-math -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O3 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -S | %lli - // RUN: %clang++ -fno-use-cxa-atexit -ffast-math -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O2 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -S | %lli - // Note the below ends up with a memcpy from undefined memory data for type analysis to handle From 78e3fb4f7e54174f3015a7c67b290cd2555655ff Mon Sep 17 00:00:00 2001 From: William Moses Date: Tue, 10 Sep 2024 21:17:45 -0400 Subject: [PATCH 17/19] Update enzyme-ci.yml --- .github/workflows/enzyme-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/enzyme-ci.yml b/.github/workflows/enzyme-ci.yml index 622c6e22e82e..7a183dc6d2c0 100644 --- a/.github/workflows/enzyme-ci.yml +++ b/.github/workflows/enzyme-ci.yml @@ -15,7 +15,7 @@ jobs: strategy: fail-fast: false matrix: - llvm: ["15", "16", "17", "18"] + llvm: ["15", "16"] build: ["Release", "Debug"] # "RelWithDebInfo" os: [ubuntu-22.04] From c5d64dbacf5eb04ede8e40349d8d63e53b2a9228 Mon Sep 17 00:00:00 2001 From: William Moses Date: Wed, 11 Sep 2024 12:54:29 -0400 Subject: [PATCH 18/19] Update ccpp.yml --- .github/workflows/ccpp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index 7c3ed440477d..4d433c4fd3f4 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -19,7 +19,7 @@ jobs: matrix: llvm: ["15", "16", "17", "18"] build: ["Release"] # "RelWithDebInfo" - os: [ubuntu-22.04] + os: [ubuntu-20.04] timeout-minutes: 45 From 5c09f2744e37ae90bff19d5d9c5cec5666e65bbd Mon Sep 17 00:00:00 2001 From: Billy Moses Date: Wed, 11 Sep 2024 17:39:26 -0400 Subject: [PATCH 19/19] Fix macos --- .github/workflows/enzyme-ci.yml | 2 +- enzyme/Enzyme/CallDerivatives.cpp | 7 ++--- enzyme/test/Enzyme/ReverseMode/blas/syrk_f.ll | 5 ++-- .../ReverseMode/gsl_sf_legendre_array_e.ll | 2 +- enzyme/test/Enzyme/ReverseMode/previdxout.ll | 4 +-- enzyme/tools/enzyme-tblgen/blas-tblgen.cpp | 28 ++++++++++++------- 6 files changed, 28 insertions(+), 20 deletions(-) diff --git a/.github/workflows/enzyme-ci.yml b/.github/workflows/enzyme-ci.yml index 7a183dc6d2c0..f92ea91bf4ad 100644 --- a/.github/workflows/enzyme-ci.yml +++ b/.github/workflows/enzyme-ci.yml @@ -57,7 +57,7 @@ jobs: strategy: fail-fast: false matrix: - llvm: ["15", "16", "17", "18"] + llvm: ["15", "16"] build: ["Release", "Debug"] # "RelWithDebInfo" timeout-minutes: 30 diff --git a/enzyme/Enzyme/CallDerivatives.cpp b/enzyme/Enzyme/CallDerivatives.cpp index 8ec903f72c62..2bfd6253e61d 100644 --- a/enzyme/Enzyme/CallDerivatives.cpp +++ b/enzyme/Enzyme/CallDerivatives.cpp @@ -2534,10 +2534,9 @@ bool AdjointGenerator::handleKnownCallDerivatives( PointerType::getUnqual(types[2])), idxs); - auto acc = Builder2.CreateFAdd( - acc_idx, - Builder2.CreateFMul(Builder2.CreateLoad(types[2], dtmp_idx), - Builder2.CreateLoad(types[2], d_req))); + auto l0 = Builder2.CreateLoad(types[2], dtmp_idx); + auto l1 = Builder2.CreateLoad(types[2], d_req); + auto acc = Builder2.CreateFAdd(acc_idx, Builder2.CreateFMul(l0, l1)); Builder2.CreateStore(Constant::getNullValue(types[2]), d_req); acc_idx->addIncoming(acc, loopBlock); diff --git a/enzyme/test/Enzyme/ReverseMode/blas/syrk_f.ll b/enzyme/test/Enzyme/ReverseMode/blas/syrk_f.ll index a933c13df257..5f25031256b9 100644 --- a/enzyme/test/Enzyme/ReverseMode/blas/syrk_f.ll +++ b/enzyme/test/Enzyme/ReverseMode/blas/syrk_f.ll @@ -120,12 +120,13 @@ entry: ; CHECK-NEXT: %[[i27:.+]] = mul i64 %[[i26]], %[[i17]] ; CHECK-NEXT: %[[i28:.+]] = add i64 %[[i23]], %[[i27]] ; CHECK-NEXT: %[[i15:.+]] = bitcast i8* %"C'" to double* + ; CHECK-NEXT: %[[i29:.+]] = getelementptr double, double* %[[i15]], i64 %[[i28]] ; CHECK-NEXT: %[[zz:.+]] = bitcast double* %[[i29]] to i8* -; CHECK-NEXT: %[[mm:.+]] = bitcast i8* %[[zz]] to double* -; CHECK-NEXT: %[[i30:.+]] = load double, double* %[[mm]], align 8 ; CHECK-NEXT: %[[i31:.+]] = bitcast i8* %alpha_p to double* ; CHECK-NEXT: %[[i32:.+]] = load double, double* %[[i31]], align 8 +; CHECK-NEXT: %[[mm:.+]] = bitcast i8* %[[zz]] to double* +; CHECK-NEXT: %[[i30:.+]] = load double, double* %[[mm]], align 8 ; CHECK-NEXT: %[[i33:.+]] = fmul fast double %[[i32]], %[[i30]] ; CHECK-NEXT: store double %[[i33]], double* %byref.FMul, align 8 ; CHECK-NEXT: store i64 0, i64* %byref.constant.int.0, align 4 diff --git a/enzyme/test/Enzyme/ReverseMode/gsl_sf_legendre_array_e.ll b/enzyme/test/Enzyme/ReverseMode/gsl_sf_legendre_array_e.ll index 617f8c3204a9..7d33cb87db32 100644 --- a/enzyme/test/Enzyme/ReverseMode/gsl_sf_legendre_array_e.ll +++ b/enzyme/test/Enzyme/ReverseMode/gsl_sf_legendre_array_e.ll @@ -47,8 +47,8 @@ declare double @__enzyme_autodiff(...) ; CHECK-NEXT: %[[i5]] = add nuw nsw i32 %[[i4]], 1 ; CHECK-NEXT: %[[i6:.+]] = getelementptr inbounds double, double* %[[i1]], i32 %[[i4]] ; CHECK-NEXT: %[[i7:.+]] = getelementptr inbounds double, double* %"a4'", i32 %[[i4]] -; CHECK-NEXT: %[[i8:.+]] = load double, double* %[[i7]], align 8 ; CHECK-NEXT: %[[i9:.+]] = load double, double* %[[i6]], align 8 +; CHECK-NEXT: %[[i8:.+]] = load double, double* %[[i7]], align 8 ; CHECK-NEXT: %[[i10:.+]] = fmul fast double %[[i9]], %[[i8]] ; CHECK-NEXT: %[[p12]] = fadd fast double %[[p5]], %[[i10]] ; CHECK-NEXT: store double 0.000000e+00, double* %[[i7]], align 8 diff --git a/enzyme/test/Enzyme/ReverseMode/previdxout.ll b/enzyme/test/Enzyme/ReverseMode/previdxout.ll index baa068f7dc51..6c1e21a3c332 100644 --- a/enzyme/test/Enzyme/ReverseMode/previdxout.ll +++ b/enzyme/test/Enzyme/ReverseMode/previdxout.ll @@ -12,12 +12,12 @@ declare i8* @malloc(i64) declare double @__enzyme_autodiff(i8*, double, i64) -declare void @printf(i8*, double) +declare void @printf(i8*, ...) define i64 @main() { bb: %i = tail call double @__enzyme_autodiff(i8* bitcast (double (double, i64)* @f to i8*), double 2.000000e+00, i64 2) - call void @printf(i8* nonnull dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @a0, i64 0, i64 0), double %i) + call void (i8*, ...) @printf(i8* nonnull dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @a0, i64 0, i64 0), double %i) ret i64 0 } diff --git a/enzyme/tools/enzyme-tblgen/blas-tblgen.cpp b/enzyme/tools/enzyme-tblgen/blas-tblgen.cpp index ab8f5c5668e1..b55b155edebe 100644 --- a/enzyme/tools/enzyme-tblgen/blas-tblgen.cpp +++ b/enzyme/tools/enzyme-tblgen/blas-tblgen.cpp @@ -1038,18 +1038,11 @@ void rev_call_arg(bool forward, DagInit *ruleDag, const TGPattern &pattern, } os << "SmallVector vals;\n"; os << "for(size_t i=0; igetNumArgs() - 1) - << ".size(); i++) vals.push_back("; - if (op != "Select") - os << "to_blas_callconv(Builder2, "; - if (op == "Select") - os << " CreateSelect(Builder2, "; - else - os << "Builder2.Create" << op << "("; + << ".size(); i++) {\n"; const auto tys = Def->getValueAsListOfStrings("tys"); for (size_t i = 0; i < Dag->getNumArgs(); i++) { - if (i != 0) - os << ", "; + os << " auto subarg_" << i << " = "; if (op != "Select" || i == 0) os << "load_if_ref(Builder2, " << tys[i] << ", marg_" << i << "[marg_" << i << ".size() == 1 ? 0 : i], byRef)"; @@ -1058,6 +1051,21 @@ void rev_call_arg(bool forward, DagInit *ruleDag, const TGPattern &pattern, "marg_1[marg_1.size() == 1 ? 0 : i]->getType())"; else os << "marg_" << i << "[marg_" << i << ".size() == 1 ? 0 : i]"; + os << ";\n"; + } + + os << " vals.push_back("; + if (op != "Select") + os << "to_blas_callconv(Builder2, "; + if (op == "Select") + os << " CreateSelect(Builder2, "; + else + os << "Builder2.Create" << op << "("; + + for (size_t i = 0; i < Dag->getNumArgs(); i++) { + if (i != 0) + os << ", "; + os << "subarg_" << i; } if (op != "Select") os << "), byRef, cublas, julia_decl_type, " @@ -1065,7 +1073,7 @@ void rev_call_arg(bool forward, DagInit *ruleDag, const TGPattern &pattern, << Def->getValueAsString("s") << "\" )"; else os << ")"; - os << ");\n vals; })"; + os << ");\n }\n vals; })"; return; } if (Def->isSubClassOf("BIntrinsic")) {