// This file is a part of Julia. License is MIT: https://julialang.org/license #ifndef JL_PASSES_H #define JL_PASSES_H #include "analyzer_annotations.h" #include #include using namespace llvm; // Function Passes struct DemoteFloat16Pass : PassInfoMixin { PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) JL_NOTSAFEPOINT; static bool isRequired() { return true; } }; struct CombineMulAddPass : PassInfoMixin { PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) JL_NOTSAFEPOINT; }; struct LateLowerGCPass : PassInfoMixin { PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) JL_NOTSAFEPOINT; static bool isRequired() { return true; } }; struct AllocOptPass : PassInfoMixin { PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) JL_NOTSAFEPOINT; }; struct PropagateJuliaAddrspacesPass : PassInfoMixin { PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) JL_NOTSAFEPOINT; static bool isRequired() { return true; } }; struct LowerExcHandlersPass : PassInfoMixin { PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) JL_NOTSAFEPOINT; static bool isRequired() { return true; } }; struct GCInvariantVerifierPass : PassInfoMixin { bool Strong; GCInvariantVerifierPass(bool Strong = false) JL_NOTSAFEPOINT : Strong(Strong) {} PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) JL_NOTSAFEPOINT; static bool isRequired() { return true; } }; struct FinalLowerGCPass : PassInfoMixin { PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) JL_NOTSAFEPOINT; static bool isRequired() { return true; } }; // Module Passes struct CPUFeaturesPass : PassInfoMixin { PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM) JL_NOTSAFEPOINT; static bool isRequired() { return true; } }; struct RemoveNIPass : PassInfoMixin { PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM) JL_NOTSAFEPOINT; static bool isRequired() { return true; } }; struct MultiVersioningPass : PassInfoMixin { bool external_use; MultiVersioningPass(bool external_use = false) : external_use(external_use) {} PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM) JL_NOTSAFEPOINT; static bool isRequired() { return true; } }; struct RemoveJuliaAddrspacesPass : PassInfoMixin { PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM) JL_NOTSAFEPOINT; static bool isRequired() { return true; } }; struct RemoveAddrspacesPass : PassInfoMixin { std::function ASRemapper; RemoveAddrspacesPass() JL_NOTSAFEPOINT; RemoveAddrspacesPass(std::function ASRemapper) JL_NOTSAFEPOINT : ASRemapper(std::move(ASRemapper)) {} ~RemoveAddrspacesPass() JL_NOTSAFEPOINT = default; PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM) JL_NOTSAFEPOINT; static bool isRequired() { return true; } }; struct LowerPTLSPass : PassInfoMixin { bool imaging_mode; LowerPTLSPass(bool imaging_mode=false) JL_NOTSAFEPOINT : imaging_mode(imaging_mode) {} PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM) JL_NOTSAFEPOINT; static bool isRequired() { return true; } }; // Loop Passes struct JuliaLICMPass : PassInfoMixin { PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U) JL_NOTSAFEPOINT; }; struct LowerSIMDLoopPass : PassInfoMixin { PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U) JL_NOTSAFEPOINT; }; #define MODULE_MARKER_PASS(NAME) \ struct NAME##MarkerPass : PassInfoMixin { \ PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM) JL_NOTSAFEPOINT { return PreservedAnalyses::all(); } \ static bool isRequired() { return true; } \ }; #define FUNCTION_MARKER_PASS(NAME) \ struct NAME##MarkerPass : PassInfoMixin { \ PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) JL_NOTSAFEPOINT { return PreservedAnalyses::all(); } \ static bool isRequired() { return true; } \ }; #define LOOP_MARKER_PASS(NAME) \ struct NAME##MarkerPass : PassInfoMixin { \ PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, \ LoopStandardAnalysisResults &AR, LPMUpdater &U) JL_NOTSAFEPOINT { \ return PreservedAnalyses::all(); \ } \ static bool isRequired() { return true; } \ }; // These are useful for debugging with --print-before/after MODULE_MARKER_PASS(BeforeOptimization) MODULE_MARKER_PASS(BeforeEarlySimplification) MODULE_MARKER_PASS(AfterEarlySimplification) MODULE_MARKER_PASS(BeforeEarlyOptimization) MODULE_MARKER_PASS(AfterEarlyOptimization) FUNCTION_MARKER_PASS(BeforeLoopOptimization) LOOP_MARKER_PASS(BeforeLICM) LOOP_MARKER_PASS(AfterLICM) LOOP_MARKER_PASS(BeforeLoopSimplification) LOOP_MARKER_PASS(AfterLoopSimplification) FUNCTION_MARKER_PASS(AfterLoopOptimization) FUNCTION_MARKER_PASS(BeforeScalarOptimization) FUNCTION_MARKER_PASS(AfterScalarOptimization) FUNCTION_MARKER_PASS(BeforeVectorization) FUNCTION_MARKER_PASS(AfterVectorization) MODULE_MARKER_PASS(BeforeIntrinsicLowering) MODULE_MARKER_PASS(AfterIntrinsicLowering) MODULE_MARKER_PASS(BeforeCleanup) MODULE_MARKER_PASS(AfterCleanup) MODULE_MARKER_PASS(AfterOptimization) bool verifyLLVMIR(const Module &M) JL_NOTSAFEPOINT; bool verifyLLVMIR(const Function &F) JL_NOTSAFEPOINT; bool verifyLLVMIR(const Loop &L) JL_NOTSAFEPOINT; #endif