From d4b40fab55f215cc98da892b187128ed097ab67f Mon Sep 17 00:00:00 2001 From: Davide Italiano Date: Tue, 14 Jun 2016 00:49:23 +0000 Subject: [PATCH] [PM] Port MergedLoadStoreMotion to the new pass manager. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272606 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/InitializePasses.h | 2 +- .../Transforms/Scalar/MergedLoadStoreMotion.h | 38 ++++++ lib/LTO/LTOCodeGenerator.cpp | 2 +- lib/Passes/PassBuilder.cpp | 3 +- lib/Passes/PassRegistry.def | 1 + .../Scalar/MergedLoadStoreMotion.cpp | 109 ++++++++++-------- lib/Transforms/Scalar/Scalar.cpp | 2 +- test/Transforms/InstMerge/exceptions.ll | 2 + 8 files changed, 107 insertions(+), 52 deletions(-) create mode 100644 include/llvm/Transforms/Scalar/MergedLoadStoreMotion.h diff --git a/include/llvm/InitializePasses.h b/include/llvm/InitializePasses.h index 15a464a9c05..34368781452 100644 --- a/include/llvm/InitializePasses.h +++ b/include/llvm/InitializePasses.h @@ -226,7 +226,7 @@ void initializeMemoryDependenceWrapperPassPass(PassRegistry&); void initializeMemorySSAWrapperPassPass(PassRegistry&); void initializeMemorySanitizerPass(PassRegistry&); void initializeMergeFunctionsPass(PassRegistry&); -void initializeMergedLoadStoreMotionPass(PassRegistry &); +void initializeMergedLoadStoreMotionLegacyPassPass(PassRegistry &); void initializeMetaRenamerPass(PassRegistry&); void initializeModuleDebugInfoPrinterPass(PassRegistry&); void initializeModuleSummaryIndexWrapperPassPass(PassRegistry &); diff --git a/include/llvm/Transforms/Scalar/MergedLoadStoreMotion.h b/include/llvm/Transforms/Scalar/MergedLoadStoreMotion.h new file mode 100644 index 00000000000..a316a541ce3 --- /dev/null +++ b/include/llvm/Transforms/Scalar/MergedLoadStoreMotion.h @@ -0,0 +1,38 @@ +//===- MergedLoadStoreMotion.cpp - merge and hoist/sink load/stores -------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +//! \file +//! \brief This pass performs merges of loads and stores on both sides of a +// diamond (hammock). It hoists the loads and sinks the stores. +// +// The algorithm iteratively hoists two loads to the same address out of a +// diamond (hammock) and merges them into a single load in the header. Similar +// it sinks and merges two stores to the tail block (footer). The algorithm +// iterates over the instructions of one side of the diamond and attempts to +// find a matching load/store on the other side. It hoists / sinks when it +// thinks it safe to do so. This optimization helps with eg. hiding load +// latencies, triggering if-conversion, and reducing static code size. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_TRANSFORMS_SCALAR_MERGEDLOADSTOREMOTION_H +#define LLVM_TRANSFORMS_SCALAR_MERGEDLOADSTOREMOTION_H + +#include "llvm/IR/Module.h" +#include "llvm/IR/PassManager.h" + +namespace llvm { +class MergedLoadStoreMotionPass + : public PassInfoMixin { +public: + PreservedAnalyses run(Function &F, AnalysisManager &AM); +}; +} + +#endif // LLVM_TRANSFORMS_SCALAR_MERGEDLOADSTOREMOTION_H diff --git a/lib/LTO/LTOCodeGenerator.cpp b/lib/LTO/LTOCodeGenerator.cpp index 4f556f9da03..d9e31d5cfe9 100644 --- a/lib/LTO/LTOCodeGenerator.cpp +++ b/lib/LTO/LTOCodeGenerator.cpp @@ -125,7 +125,7 @@ void LTOCodeGenerator::initializeLTOPasses() { initializeReversePostOrderFunctionAttrsLegacyPassPass(R); initializeGlobalsAAWrapperPassPass(R); initializeLICMPass(R); - initializeMergedLoadStoreMotionPass(R); + initializeMergedLoadStoreMotionLegacyPassPass(R); initializeGVNLegacyPassPass(R); initializeMemCpyOptPass(R); initializeDCELegacyPassPass(R); diff --git a/lib/Passes/PassBuilder.cpp b/lib/Passes/PassBuilder.cpp index 815d34ccbe1..292581091f2 100644 --- a/lib/Passes/PassBuilder.cpp +++ b/lib/Passes/PassBuilder.cpp @@ -72,13 +72,14 @@ #include "llvm/Transforms/Scalar/DCE.h" #include "llvm/Transforms/Scalar/DeadStoreElimination.h" #include "llvm/Transforms/Scalar/EarlyCSE.h" -#include "llvm/Transforms/Scalar/GuardWidening.h" #include "llvm/Transforms/Scalar/GVN.h" +#include "llvm/Transforms/Scalar/GuardWidening.h" #include "llvm/Transforms/Scalar/IndVarSimplify.h" #include "llvm/Transforms/Scalar/LoopRotation.h" #include "llvm/Transforms/Scalar/LoopSimplifyCFG.h" #include "llvm/Transforms/Scalar/LowerAtomic.h" #include "llvm/Transforms/Scalar/LowerExpectIntrinsic.h" +#include "llvm/Transforms/Scalar/MergedLoadStoreMotion.h" #include "llvm/Transforms/Scalar/PartiallyInlineLibCalls.h" #include "llvm/Transforms/Scalar/Reassociate.h" #include "llvm/Transforms/Scalar/SCCP.h" diff --git a/lib/Passes/PassRegistry.def b/lib/Passes/PassRegistry.def index 44ef05e4d56..bd53b4a77d4 100644 --- a/lib/Passes/PassRegistry.def +++ b/lib/Passes/PassRegistry.def @@ -129,6 +129,7 @@ FUNCTION_PASS("loweratomic", LowerAtomicPass()) FUNCTION_PASS("lower-expect", LowerExpectIntrinsicPass()) FUNCTION_PASS("guard-widening", GuardWideningPass()) FUNCTION_PASS("gvn", GVN()) +FUNCTION_PASS("mldst-motion", MergedLoadStoreMotionPass()) FUNCTION_PASS("partially-inline-libcalls", PartiallyInlineLibCallsPass()) FUNCTION_PASS("lcssa", LCSSAPass()) FUNCTION_PASS("print", PrintFunctionPass(dbgs())) diff --git a/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp b/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp index b7d0d444d29..251650c5539 100644 --- a/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp +++ b/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp @@ -72,6 +72,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/Transforms/Scalar/MergedLoadStoreMotion.h" #include "llvm/ADT/Statistic.h" #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/CFG.h" @@ -96,52 +97,12 @@ using namespace llvm; // MergedLoadStoreMotion Pass //===----------------------------------------------------------------------===// -namespace { -class MergedLoadStoreMotion : public FunctionPass { - AliasAnalysis *AA; - MemoryDependenceResults *MD; - -public: - static char ID; // Pass identification, replacement for typeid - MergedLoadStoreMotion() : FunctionPass(ID), MD(nullptr) { - initializeMergedLoadStoreMotionPass(*PassRegistry::getPassRegistry()); - } - - bool runOnFunction(Function &F) override; - -private: - // This transformation requires dominator postdominator info - void getAnalysisUsage(AnalysisUsage &AU) const override { - AU.setPreservesCFG(); - AU.addRequired(); - AU.addPreserved(); - AU.addPreserved(); - } -}; - -char MergedLoadStoreMotion::ID = 0; -} // anonymous namespace - // The mergeLoad/Store algorithms could have Size0 * Size1 complexity, // where Size0 and Size1 are the #instructions on the two sides of // the diamond. The constant chosen here is arbitrary. Compiler Time // Control is enforced by the check Size0 * Size1 < MagicCompileTimeControl. const int MagicCompileTimeControl = 250; -/// -/// \brief createMergedLoadStoreMotionPass - The public interface to this file. -/// -FunctionPass *llvm::createMergedLoadStoreMotionPass() { - return new MergedLoadStoreMotion(); -} - -INITIALIZE_PASS_BEGIN(MergedLoadStoreMotion, "mldst-motion", - "MergedLoadStoreMotion", false, false) -INITIALIZE_PASS_DEPENDENCY(MemoryDependenceWrapperPass) -INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass) -INITIALIZE_PASS_END(MergedLoadStoreMotion, "mldst-motion", - "MergedLoadStoreMotion", false, false) - /// /// \brief Remove instruction from parent and update memory dependence analysis. /// @@ -533,14 +494,8 @@ static bool mergeStores(BasicBlock *T, AliasAnalysis *AA, /// /// \brief Run the transformation for each function /// -bool MergedLoadStoreMotion::runOnFunction(Function &F) { - if (skipFunction(F)) - return false; - - auto *MDWP = getAnalysisIfAvailable(); - MD = MDWP ? &MDWP->getMemDep() : nullptr; - AA = &getAnalysis().getAAResults(); - +static bool runMergedLoadStoreMotion(Function &F, AliasAnalysis *AA, + MemoryDependenceResults *MD) { bool Changed = false; DEBUG(dbgs() << "Instruction Merger\n"); @@ -558,3 +513,61 @@ bool MergedLoadStoreMotion::runOnFunction(Function &F) { } return Changed; } + +PreservedAnalyses +MergedLoadStoreMotionPass::run(Function &F, AnalysisManager &AM) { + auto &AA = AM.getResult(F); + auto *MD = AM.getCachedResult(F); + if (!runMergedLoadStoreMotion(F, &AA, MD)) + return PreservedAnalyses::all(); + return PreservedAnalyses::none(); +} + +namespace { +class MergedLoadStoreMotionLegacyPass : public FunctionPass { + AliasAnalysis *AA; + MemoryDependenceResults *MD; + +public: + static char ID; // Pass identification, replacement for typeid + MergedLoadStoreMotionLegacyPass() : FunctionPass(ID), MD(nullptr) { + initializeMergedLoadStoreMotionLegacyPassPass( + *PassRegistry::getPassRegistry()); + } + + bool runOnFunction(Function &F) override { + if (skipFunction(F)) + return false; + + AA = &getAnalysis().getAAResults(); + auto *MDWP = getAnalysisIfAvailable(); + MD = MDWP ? &MDWP->getMemDep() : nullptr; + return runMergedLoadStoreMotion(F, AA, MD); + } + +private: + // This transformation requires dominator postdominator info + void getAnalysisUsage(AnalysisUsage &AU) const override { + AU.setPreservesCFG(); + AU.addRequired(); + AU.addPreserved(); + AU.addPreserved(); + } +}; + +char MergedLoadStoreMotionLegacyPass::ID = 0; +} // anonymous namespace + +/// +/// \brief createMergedLoadStoreMotionPass - The public interface to this file. +/// +FunctionPass *llvm::createMergedLoadStoreMotionPass() { + return new MergedLoadStoreMotionLegacyPass(); +} + +INITIALIZE_PASS_BEGIN(MergedLoadStoreMotionLegacyPass, "mldst-motion", + "MergedLoadStoreMotion", false, false) +INITIALIZE_PASS_DEPENDENCY(MemoryDependenceWrapperPass) +INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass) +INITIALIZE_PASS_END(MergedLoadStoreMotionLegacyPass, "mldst-motion", + "MergedLoadStoreMotion", false, false) diff --git a/lib/Transforms/Scalar/Scalar.cpp b/lib/Transforms/Scalar/Scalar.cpp index 2be220be9e2..2bda6f51148 100644 --- a/lib/Transforms/Scalar/Scalar.cpp +++ b/lib/Transforms/Scalar/Scalar.cpp @@ -65,7 +65,7 @@ void llvm::initializeScalarOpts(PassRegistry &Registry) { initializeLowerExpectIntrinsicPass(Registry); initializeLowerGuardIntrinsicPass(Registry); initializeMemCpyOptPass(Registry); - initializeMergedLoadStoreMotionPass(Registry); + initializeMergedLoadStoreMotionLegacyPassPass(Registry); initializeNaryReassociatePass(Registry); initializePartiallyInlineLibCallsLegacyPassPass(Registry); initializeReassociateLegacyPassPass(Registry); diff --git a/test/Transforms/InstMerge/exceptions.ll b/test/Transforms/InstMerge/exceptions.ll index 06b79664d7d..f1cda008b1d 100644 --- a/test/Transforms/InstMerge/exceptions.ll +++ b/test/Transforms/InstMerge/exceptions.ll @@ -1,4 +1,6 @@ ; RUN: opt -basicaa -memdep -mldst-motion -S < %s | FileCheck %s +; RUN: opt -aa-pipeline=basicaa -passes='require',mldst-motion \ +; RUN: -S < %s | FileCheck %s target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" -- 2.50.1