mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-16 11:30:51 +00:00
07d9471bc5
The intended behaviour is to force vectorization on the presence of the flag (either turn on or off), and to continue the behaviour as expected in its absence. Tests were added to make sure the all cases are covered in opt. No tests were added in other tools with the assumption that they should use the PassManagerBuilder in the same way. This patch also removes the outdated -late-vectorize flag, which was on by default and not helping much. The pragma metadata is being attached to the same place as other loop metadata, but nothing forbids one from attaching it to a function (to enable #pragma optimize) or basic blocks (to hint the basic-block vectorizers), etc. The logic should be the same all around. Patches to Clang to produce the metadata will be produced after the initial implementation is agreed upon and committed. Patches to other vectorizers (such as SLP and BB) will be added once we're happy with the pass manager changes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196537 91177308-0d34-0410-b5e6-96231b3b80d8
158 lines
5.9 KiB
C++
158 lines
5.9 KiB
C++
// llvm/Transforms/IPO/PassManagerBuilder.h - Build Standard Pass -*- C++ -*-=//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines the PassManagerBuilder class, which is used to set up a
|
|
// "standard" optimization sequence suitable for languages like C and C++.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TRANSFORMS_IPO_PASSMANAGERBUILDER_H
|
|
#define LLVM_TRANSFORMS_IPO_PASSMANAGERBUILDER_H
|
|
|
|
#include <vector>
|
|
|
|
namespace llvm {
|
|
class TargetLibraryInfo;
|
|
class Pass;
|
|
|
|
// The old pass manager infrastructure is hidden in a legacy namespace now.
|
|
namespace legacy {
|
|
class PassManagerBase;
|
|
class FunctionPassManager;
|
|
}
|
|
using legacy::PassManagerBase;
|
|
using legacy::FunctionPassManager;
|
|
|
|
/// PassManagerBuilder - This class is used to set up a standard optimization
|
|
/// sequence for languages like C and C++, allowing some APIs to customize the
|
|
/// pass sequence in various ways. A simple example of using it would be:
|
|
///
|
|
/// PassManagerBuilder Builder;
|
|
/// Builder.OptLevel = 2;
|
|
/// Builder.populateFunctionPassManager(FPM);
|
|
/// Builder.populateModulePassManager(MPM);
|
|
///
|
|
/// In addition to setting up the basic passes, PassManagerBuilder allows
|
|
/// frontends to vend a plugin API, where plugins are allowed to add extensions
|
|
/// to the default pass manager. They do this by specifying where in the pass
|
|
/// pipeline they want to be added, along with a callback function that adds
|
|
/// the pass(es). For example, a plugin that wanted to add a loop optimization
|
|
/// could do something like this:
|
|
///
|
|
/// static void addMyLoopPass(const PMBuilder &Builder, PassManagerBase &PM) {
|
|
/// if (Builder.getOptLevel() > 2 && Builder.getOptSizeLevel() == 0)
|
|
/// PM.add(createMyAwesomePass());
|
|
/// }
|
|
/// ...
|
|
/// Builder.addExtension(PassManagerBuilder::EP_LoopOptimizerEnd,
|
|
/// addMyLoopPass);
|
|
/// ...
|
|
class PassManagerBuilder {
|
|
public:
|
|
|
|
/// Extensions are passed the builder itself (so they can see how it is
|
|
/// configured) as well as the pass manager to add stuff to.
|
|
typedef void (*ExtensionFn)(const PassManagerBuilder &Builder,
|
|
PassManagerBase &PM);
|
|
enum ExtensionPointTy {
|
|
/// EP_EarlyAsPossible - This extension point allows adding passes before
|
|
/// any other transformations, allowing them to see the code as it is coming
|
|
/// out of the frontend.
|
|
EP_EarlyAsPossible,
|
|
|
|
/// EP_ModuleOptimizerEarly - This extension point allows adding passes
|
|
/// just before the main module-level optimization passes.
|
|
EP_ModuleOptimizerEarly,
|
|
|
|
/// EP_LoopOptimizerEnd - This extension point allows adding loop passes to
|
|
/// the end of the loop optimizer.
|
|
EP_LoopOptimizerEnd,
|
|
|
|
/// EP_ScalarOptimizerLate - This extension point allows adding optimization
|
|
/// passes after most of the main optimizations, but before the last
|
|
/// cleanup-ish optimizations.
|
|
EP_ScalarOptimizerLate,
|
|
|
|
/// EP_OptimizerLast -- This extension point allows adding passes that
|
|
/// run after everything else.
|
|
EP_OptimizerLast,
|
|
|
|
/// EP_EnabledOnOptLevel0 - This extension point allows adding passes that
|
|
/// should not be disabled by O0 optimization level. The passes will be
|
|
/// inserted after the inlining pass.
|
|
EP_EnabledOnOptLevel0
|
|
};
|
|
|
|
/// The Optimization Level - Specify the basic optimization level.
|
|
/// 0 = -O0, 1 = -O1, 2 = -O2, 3 = -O3
|
|
unsigned OptLevel;
|
|
|
|
/// SizeLevel - How much we're optimizing for size.
|
|
/// 0 = none, 1 = -Os, 2 = -Oz
|
|
unsigned SizeLevel;
|
|
|
|
/// LibraryInfo - Specifies information about the runtime library for the
|
|
/// optimizer. If this is non-null, it is added to both the function and
|
|
/// per-module pass pipeline.
|
|
TargetLibraryInfo *LibraryInfo;
|
|
|
|
/// Inliner - Specifies the inliner to use. If this is non-null, it is
|
|
/// added to the per-module passes.
|
|
Pass *Inliner;
|
|
|
|
bool DisableUnitAtATime;
|
|
bool DisableUnrollLoops;
|
|
bool BBVectorize;
|
|
bool SLPVectorize;
|
|
bool LoopVectorize;
|
|
bool RerollLoops;
|
|
|
|
private:
|
|
/// ExtensionList - This is list of all of the extensions that are registered.
|
|
std::vector<std::pair<ExtensionPointTy, ExtensionFn> > Extensions;
|
|
|
|
public:
|
|
PassManagerBuilder();
|
|
~PassManagerBuilder();
|
|
/// Adds an extension that will be used by all PassManagerBuilder instances.
|
|
/// This is intended to be used by plugins, to register a set of
|
|
/// optimisations to run automatically.
|
|
static void addGlobalExtension(ExtensionPointTy Ty, ExtensionFn Fn);
|
|
void addExtension(ExtensionPointTy Ty, ExtensionFn Fn);
|
|
|
|
private:
|
|
void addExtensionsToPM(ExtensionPointTy ETy, PassManagerBase &PM) const;
|
|
void addInitialAliasAnalysisPasses(PassManagerBase &PM) const;
|
|
public:
|
|
|
|
/// populateFunctionPassManager - This fills in the function pass manager,
|
|
/// which is expected to be run on each function immediately as it is
|
|
/// generated. The idea is to reduce the size of the IR in memory.
|
|
void populateFunctionPassManager(FunctionPassManager &FPM);
|
|
|
|
/// populateModulePassManager - This sets up the primary pass manager.
|
|
void populateModulePassManager(PassManagerBase &MPM);
|
|
void populateLTOPassManager(PassManagerBase &PM, bool Internalize,
|
|
bool RunInliner, bool DisableGVNLoadPRE = false);
|
|
};
|
|
|
|
/// Registers a function for adding a standard set of passes. This should be
|
|
/// used by optimizer plugins to allow all front ends to transparently use
|
|
/// them. Create a static instance of this class in your plugin, providing a
|
|
/// private function that the PassManagerBuilder can use to add your passes.
|
|
struct RegisterStandardPasses {
|
|
RegisterStandardPasses(PassManagerBuilder::ExtensionPointTy Ty,
|
|
PassManagerBuilder::ExtensionFn Fn) {
|
|
PassManagerBuilder::addGlobalExtension(Ty, Fn);
|
|
}
|
|
};
|
|
|
|
} // end namespace llvm
|
|
#endif
|