initial
This commit is contained in:
199
thirdparty/clang/include/llvm/Transforms/IPO.h
vendored
Normal file
199
thirdparty/clang/include/llvm/Transforms/IPO.h
vendored
Normal file
@@ -0,0 +1,199 @@
|
||||
//===- llvm/Transforms/IPO.h - Interprocedural Transformations --*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This header file defines prototypes for accessor functions that expose passes
|
||||
// in the IPO transformations library.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_IPO_H
|
||||
#define LLVM_TRANSFORMS_IPO_H
|
||||
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class ModulePass;
|
||||
class Pass;
|
||||
class Function;
|
||||
class BasicBlock;
|
||||
class GlobalValue;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// These functions removes symbols from functions and modules. If OnlyDebugInfo
|
||||
// is true, only debugging information is removed from the module.
|
||||
//
|
||||
ModulePass *createStripSymbolsPass(bool OnlyDebugInfo = false);
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// These functions strips symbols from functions and modules.
|
||||
// Only debugging information is not stripped.
|
||||
//
|
||||
ModulePass *createStripNonDebugSymbolsPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// These pass removes llvm.dbg.declare intrinsics.
|
||||
ModulePass *createStripDebugDeclarePass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// These pass removes unused symbols' debug info.
|
||||
ModulePass *createStripDeadDebugInfoPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// createConstantMergePass - This function returns a new pass that merges
|
||||
/// duplicate global constants together into a single constant that is shared.
|
||||
/// This is useful because some passes (ie TraceValues) insert a lot of string
|
||||
/// constants into the program, regardless of whether or not they duplicate an
|
||||
/// existing string.
|
||||
///
|
||||
ModulePass *createConstantMergePass();
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// createGlobalOptimizerPass - This function returns a new pass that optimizes
|
||||
/// non-address taken internal globals.
|
||||
///
|
||||
ModulePass *createGlobalOptimizerPass();
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// createGlobalDCEPass - This transform is designed to eliminate unreachable
|
||||
/// internal globals (functions or global variables)
|
||||
///
|
||||
ModulePass *createGlobalDCEPass();
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// createGVExtractionPass - If deleteFn is true, this pass deletes
|
||||
/// the specified global values. Otherwise, it deletes as much of the module as
|
||||
/// possible, except for the global values specified.
|
||||
///
|
||||
ModulePass *createGVExtractionPass(std::vector<GlobalValue*>& GVs, bool
|
||||
deleteFn = false);
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// createFunctionInliningPass - Return a new pass object that uses a heuristic
|
||||
/// to inline direct function calls to small functions.
|
||||
///
|
||||
/// The -inline-threshold command line option takes precedence over the
|
||||
/// threshold given here.
|
||||
Pass *createFunctionInliningPass();
|
||||
Pass *createFunctionInliningPass(int Threshold);
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// createAlwaysInlinerPass - Return a new pass object that inlines only
|
||||
/// functions that are marked as "always_inline".
|
||||
Pass *createAlwaysInlinerPass();
|
||||
Pass *createAlwaysInlinerPass(bool InsertLifetime);
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// createPruneEHPass - Return a new pass object which transforms invoke
|
||||
/// instructions into calls, if the callee can _not_ unwind the stack.
|
||||
///
|
||||
Pass *createPruneEHPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// createInternalizePass - This pass loops over all of the functions in the
|
||||
/// input module, internalizing all globals (functions and variables) not in the
|
||||
/// given exportList.
|
||||
///
|
||||
/// Note that commandline options that are used with the above function are not
|
||||
/// used now!
|
||||
ModulePass *createInternalizePass(ArrayRef<const char *> exportList);
|
||||
/// createInternalizePass - Same as above, but with an empty exportList.
|
||||
ModulePass *createInternalizePass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// createDeadArgEliminationPass - This pass removes arguments from functions
|
||||
/// which are not used by the body of the function.
|
||||
///
|
||||
ModulePass *createDeadArgEliminationPass();
|
||||
|
||||
/// DeadArgHacking pass - Same as DAE, but delete arguments of external
|
||||
/// functions as well. This is definitely not safe, and should only be used by
|
||||
/// bugpoint.
|
||||
ModulePass *createDeadArgHackingPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// createArgumentPromotionPass - This pass promotes "by reference" arguments to
|
||||
/// be passed by value if the number of elements passed is smaller or
|
||||
/// equal to maxElements (maxElements == 0 means always promote).
|
||||
///
|
||||
Pass *createArgumentPromotionPass(unsigned maxElements = 3);
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// createIPConstantPropagationPass - This pass propagates constants from call
|
||||
/// sites into the bodies of functions.
|
||||
///
|
||||
ModulePass *createIPConstantPropagationPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// createIPSCCPPass - This pass propagates constants from call sites into the
|
||||
/// bodies of functions, and keeps track of whether basic blocks are executable
|
||||
/// in the process.
|
||||
///
|
||||
ModulePass *createIPSCCPPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
/// createLoopExtractorPass - This pass extracts all natural loops from the
|
||||
/// program into a function if it can.
|
||||
///
|
||||
Pass *createLoopExtractorPass();
|
||||
|
||||
/// createSingleLoopExtractorPass - This pass extracts one natural loop from the
|
||||
/// program into a function if it can. This is used by bugpoint.
|
||||
///
|
||||
Pass *createSingleLoopExtractorPass();
|
||||
|
||||
/// createBlockExtractorPass - This pass extracts all blocks (except those
|
||||
/// specified in the argument list) from the functions in the module.
|
||||
///
|
||||
ModulePass *createBlockExtractorPass();
|
||||
|
||||
/// createStripDeadPrototypesPass - This pass removes any function declarations
|
||||
/// (prototypes) that are not used.
|
||||
ModulePass *createStripDeadPrototypesPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// createFunctionAttrsPass - This pass discovers functions that do not access
|
||||
/// memory, or only read memory, and gives them the readnone/readonly attribute.
|
||||
/// It also discovers function arguments that are not captured by the function
|
||||
/// and marks them with the nocapture attribute.
|
||||
///
|
||||
Pass *createFunctionAttrsPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// createMergeFunctionsPass - This pass discovers identical functions and
|
||||
/// collapses them.
|
||||
///
|
||||
ModulePass *createMergeFunctionsPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// createPartialInliningPass - This pass inlines parts of functions.
|
||||
///
|
||||
ModulePass *createPartialInliningPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// createMetaRenamerPass - Rename everything with metasyntatic names.
|
||||
//
|
||||
ModulePass *createMetaRenamerPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// createBarrierNoopPass - This pass is purely a module pass barrier in a pass
|
||||
/// manager.
|
||||
ModulePass *createBarrierNoopPass();
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
91
thirdparty/clang/include/llvm/Transforms/IPO/InlinerPass.h
vendored
Normal file
91
thirdparty/clang/include/llvm/Transforms/IPO/InlinerPass.h
vendored
Normal file
@@ -0,0 +1,91 @@
|
||||
//===- InlinerPass.h - Code common to all inliners --------------*- 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 a simple policy-based bottom-up inliner. This file
|
||||
// implements all of the boring mechanics of the bottom-up inlining, while the
|
||||
// subclass determines WHAT to inline, which is the much more interesting
|
||||
// component.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_IPO_INLINERPASS_H
|
||||
#define LLVM_TRANSFORMS_IPO_INLINERPASS_H
|
||||
|
||||
#include "llvm/Analysis/CallGraphSCCPass.h"
|
||||
|
||||
namespace llvm {
|
||||
class CallSite;
|
||||
class DataLayout;
|
||||
class InlineCost;
|
||||
template<class PtrType, unsigned SmallSize>
|
||||
class SmallPtrSet;
|
||||
|
||||
/// Inliner - This class contains all of the helper code which is used to
|
||||
/// perform the inlining operations that do not depend on the policy.
|
||||
///
|
||||
struct Inliner : public CallGraphSCCPass {
|
||||
explicit Inliner(char &ID);
|
||||
explicit Inliner(char &ID, int Threshold, bool InsertLifetime);
|
||||
|
||||
/// getAnalysisUsage - For this class, we declare that we require and preserve
|
||||
/// the call graph. If the derived class implements this method, it should
|
||||
/// always explicitly call the implementation here.
|
||||
virtual void getAnalysisUsage(AnalysisUsage &Info) const;
|
||||
|
||||
// Main run interface method, this implements the interface required by the
|
||||
// Pass class.
|
||||
virtual bool runOnSCC(CallGraphSCC &SCC);
|
||||
|
||||
using llvm::Pass::doFinalization;
|
||||
// doFinalization - Remove now-dead linkonce functions at the end of
|
||||
// processing to avoid breaking the SCC traversal.
|
||||
virtual bool doFinalization(CallGraph &CG);
|
||||
|
||||
/// This method returns the value specified by the -inline-threshold value,
|
||||
/// specified on the command line. This is typically not directly needed.
|
||||
///
|
||||
unsigned getInlineThreshold() const { return InlineThreshold; }
|
||||
|
||||
/// Calculate the inline threshold for given Caller. This threshold is lower
|
||||
/// if the caller is marked with OptimizeForSize and -inline-threshold is not
|
||||
/// given on the comand line. It is higher if the callee is marked with the
|
||||
/// inlinehint attribute.
|
||||
///
|
||||
unsigned getInlineThreshold(CallSite CS) const;
|
||||
|
||||
/// getInlineCost - This method must be implemented by the subclass to
|
||||
/// determine the cost of inlining the specified call site. If the cost
|
||||
/// returned is greater than the current inline threshold, the call site is
|
||||
/// not inlined.
|
||||
///
|
||||
virtual InlineCost getInlineCost(CallSite CS) = 0;
|
||||
|
||||
/// removeDeadFunctions - Remove dead functions.
|
||||
///
|
||||
/// This also includes a hack in the form of the 'AlwaysInlineOnly' flag
|
||||
/// which restricts it to deleting functions with an 'AlwaysInline'
|
||||
/// attribute. This is useful for the InlineAlways pass that only wants to
|
||||
/// deal with that subset of the functions.
|
||||
bool removeDeadFunctions(CallGraph &CG, bool AlwaysInlineOnly = false);
|
||||
|
||||
private:
|
||||
// InlineThreshold - Cache the value here for easy access.
|
||||
unsigned InlineThreshold;
|
||||
|
||||
// InsertLifetime - Insert @llvm.lifetime intrinsics.
|
||||
bool InsertLifetime;
|
||||
|
||||
/// shouldInline - Return true if the inliner should attempt to
|
||||
/// inline at the given CallSite.
|
||||
bool shouldInline(CallSite CS);
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
151
thirdparty/clang/include/llvm/Transforms/IPO/PassManagerBuilder.h
vendored
Normal file
151
thirdparty/clang/include/llvm/Transforms/IPO/PassManagerBuilder.h
vendored
Normal file
@@ -0,0 +1,151 @@
|
||||
// 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 PassManagerBase;
|
||||
class Pass;
|
||||
class 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 DisableSimplifyLibCalls;
|
||||
bool DisableUnitAtATime;
|
||||
bool DisableUnrollLoops;
|
||||
bool BBVectorize;
|
||||
bool SLPVectorize;
|
||||
bool LoopVectorize;
|
||||
|
||||
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
|
||||
83
thirdparty/clang/include/llvm/Transforms/Instrumentation.h
vendored
Normal file
83
thirdparty/clang/include/llvm/Transforms/Instrumentation.h
vendored
Normal file
@@ -0,0 +1,83 @@
|
||||
//===- Transforms/Instrumentation.h - Instrumentation passes ----*- 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 constructor functions for instrumentation passes.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_INSTRUMENTATION_H
|
||||
#define LLVM_TRANSFORMS_INSTRUMENTATION_H
|
||||
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class ModulePass;
|
||||
class FunctionPass;
|
||||
|
||||
// Insert edge profiling instrumentation
|
||||
ModulePass *createEdgeProfilerPass();
|
||||
|
||||
// Insert optimal edge profiling instrumentation
|
||||
ModulePass *createOptimalEdgeProfilerPass();
|
||||
|
||||
// Insert path profiling instrumentation
|
||||
ModulePass *createPathProfilerPass();
|
||||
|
||||
// Insert GCOV profiling instrumentation
|
||||
struct GCOVOptions {
|
||||
static GCOVOptions getDefault();
|
||||
|
||||
// Specify whether to emit .gcno files.
|
||||
bool EmitNotes;
|
||||
|
||||
// Specify whether to modify the program to emit .gcda files when run.
|
||||
bool EmitData;
|
||||
|
||||
// A four-byte version string. The meaning of a version string is described in
|
||||
// gcc's gcov-io.h
|
||||
char Version[4];
|
||||
|
||||
// Emit a "cfg checksum" that follows the "line number checksum" of a
|
||||
// function. This affects both .gcno and .gcda files.
|
||||
bool UseCfgChecksum;
|
||||
|
||||
// Add the 'noredzone' attribute to added runtime library calls.
|
||||
bool NoRedZone;
|
||||
|
||||
// Emit the name of the function in the .gcda files. This is redundant, as
|
||||
// the function identifier can be used to find the name from the .gcno file.
|
||||
bool FunctionNamesInData;
|
||||
};
|
||||
ModulePass *createGCOVProfilerPass(const GCOVOptions &Options =
|
||||
GCOVOptions::getDefault());
|
||||
|
||||
// Insert AddressSanitizer (address sanity checking) instrumentation
|
||||
FunctionPass *createAddressSanitizerFunctionPass(
|
||||
bool CheckInitOrder = true, bool CheckUseAfterReturn = false,
|
||||
bool CheckLifetime = false, StringRef BlacklistFile = StringRef(),
|
||||
bool ZeroBaseShadow = false);
|
||||
ModulePass *createAddressSanitizerModulePass(
|
||||
bool CheckInitOrder = true, StringRef BlacklistFile = StringRef(),
|
||||
bool ZeroBaseShadow = false);
|
||||
|
||||
// Insert MemorySanitizer instrumentation (detection of uninitialized reads)
|
||||
FunctionPass *createMemorySanitizerPass(bool TrackOrigins = false,
|
||||
StringRef BlacklistFile = StringRef());
|
||||
|
||||
// Insert ThreadSanitizer (race detection) instrumentation
|
||||
FunctionPass *createThreadSanitizerPass(StringRef BlacklistFile = StringRef());
|
||||
|
||||
// BoundsChecking - This pass instruments the code to perform run-time bounds
|
||||
// checking on loads, stores, and other memory intrinsics.
|
||||
FunctionPass *createBoundsCheckingPass();
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
49
thirdparty/clang/include/llvm/Transforms/ObjCARC.h
vendored
Normal file
49
thirdparty/clang/include/llvm/Transforms/ObjCARC.h
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
//===-- ObjCARC.h - ObjCARC Scalar Transformations --------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This header file defines prototypes for accessor functions that expose passes
|
||||
// in the ObjCARC Scalar Transformations library.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_OBJCARC_H
|
||||
#define LLVM_TRANSFORMS_OBJCARC_H
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class Pass;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// ObjCARCAPElim - ObjC ARC autorelease pool elimination.
|
||||
//
|
||||
Pass *createObjCARCAPElimPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// ObjCARCExpand - ObjC ARC preliminary simplifications.
|
||||
//
|
||||
Pass *createObjCARCExpandPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// ObjCARCContract - Late ObjC ARC cleanups.
|
||||
//
|
||||
Pass *createObjCARCContractPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// ObjCARCOpt - ObjC ARC optimization.
|
||||
//
|
||||
Pass *createObjCARCOptPass();
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
|
||||
352
thirdparty/clang/include/llvm/Transforms/Scalar.h
vendored
Normal file
352
thirdparty/clang/include/llvm/Transforms/Scalar.h
vendored
Normal file
@@ -0,0 +1,352 @@
|
||||
//===-- Scalar.h - Scalar Transformations -----------------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This header file defines prototypes for accessor functions that expose passes
|
||||
// in the Scalar transformations library.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_SCALAR_H
|
||||
#define LLVM_TRANSFORMS_SCALAR_H
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class FunctionPass;
|
||||
class Pass;
|
||||
class GetElementPtrInst;
|
||||
class PassInfo;
|
||||
class TerminatorInst;
|
||||
class TargetLowering;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// ConstantPropagation - A worklist driven constant propagation pass
|
||||
//
|
||||
FunctionPass *createConstantPropagationPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// SCCP - Sparse conditional constant propagation.
|
||||
//
|
||||
FunctionPass *createSCCPPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// DeadInstElimination - This pass quickly removes trivially dead instructions
|
||||
// without modifying the CFG of the function. It is a BasicBlockPass, so it
|
||||
// runs efficiently when queued next to other BasicBlockPass's.
|
||||
//
|
||||
Pass *createDeadInstEliminationPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// DeadCodeElimination - This pass is more powerful than DeadInstElimination,
|
||||
// because it is worklist driven that can potentially revisit instructions when
|
||||
// their other instructions become dead, to eliminate chains of dead
|
||||
// computations.
|
||||
//
|
||||
FunctionPass *createDeadCodeEliminationPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// DeadStoreElimination - This pass deletes stores that are post-dominated by
|
||||
// must-aliased stores and are not loaded used between the stores.
|
||||
//
|
||||
FunctionPass *createDeadStoreEliminationPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// AggressiveDCE - This pass uses the SSA based Aggressive DCE algorithm. This
|
||||
// algorithm assumes instructions are dead until proven otherwise, which makes
|
||||
// it more successful are removing non-obviously dead instructions.
|
||||
//
|
||||
FunctionPass *createAggressiveDCEPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// SROA - Replace aggregates or pieces of aggregates with scalar SSA values.
|
||||
//
|
||||
FunctionPass *createSROAPass(bool RequiresDomTree = true);
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// ScalarReplAggregates - Break up alloca's of aggregates into multiple allocas
|
||||
// if possible.
|
||||
//
|
||||
FunctionPass *createScalarReplAggregatesPass(signed Threshold = -1,
|
||||
bool UseDomTree = true,
|
||||
signed StructMemberThreshold = -1,
|
||||
signed ArrayElementThreshold = -1,
|
||||
signed ScalarLoadThreshold = -1);
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// InductionVariableSimplify - Transform induction variables in a program to all
|
||||
// use a single canonical induction variable per loop.
|
||||
//
|
||||
Pass *createIndVarSimplifyPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// InstructionCombining - Combine instructions to form fewer, simple
|
||||
// instructions. This pass does not modify the CFG, and has a tendency to make
|
||||
// instructions dead, so a subsequent DCE pass is useful.
|
||||
//
|
||||
// This pass combines things like:
|
||||
// %Y = add int 1, %X
|
||||
// %Z = add int 1, %Y
|
||||
// into:
|
||||
// %Z = add int 2, %X
|
||||
//
|
||||
FunctionPass *createInstructionCombiningPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// LICM - This pass is a loop invariant code motion and memory promotion pass.
|
||||
//
|
||||
Pass *createLICMPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// LoopStrengthReduce - This pass is strength reduces GEP instructions that use
|
||||
// a loop's canonical induction variable as one of their indices.
|
||||
//
|
||||
Pass *createLoopStrengthReducePass();
|
||||
|
||||
Pass *createGlobalMergePass(const TargetLowering *TLI = 0);
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// LoopUnswitch - This pass is a simple loop unswitching pass.
|
||||
//
|
||||
Pass *createLoopUnswitchPass(bool OptimizeForSize = false);
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// LoopInstSimplify - This pass simplifies instructions in a loop's body.
|
||||
//
|
||||
Pass *createLoopInstSimplifyPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// LoopUnroll - This pass is a simple loop unrolling pass.
|
||||
//
|
||||
Pass *createLoopUnrollPass(int Threshold = -1, int Count = -1, int AllowPartial = -1);
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// LoopRotate - This pass is a simple loop rotating pass.
|
||||
//
|
||||
Pass *createLoopRotatePass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// LoopIdiom - This pass recognizes and replaces idioms in loops.
|
||||
//
|
||||
Pass *createLoopIdiomPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// PromoteMemoryToRegister - This pass is used to promote memory references to
|
||||
// be register references. A simple example of the transformation performed by
|
||||
// this pass is:
|
||||
//
|
||||
// FROM CODE TO CODE
|
||||
// %X = alloca i32, i32 1 ret i32 42
|
||||
// store i32 42, i32 *%X
|
||||
// %Y = load i32* %X
|
||||
// ret i32 %Y
|
||||
//
|
||||
FunctionPass *createPromoteMemoryToRegisterPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// DemoteRegisterToMemoryPass - This pass is used to demote registers to memory
|
||||
// references. In basically undoes the PromoteMemoryToRegister pass to make cfg
|
||||
// hacking easier.
|
||||
//
|
||||
FunctionPass *createDemoteRegisterToMemoryPass();
|
||||
extern char &DemoteRegisterToMemoryID;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Reassociate - This pass reassociates commutative expressions in an order that
|
||||
// is designed to promote better constant propagation, GCSE, LICM, PRE...
|
||||
//
|
||||
// For example: 4 + (x + 5) -> x + (4 + 5)
|
||||
//
|
||||
FunctionPass *createReassociatePass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// JumpThreading - Thread control through mult-pred/multi-succ blocks where some
|
||||
// preds always go to some succ.
|
||||
//
|
||||
FunctionPass *createJumpThreadingPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// CFGSimplification - Merge basic blocks, eliminate unreachable blocks,
|
||||
// simplify terminator instructions, etc...
|
||||
//
|
||||
FunctionPass *createCFGSimplificationPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// BreakCriticalEdges - Break all of the critical edges in the CFG by inserting
|
||||
// a dummy basic block. This pass may be "required" by passes that cannot deal
|
||||
// with critical edges. For this usage, a pass must call:
|
||||
//
|
||||
// AU.addRequiredID(BreakCriticalEdgesID);
|
||||
//
|
||||
// This pass obviously invalidates the CFG, but can update forward dominator
|
||||
// (set, immediate dominators, tree, and frontier) information.
|
||||
//
|
||||
FunctionPass *createBreakCriticalEdgesPass();
|
||||
extern char &BreakCriticalEdgesID;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// LoopSimplify - Insert Pre-header blocks into the CFG for every function in
|
||||
// the module. This pass updates dominator information, loop information, and
|
||||
// does not add critical edges to the CFG.
|
||||
//
|
||||
// AU.addRequiredID(LoopSimplifyID);
|
||||
//
|
||||
Pass *createLoopSimplifyPass();
|
||||
extern char &LoopSimplifyID;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// TailCallElimination - This pass eliminates call instructions to the current
|
||||
// function which occur immediately before return instructions.
|
||||
//
|
||||
FunctionPass *createTailCallEliminationPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// LowerSwitch - This pass converts SwitchInst instructions into a sequence of
|
||||
// chained binary branch instructions.
|
||||
//
|
||||
FunctionPass *createLowerSwitchPass();
|
||||
extern char &LowerSwitchID;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// LowerInvoke - This pass converts invoke and unwind instructions to use sjlj
|
||||
// exception handling mechanisms. Note that after this pass runs the CFG is not
|
||||
// entirely accurate (exceptional control flow edges are not correct anymore) so
|
||||
// only very simple things should be done after the lowerinvoke pass has run
|
||||
// (like generation of native code). This should *NOT* be used as a general
|
||||
// purpose "my LLVM-to-LLVM pass doesn't support the invoke instruction yet"
|
||||
// lowering pass.
|
||||
//
|
||||
FunctionPass *createLowerInvokePass(const TargetLowering *TLI = 0);
|
||||
FunctionPass *createLowerInvokePass(const TargetLowering *TLI,
|
||||
bool useExpensiveEHSupport);
|
||||
extern char &LowerInvokePassID;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// BlockPlacement - This pass reorders basic blocks in order to increase the
|
||||
// number of fall-through conditional branches.
|
||||
//
|
||||
FunctionPass *createBlockPlacementPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// LCSSA - This pass inserts phi nodes at loop boundaries to simplify other loop
|
||||
// optimizations.
|
||||
//
|
||||
Pass *createLCSSAPass();
|
||||
extern char &LCSSAID;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// EarlyCSE - This pass performs a simple and fast CSE pass over the dominator
|
||||
// tree.
|
||||
//
|
||||
FunctionPass *createEarlyCSEPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// GVN - This pass performs global value numbering and redundant load
|
||||
// elimination cotemporaneously.
|
||||
//
|
||||
FunctionPass *createGVNPass(bool NoLoads = false);
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// MemCpyOpt - This pass performs optimizations related to eliminating memcpy
|
||||
// calls and/or combining multiple stores into memset's.
|
||||
//
|
||||
FunctionPass *createMemCpyOptPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// LoopDeletion - This pass performs DCE of non-infinite loops that it
|
||||
// can prove are dead.
|
||||
//
|
||||
Pass *createLoopDeletionPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
/// createSimplifyLibCallsPass - This pass optimizes specific calls to
|
||||
/// specific well-known (library) functions.
|
||||
FunctionPass *createSimplifyLibCallsPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// CodeGenPrepare - This pass prepares a function for instruction selection.
|
||||
//
|
||||
FunctionPass *createCodeGenPreparePass(const TargetLowering *TLI = 0);
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// InstructionNamer - Give any unnamed non-void instructions "tmp" names.
|
||||
//
|
||||
FunctionPass *createInstructionNamerPass();
|
||||
extern char &InstructionNamerID;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Sink - Code Sinking
|
||||
//
|
||||
FunctionPass *createSinkingPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// LowerAtomic - Lower atomic intrinsics to non-atomic form
|
||||
//
|
||||
Pass *createLowerAtomicPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// ValuePropagation - Propagate CFG-derived value information
|
||||
//
|
||||
Pass *createCorrelatedValuePropagationPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// InstructionSimplifier - Remove redundant instructions.
|
||||
//
|
||||
FunctionPass *createInstructionSimplifierPass();
|
||||
extern char &InstructionSimplifierID;
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// LowerExpectIntrinsics - Removes llvm.expect intrinsics and creates
|
||||
// "block_weights" metadata.
|
||||
FunctionPass *createLowerExpectIntrinsicPass();
|
||||
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
109
thirdparty/clang/include/llvm/Transforms/Utils/AddrModeMatcher.h
vendored
Normal file
109
thirdparty/clang/include/llvm/Transforms/Utils/AddrModeMatcher.h
vendored
Normal file
@@ -0,0 +1,109 @@
|
||||
//===- AddrModeMatcher.h - Addressing mode matching facility ----*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// AddressingModeMatcher - This class exposes a single public method, which is
|
||||
// used to construct a "maximal munch" of the addressing mode for the target
|
||||
// specified by TLI for an access to "V" with an access type of AccessTy. This
|
||||
// returns the addressing mode that is actually matched by value, but also
|
||||
// returns the list of instructions involved in that addressing computation in
|
||||
// AddrModeInsts.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_ADDRMODEMATCHER_H
|
||||
#define LLVM_TRANSFORMS_UTILS_ADDRMODEMATCHER_H
|
||||
|
||||
#include "llvm/AddressingMode.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/Target/TargetLowering.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class GlobalValue;
|
||||
class Instruction;
|
||||
class Value;
|
||||
class Type;
|
||||
class User;
|
||||
class raw_ostream;
|
||||
|
||||
/// ExtAddrMode - This is an extended version of TargetLowering::AddrMode
|
||||
/// which holds actual Value*'s for register values.
|
||||
struct ExtAddrMode : public AddrMode {
|
||||
Value *BaseReg;
|
||||
Value *ScaledReg;
|
||||
ExtAddrMode() : BaseReg(0), ScaledReg(0) {}
|
||||
void print(raw_ostream &OS) const;
|
||||
void dump() const;
|
||||
|
||||
bool operator==(const ExtAddrMode& O) const {
|
||||
return (BaseReg == O.BaseReg) && (ScaledReg == O.ScaledReg) &&
|
||||
(BaseGV == O.BaseGV) && (BaseOffs == O.BaseOffs) &&
|
||||
(HasBaseReg == O.HasBaseReg) && (Scale == O.Scale);
|
||||
}
|
||||
};
|
||||
|
||||
static inline raw_ostream &operator<<(raw_ostream &OS, const ExtAddrMode &AM) {
|
||||
AM.print(OS);
|
||||
return OS;
|
||||
}
|
||||
|
||||
class AddressingModeMatcher {
|
||||
SmallVectorImpl<Instruction*> &AddrModeInsts;
|
||||
const TargetLowering &TLI;
|
||||
|
||||
/// AccessTy/MemoryInst - This is the type for the access (e.g. double) and
|
||||
/// the memory instruction that we're computing this address for.
|
||||
Type *AccessTy;
|
||||
Instruction *MemoryInst;
|
||||
|
||||
/// AddrMode - This is the addressing mode that we're building up. This is
|
||||
/// part of the return value of this addressing mode matching stuff.
|
||||
ExtAddrMode &AddrMode;
|
||||
|
||||
/// IgnoreProfitability - This is set to true when we should not do
|
||||
/// profitability checks. When true, IsProfitableToFoldIntoAddressingMode
|
||||
/// always returns true.
|
||||
bool IgnoreProfitability;
|
||||
|
||||
AddressingModeMatcher(SmallVectorImpl<Instruction*> &AMI,
|
||||
const TargetLowering &T, Type *AT,
|
||||
Instruction *MI, ExtAddrMode &AM)
|
||||
: AddrModeInsts(AMI), TLI(T), AccessTy(AT), MemoryInst(MI), AddrMode(AM) {
|
||||
IgnoreProfitability = false;
|
||||
}
|
||||
public:
|
||||
|
||||
/// Match - Find the maximal addressing mode that a load/store of V can fold,
|
||||
/// give an access type of AccessTy. This returns a list of involved
|
||||
/// instructions in AddrModeInsts.
|
||||
static ExtAddrMode Match(Value *V, Type *AccessTy,
|
||||
Instruction *MemoryInst,
|
||||
SmallVectorImpl<Instruction*> &AddrModeInsts,
|
||||
const TargetLowering &TLI) {
|
||||
ExtAddrMode Result;
|
||||
|
||||
bool Success =
|
||||
AddressingModeMatcher(AddrModeInsts, TLI, AccessTy,
|
||||
MemoryInst, Result).MatchAddr(V, 0);
|
||||
(void)Success; assert(Success && "Couldn't select *anything*?");
|
||||
return Result;
|
||||
}
|
||||
private:
|
||||
bool MatchScaledValue(Value *ScaleReg, int64_t Scale, unsigned Depth);
|
||||
bool MatchAddr(Value *V, unsigned Depth);
|
||||
bool MatchOperationAddr(User *Operation, unsigned Opcode, unsigned Depth);
|
||||
bool IsProfitableToFoldIntoAddressingMode(Instruction *I,
|
||||
ExtAddrMode &AMBefore,
|
||||
ExtAddrMode &AMAfter);
|
||||
bool ValueAlreadyLiveAtInst(Value *Val, Value *KnownLive1, Value *KnownLive2);
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
232
thirdparty/clang/include/llvm/Transforms/Utils/BasicBlockUtils.h
vendored
Normal file
232
thirdparty/clang/include/llvm/Transforms/Utils/BasicBlockUtils.h
vendored
Normal file
@@ -0,0 +1,232 @@
|
||||
//===-- Transform/Utils/BasicBlockUtils.h - BasicBlock Utils ----*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This family of functions perform manipulations on basic blocks, and
|
||||
// instructions contained within basic blocks.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_BASICBLOCKUTILS_H
|
||||
#define LLVM_TRANSFORMS_UTILS_BASICBLOCKUTILS_H
|
||||
|
||||
// FIXME: Move to this file: BasicBlock::removePredecessor, BB::splitBasicBlock
|
||||
|
||||
#include "llvm/IR/BasicBlock.h"
|
||||
#include "llvm/Support/CFG.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class AliasAnalysis;
|
||||
class Instruction;
|
||||
class MDNode;
|
||||
class Pass;
|
||||
class ReturnInst;
|
||||
class TargetLibraryInfo;
|
||||
class TerminatorInst;
|
||||
|
||||
/// DeleteDeadBlock - Delete the specified block, which must have no
|
||||
/// predecessors.
|
||||
void DeleteDeadBlock(BasicBlock *BB);
|
||||
|
||||
|
||||
/// FoldSingleEntryPHINodes - We know that BB has one predecessor. If there are
|
||||
/// any single-entry PHI nodes in it, fold them away. This handles the case
|
||||
/// when all entries to the PHI nodes in a block are guaranteed equal, such as
|
||||
/// when the block has exactly one predecessor.
|
||||
void FoldSingleEntryPHINodes(BasicBlock *BB, Pass *P = 0);
|
||||
|
||||
/// DeleteDeadPHIs - Examine each PHI in the given block and delete it if it
|
||||
/// is dead. Also recursively delete any operands that become dead as
|
||||
/// a result. This includes tracing the def-use list from the PHI to see if
|
||||
/// it is ultimately unused or if it reaches an unused cycle. Return true
|
||||
/// if any PHIs were deleted.
|
||||
bool DeleteDeadPHIs(BasicBlock *BB, const TargetLibraryInfo *TLI = 0);
|
||||
|
||||
/// MergeBlockIntoPredecessor - Attempts to merge a block into its predecessor,
|
||||
/// if possible. The return value indicates success or failure.
|
||||
bool MergeBlockIntoPredecessor(BasicBlock *BB, Pass *P = 0);
|
||||
|
||||
// ReplaceInstWithValue - Replace all uses of an instruction (specified by BI)
|
||||
// with a value, then remove and delete the original instruction.
|
||||
//
|
||||
void ReplaceInstWithValue(BasicBlock::InstListType &BIL,
|
||||
BasicBlock::iterator &BI, Value *V);
|
||||
|
||||
// ReplaceInstWithInst - Replace the instruction specified by BI with the
|
||||
// instruction specified by I. The original instruction is deleted and BI is
|
||||
// updated to point to the new instruction.
|
||||
//
|
||||
void ReplaceInstWithInst(BasicBlock::InstListType &BIL,
|
||||
BasicBlock::iterator &BI, Instruction *I);
|
||||
|
||||
// ReplaceInstWithInst - Replace the instruction specified by From with the
|
||||
// instruction specified by To.
|
||||
//
|
||||
void ReplaceInstWithInst(Instruction *From, Instruction *To);
|
||||
|
||||
/// FindFunctionBackedges - Analyze the specified function to find all of the
|
||||
/// loop backedges in the function and return them. This is a relatively cheap
|
||||
/// (compared to computing dominators and loop info) analysis.
|
||||
///
|
||||
/// The output is added to Result, as pairs of <from,to> edge info.
|
||||
void FindFunctionBackedges(const Function &F,
|
||||
SmallVectorImpl<std::pair<const BasicBlock*,const BasicBlock*> > &Result);
|
||||
|
||||
|
||||
/// GetSuccessorNumber - Search for the specified successor of basic block BB
|
||||
/// and return its position in the terminator instruction's list of
|
||||
/// successors. It is an error to call this with a block that is not a
|
||||
/// successor.
|
||||
unsigned GetSuccessorNumber(BasicBlock *BB, BasicBlock *Succ);
|
||||
|
||||
/// isCriticalEdge - Return true if the specified edge is a critical edge.
|
||||
/// Critical edges are edges from a block with multiple successors to a block
|
||||
/// with multiple predecessors.
|
||||
///
|
||||
bool isCriticalEdge(const TerminatorInst *TI, unsigned SuccNum,
|
||||
bool AllowIdenticalEdges = false);
|
||||
|
||||
/// SplitCriticalEdge - If this edge is a critical edge, insert a new node to
|
||||
/// split the critical edge. This will update DominatorTree and
|
||||
/// DominatorFrontier information if it is available, thus calling this pass
|
||||
/// will not invalidate either of them. This returns the new block if the edge
|
||||
/// was split, null otherwise.
|
||||
///
|
||||
/// If MergeIdenticalEdges is true (not the default), *all* edges from TI to the
|
||||
/// specified successor will be merged into the same critical edge block.
|
||||
/// This is most commonly interesting with switch instructions, which may
|
||||
/// have many edges to any one destination. This ensures that all edges to that
|
||||
/// dest go to one block instead of each going to a different block, but isn't
|
||||
/// the standard definition of a "critical edge".
|
||||
///
|
||||
/// It is invalid to call this function on a critical edge that starts at an
|
||||
/// IndirectBrInst. Splitting these edges will almost always create an invalid
|
||||
/// program because the address of the new block won't be the one that is jumped
|
||||
/// to.
|
||||
///
|
||||
BasicBlock *SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum,
|
||||
Pass *P = 0, bool MergeIdenticalEdges = false,
|
||||
bool DontDeleteUselessPHIs = false,
|
||||
bool SplitLandingPads = false);
|
||||
|
||||
inline BasicBlock *SplitCriticalEdge(BasicBlock *BB, succ_iterator SI,
|
||||
Pass *P = 0) {
|
||||
return SplitCriticalEdge(BB->getTerminator(), SI.getSuccessorIndex(), P);
|
||||
}
|
||||
|
||||
/// SplitCriticalEdge - If the edge from *PI to BB is not critical, return
|
||||
/// false. Otherwise, split all edges between the two blocks and return true.
|
||||
/// This updates all of the same analyses as the other SplitCriticalEdge
|
||||
/// function. If P is specified, it updates the analyses
|
||||
/// described above.
|
||||
inline bool SplitCriticalEdge(BasicBlock *Succ, pred_iterator PI, Pass *P = 0) {
|
||||
bool MadeChange = false;
|
||||
TerminatorInst *TI = (*PI)->getTerminator();
|
||||
for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
|
||||
if (TI->getSuccessor(i) == Succ)
|
||||
MadeChange |= !!SplitCriticalEdge(TI, i, P);
|
||||
return MadeChange;
|
||||
}
|
||||
|
||||
/// SplitCriticalEdge - If an edge from Src to Dst is critical, split the edge
|
||||
/// and return true, otherwise return false. This method requires that there be
|
||||
/// an edge between the two blocks. If P is specified, it updates the analyses
|
||||
/// described above.
|
||||
inline BasicBlock *SplitCriticalEdge(BasicBlock *Src, BasicBlock *Dst,
|
||||
Pass *P = 0,
|
||||
bool MergeIdenticalEdges = false,
|
||||
bool DontDeleteUselessPHIs = false) {
|
||||
TerminatorInst *TI = Src->getTerminator();
|
||||
unsigned i = 0;
|
||||
while (1) {
|
||||
assert(i != TI->getNumSuccessors() && "Edge doesn't exist!");
|
||||
if (TI->getSuccessor(i) == Dst)
|
||||
return SplitCriticalEdge(TI, i, P, MergeIdenticalEdges,
|
||||
DontDeleteUselessPHIs);
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
/// SplitEdge - Split the edge connecting specified block. Pass P must
|
||||
/// not be NULL.
|
||||
BasicBlock *SplitEdge(BasicBlock *From, BasicBlock *To, Pass *P);
|
||||
|
||||
/// SplitBlock - Split the specified block at the specified instruction - every
|
||||
/// thing before SplitPt stays in Old and everything starting with SplitPt moves
|
||||
/// to a new block. The two blocks are joined by an unconditional branch and
|
||||
/// the loop info is updated.
|
||||
///
|
||||
BasicBlock *SplitBlock(BasicBlock *Old, Instruction *SplitPt, Pass *P);
|
||||
|
||||
/// SplitBlockPredecessors - This method transforms BB by introducing a new
|
||||
/// basic block into the function, and moving some of the predecessors of BB to
|
||||
/// be predecessors of the new block. The new predecessors are indicated by the
|
||||
/// Preds array, which has NumPreds elements in it. The new block is given a
|
||||
/// suffix of 'Suffix'. This function returns the new block.
|
||||
///
|
||||
/// This currently updates the LLVM IR, AliasAnalysis, DominatorTree,
|
||||
/// DominanceFrontier, LoopInfo, and LCCSA but no other analyses.
|
||||
/// In particular, it does not preserve LoopSimplify (because it's
|
||||
/// complicated to handle the case where one of the edges being split
|
||||
/// is an exit of a loop with other exits).
|
||||
///
|
||||
BasicBlock *SplitBlockPredecessors(BasicBlock *BB, ArrayRef<BasicBlock*> Preds,
|
||||
const char *Suffix, Pass *P = 0);
|
||||
|
||||
/// SplitLandingPadPredecessors - This method transforms the landing pad,
|
||||
/// OrigBB, by introducing two new basic blocks into the function. One of those
|
||||
/// new basic blocks gets the predecessors listed in Preds. The other basic
|
||||
/// block gets the remaining predecessors of OrigBB. The landingpad instruction
|
||||
/// OrigBB is clone into both of the new basic blocks. The new blocks are given
|
||||
/// the suffixes 'Suffix1' and 'Suffix2', and are returned in the NewBBs vector.
|
||||
///
|
||||
/// This currently updates the LLVM IR, AliasAnalysis, DominatorTree,
|
||||
/// DominanceFrontier, LoopInfo, and LCCSA but no other analyses. In particular,
|
||||
/// it does not preserve LoopSimplify (because it's complicated to handle the
|
||||
/// case where one of the edges being split is an exit of a loop with other
|
||||
/// exits).
|
||||
///
|
||||
void SplitLandingPadPredecessors(BasicBlock *OrigBB,ArrayRef<BasicBlock*> Preds,
|
||||
const char *Suffix, const char *Suffix2,
|
||||
Pass *P, SmallVectorImpl<BasicBlock*> &NewBBs);
|
||||
|
||||
/// FoldReturnIntoUncondBranch - This method duplicates the specified return
|
||||
/// instruction into a predecessor which ends in an unconditional branch. If
|
||||
/// the return instruction returns a value defined by a PHI, propagate the
|
||||
/// right value into the return. It returns the new return instruction in the
|
||||
/// predecessor.
|
||||
ReturnInst *FoldReturnIntoUncondBranch(ReturnInst *RI, BasicBlock *BB,
|
||||
BasicBlock *Pred);
|
||||
|
||||
/// SplitBlockAndInsertIfThen - Split the containing block at the
|
||||
/// specified instruction - everything before and including Cmp stays
|
||||
/// in the old basic block, and everything after Cmp is moved to a
|
||||
/// new block. The two blocks are connected by a conditional branch
|
||||
/// (with value of Cmp being the condition).
|
||||
/// Before:
|
||||
/// Head
|
||||
/// Cmp
|
||||
/// Tail
|
||||
/// After:
|
||||
/// Head
|
||||
/// Cmp
|
||||
/// if (Cmp)
|
||||
/// ThenBlock
|
||||
/// Tail
|
||||
///
|
||||
/// If Unreachable is true, then ThenBlock ends with
|
||||
/// UnreachableInst, otherwise it branches to Tail.
|
||||
/// Returns the NewBasicBlock's terminator.
|
||||
|
||||
TerminatorInst *SplitBlockAndInsertIfThen(Instruction *Cmp,
|
||||
bool Unreachable, MDNode *BranchWeights = 0);
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
59
thirdparty/clang/include/llvm/Transforms/Utils/BlackList.h
vendored
Normal file
59
thirdparty/clang/include/llvm/Transforms/Utils/BlackList.h
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
//===-- BlackList.h - blacklist for sanitizers ------------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This is a utility class for instrumentation passes (like AddressSanitizer
|
||||
// or ThreadSanitizer) to avoid instrumenting some functions or global
|
||||
// variables based on a user-supplied blacklist.
|
||||
//
|
||||
// The blacklist disables instrumentation of various functions and global
|
||||
// variables. Each line contains a prefix, followed by a wild card expression.
|
||||
// Empty lines and lines starting with "#" are ignored.
|
||||
// ---
|
||||
// # Blacklisted items:
|
||||
// fun:*_ZN4base6subtle*
|
||||
// global:*global_with_bad_access_or_initialization*
|
||||
// global-init:*global_with_initialization_issues*
|
||||
// global-init-type:*Namespace::ClassName*
|
||||
// src:file_with_tricky_code.cc
|
||||
// global-init-src:ignore-global-initializers-issues.cc
|
||||
// ---
|
||||
// Note that the wild card is in fact an llvm::Regex, but * is automatically
|
||||
// replaced with .*
|
||||
// This is similar to the "ignore" feature of ThreadSanitizer.
|
||||
// http://code.google.com/p/data-race-test/wiki/ThreadSanitizerIgnores
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
|
||||
namespace llvm {
|
||||
class Function;
|
||||
class GlobalVariable;
|
||||
class Module;
|
||||
class Regex;
|
||||
class StringRef;
|
||||
|
||||
class BlackList {
|
||||
public:
|
||||
BlackList(const StringRef Path);
|
||||
// Returns whether either this function or it's source file are blacklisted.
|
||||
bool isIn(const Function &F) const;
|
||||
// Returns whether either this global or it's source file are blacklisted.
|
||||
bool isIn(const GlobalVariable &G) const;
|
||||
// Returns whether this module is blacklisted by filename.
|
||||
bool isIn(const Module &M) const;
|
||||
// Returns whether a global should be excluded from initialization checking.
|
||||
bool isInInit(const GlobalVariable &G) const;
|
||||
private:
|
||||
StringMap<Regex*> Entries;
|
||||
|
||||
bool inSection(const StringRef Section, const StringRef Query) const;
|
||||
};
|
||||
|
||||
} // namespace llvm
|
||||
125
thirdparty/clang/include/llvm/Transforms/Utils/BuildLibCalls.h
vendored
Normal file
125
thirdparty/clang/include/llvm/Transforms/Utils/BuildLibCalls.h
vendored
Normal file
@@ -0,0 +1,125 @@
|
||||
//===- BuildLibCalls.h - Utility builder for libcalls -----------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file exposes an interface to build some C language libcalls for
|
||||
// optimization passes that need to call the various functions.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_BUILDLIBCALLS_H
|
||||
#define LLVM_TRANSFORMS_UTILS_BUILDLIBCALLS_H
|
||||
|
||||
#include "llvm/IR/IRBuilder.h"
|
||||
|
||||
namespace llvm {
|
||||
class Value;
|
||||
class DataLayout;
|
||||
class TargetLibraryInfo;
|
||||
|
||||
/// CastToCStr - Return V if it is an i8*, otherwise cast it to i8*.
|
||||
Value *CastToCStr(Value *V, IRBuilder<> &B);
|
||||
|
||||
/// EmitStrLen - Emit a call to the strlen function to the builder, for the
|
||||
/// specified pointer. Ptr is required to be some pointer type, and the
|
||||
/// return value has 'intptr_t' type.
|
||||
Value *EmitStrLen(Value *Ptr, IRBuilder<> &B, const DataLayout *TD,
|
||||
const TargetLibraryInfo *TLI);
|
||||
|
||||
/// EmitStrNLen - Emit a call to the strnlen function to the builder, for the
|
||||
/// specified pointer. Ptr is required to be some pointer type, MaxLen must
|
||||
/// be of size_t type, and the return value has 'intptr_t' type.
|
||||
Value *EmitStrNLen(Value *Ptr, Value *MaxLen, IRBuilder<> &B,
|
||||
const DataLayout *TD, const TargetLibraryInfo *TLI);
|
||||
|
||||
/// EmitStrChr - Emit a call to the strchr function to the builder, for the
|
||||
/// specified pointer and character. Ptr is required to be some pointer type,
|
||||
/// and the return value has 'i8*' type.
|
||||
Value *EmitStrChr(Value *Ptr, char C, IRBuilder<> &B, const DataLayout *TD,
|
||||
const TargetLibraryInfo *TLI);
|
||||
|
||||
/// EmitStrNCmp - Emit a call to the strncmp function to the builder.
|
||||
Value *EmitStrNCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilder<> &B,
|
||||
const DataLayout *TD, const TargetLibraryInfo *TLI);
|
||||
|
||||
/// EmitStrCpy - Emit a call to the strcpy function to the builder, for the
|
||||
/// specified pointer arguments.
|
||||
Value *EmitStrCpy(Value *Dst, Value *Src, IRBuilder<> &B,
|
||||
const DataLayout *TD, const TargetLibraryInfo *TLI,
|
||||
StringRef Name = "strcpy");
|
||||
|
||||
/// EmitStrNCpy - Emit a call to the strncpy function to the builder, for the
|
||||
/// specified pointer arguments and length.
|
||||
Value *EmitStrNCpy(Value *Dst, Value *Src, Value *Len, IRBuilder<> &B,
|
||||
const DataLayout *TD, const TargetLibraryInfo *TLI,
|
||||
StringRef Name = "strncpy");
|
||||
|
||||
/// EmitMemCpyChk - Emit a call to the __memcpy_chk function to the builder.
|
||||
/// This expects that the Len and ObjSize have type 'intptr_t' and Dst/Src
|
||||
/// are pointers.
|
||||
Value *EmitMemCpyChk(Value *Dst, Value *Src, Value *Len, Value *ObjSize,
|
||||
IRBuilder<> &B, const DataLayout *TD,
|
||||
const TargetLibraryInfo *TLI);
|
||||
|
||||
/// EmitMemChr - Emit a call to the memchr function. This assumes that Ptr is
|
||||
/// a pointer, Val is an i32 value, and Len is an 'intptr_t' value.
|
||||
Value *EmitMemChr(Value *Ptr, Value *Val, Value *Len, IRBuilder<> &B,
|
||||
const DataLayout *TD, const TargetLibraryInfo *TLI);
|
||||
|
||||
/// EmitMemCmp - Emit a call to the memcmp function.
|
||||
Value *EmitMemCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilder<> &B,
|
||||
const DataLayout *TD, const TargetLibraryInfo *TLI);
|
||||
|
||||
/// EmitUnaryFloatFnCall - Emit a call to the unary function named 'Name'
|
||||
/// (e.g. 'floor'). This function is known to take a single of type matching
|
||||
/// 'Op' and returns one value with the same type. If 'Op' is a long double,
|
||||
/// 'l' is added as the suffix of name, if 'Op' is a float, we add a 'f'
|
||||
/// suffix.
|
||||
Value *EmitUnaryFloatFnCall(Value *Op, StringRef Name, IRBuilder<> &B,
|
||||
const AttributeSet &Attrs);
|
||||
|
||||
/// EmitPutChar - Emit a call to the putchar function. This assumes that Char
|
||||
/// is an integer.
|
||||
Value *EmitPutChar(Value *Char, IRBuilder<> &B, const DataLayout *TD,
|
||||
const TargetLibraryInfo *TLI);
|
||||
|
||||
/// EmitPutS - Emit a call to the puts function. This assumes that Str is
|
||||
/// some pointer.
|
||||
Value *EmitPutS(Value *Str, IRBuilder<> &B, const DataLayout *TD,
|
||||
const TargetLibraryInfo *TLI);
|
||||
|
||||
/// EmitFPutC - Emit a call to the fputc function. This assumes that Char is
|
||||
/// an i32, and File is a pointer to FILE.
|
||||
Value *EmitFPutC(Value *Char, Value *File, IRBuilder<> &B,
|
||||
const DataLayout *TD, const TargetLibraryInfo *TLI);
|
||||
|
||||
/// EmitFPutS - Emit a call to the puts function. Str is required to be a
|
||||
/// pointer and File is a pointer to FILE.
|
||||
Value *EmitFPutS(Value *Str, Value *File, IRBuilder<> &B, const DataLayout *TD,
|
||||
const TargetLibraryInfo *TLI);
|
||||
|
||||
/// EmitFWrite - Emit a call to the fwrite function. This assumes that Ptr is
|
||||
/// a pointer, Size is an 'intptr_t', and File is a pointer to FILE.
|
||||
Value *EmitFWrite(Value *Ptr, Value *Size, Value *File, IRBuilder<> &B,
|
||||
const DataLayout *TD, const TargetLibraryInfo *TLI);
|
||||
|
||||
/// SimplifyFortifiedLibCalls - Helper class for folding checked library
|
||||
/// calls (e.g. __strcpy_chk) into their unchecked counterparts.
|
||||
class SimplifyFortifiedLibCalls {
|
||||
protected:
|
||||
CallInst *CI;
|
||||
virtual void replaceCall(Value *With) = 0;
|
||||
virtual bool isFoldable(unsigned SizeCIOp, unsigned SizeArgOp,
|
||||
bool isString) const = 0;
|
||||
public:
|
||||
virtual ~SimplifyFortifiedLibCalls();
|
||||
bool fold(CallInst *CI, const DataLayout *TD, const TargetLibraryInfo *TLI);
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
34
thirdparty/clang/include/llvm/Transforms/Utils/BypassSlowDivision.h
vendored
Normal file
34
thirdparty/clang/include/llvm/Transforms/Utils/BypassSlowDivision.h
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
//===- llvm/Transforms/Utils/BypassSlowDivision.h --------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file contains an optimization for div and rem on architectures that
|
||||
// execute short instructions significantly faster than longer instructions.
|
||||
// For example, on Intel Atom 32-bit divides are slow enough that during
|
||||
// runtime it is profitable to check the value of the operands, and if they are
|
||||
// positive and less than 256 use an unsigned 8-bit divide.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_BYPASSSLOWDIVISION_H
|
||||
#define LLVM_TRANSFORMS_UTILS_BYPASSSLOWDIVISION_H
|
||||
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
/// This optimization identifies DIV instructions that can be
|
||||
/// profitably bypassed and carried out with a shorter, faster divide.
|
||||
bool bypassSlowDivision(Function &F,
|
||||
Function::iterator &I,
|
||||
const DenseMap<unsigned int, unsigned int> &BypassWidth);
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
199
thirdparty/clang/include/llvm/Transforms/Utils/Cloning.h
vendored
Normal file
199
thirdparty/clang/include/llvm/Transforms/Utils/Cloning.h
vendored
Normal file
@@ -0,0 +1,199 @@
|
||||
//===- Cloning.h - Clone various parts of LLVM programs ---------*- 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 various functions that are used to clone chunks of LLVM
|
||||
// code for various purposes. This varies from copying whole modules into new
|
||||
// modules, to cloning functions with different arguments, to inlining
|
||||
// functions, to copying basic blocks to support loop unrolling or superblock
|
||||
// formation, etc.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_CLONING_H
|
||||
#define LLVM_TRANSFORMS_UTILS_CLONING_H
|
||||
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/Twine.h"
|
||||
#include "llvm/ADT/ValueMap.h"
|
||||
#include "llvm/Support/ValueHandle.h"
|
||||
#include "llvm/Transforms/Utils/ValueMapper.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class Module;
|
||||
class Function;
|
||||
class Instruction;
|
||||
class Pass;
|
||||
class LPPassManager;
|
||||
class BasicBlock;
|
||||
class Value;
|
||||
class CallInst;
|
||||
class InvokeInst;
|
||||
class ReturnInst;
|
||||
class CallSite;
|
||||
class Trace;
|
||||
class CallGraph;
|
||||
class DataLayout;
|
||||
class Loop;
|
||||
class LoopInfo;
|
||||
class AllocaInst;
|
||||
|
||||
/// CloneModule - Return an exact copy of the specified module
|
||||
///
|
||||
Module *CloneModule(const Module *M);
|
||||
Module *CloneModule(const Module *M, ValueToValueMapTy &VMap);
|
||||
|
||||
/// ClonedCodeInfo - This struct can be used to capture information about code
|
||||
/// being cloned, while it is being cloned.
|
||||
struct ClonedCodeInfo {
|
||||
/// ContainsCalls - This is set to true if the cloned code contains a normal
|
||||
/// call instruction.
|
||||
bool ContainsCalls;
|
||||
|
||||
/// ContainsDynamicAllocas - This is set to true if the cloned code contains
|
||||
/// a 'dynamic' alloca. Dynamic allocas are allocas that are either not in
|
||||
/// the entry block or they are in the entry block but are not a constant
|
||||
/// size.
|
||||
bool ContainsDynamicAllocas;
|
||||
|
||||
ClonedCodeInfo() : ContainsCalls(false), ContainsDynamicAllocas(false) {}
|
||||
};
|
||||
|
||||
|
||||
/// CloneBasicBlock - Return a copy of the specified basic block, but without
|
||||
/// embedding the block into a particular function. The block returned is an
|
||||
/// exact copy of the specified basic block, without any remapping having been
|
||||
/// performed. Because of this, this is only suitable for applications where
|
||||
/// the basic block will be inserted into the same function that it was cloned
|
||||
/// from (loop unrolling would use this, for example).
|
||||
///
|
||||
/// Also, note that this function makes a direct copy of the basic block, and
|
||||
/// can thus produce illegal LLVM code. In particular, it will copy any PHI
|
||||
/// nodes from the original block, even though there are no predecessors for the
|
||||
/// newly cloned block (thus, phi nodes will have to be updated). Also, this
|
||||
/// block will branch to the old successors of the original block: these
|
||||
/// successors will have to have any PHI nodes updated to account for the new
|
||||
/// incoming edges.
|
||||
///
|
||||
/// The correlation between instructions in the source and result basic blocks
|
||||
/// is recorded in the VMap map.
|
||||
///
|
||||
/// If you have a particular suffix you'd like to use to add to any cloned
|
||||
/// names, specify it as the optional third parameter.
|
||||
///
|
||||
/// If you would like the basic block to be auto-inserted into the end of a
|
||||
/// function, you can specify it as the optional fourth parameter.
|
||||
///
|
||||
/// If you would like to collect additional information about the cloned
|
||||
/// function, you can specify a ClonedCodeInfo object with the optional fifth
|
||||
/// parameter.
|
||||
///
|
||||
BasicBlock *CloneBasicBlock(const BasicBlock *BB,
|
||||
ValueToValueMapTy &VMap,
|
||||
const Twine &NameSuffix = "", Function *F = 0,
|
||||
ClonedCodeInfo *CodeInfo = 0);
|
||||
|
||||
/// CloneFunction - Return a copy of the specified function, but without
|
||||
/// embedding the function into another module. Also, any references specified
|
||||
/// in the VMap are changed to refer to their mapped value instead of the
|
||||
/// original one. If any of the arguments to the function are in the VMap,
|
||||
/// the arguments are deleted from the resultant function. The VMap is
|
||||
/// updated to include mappings from all of the instructions and basicblocks in
|
||||
/// the function from their old to new values. The final argument captures
|
||||
/// information about the cloned code if non-null.
|
||||
///
|
||||
/// If ModuleLevelChanges is false, VMap contains no non-identity GlobalValue
|
||||
/// mappings.
|
||||
///
|
||||
Function *CloneFunction(const Function *F,
|
||||
ValueToValueMapTy &VMap,
|
||||
bool ModuleLevelChanges,
|
||||
ClonedCodeInfo *CodeInfo = 0);
|
||||
|
||||
/// Clone OldFunc into NewFunc, transforming the old arguments into references
|
||||
/// to VMap values. Note that if NewFunc already has basic blocks, the ones
|
||||
/// cloned into it will be added to the end of the function. This function
|
||||
/// fills in a list of return instructions, and can optionally remap types
|
||||
/// and/or append the specified suffix to all values cloned.
|
||||
///
|
||||
/// If ModuleLevelChanges is false, VMap contains no non-identity GlobalValue
|
||||
/// mappings.
|
||||
///
|
||||
void CloneFunctionInto(Function *NewFunc, const Function *OldFunc,
|
||||
ValueToValueMapTy &VMap,
|
||||
bool ModuleLevelChanges,
|
||||
SmallVectorImpl<ReturnInst*> &Returns,
|
||||
const char *NameSuffix = "",
|
||||
ClonedCodeInfo *CodeInfo = 0,
|
||||
ValueMapTypeRemapper *TypeMapper = 0);
|
||||
|
||||
/// CloneAndPruneFunctionInto - This works exactly like CloneFunctionInto,
|
||||
/// except that it does some simple constant prop and DCE on the fly. The
|
||||
/// effect of this is to copy significantly less code in cases where (for
|
||||
/// example) a function call with constant arguments is inlined, and those
|
||||
/// constant arguments cause a significant amount of code in the callee to be
|
||||
/// dead. Since this doesn't produce an exactly copy of the input, it can't be
|
||||
/// used for things like CloneFunction or CloneModule.
|
||||
///
|
||||
/// If ModuleLevelChanges is false, VMap contains no non-identity GlobalValue
|
||||
/// mappings.
|
||||
///
|
||||
void CloneAndPruneFunctionInto(Function *NewFunc, const Function *OldFunc,
|
||||
ValueToValueMapTy &VMap,
|
||||
bool ModuleLevelChanges,
|
||||
SmallVectorImpl<ReturnInst*> &Returns,
|
||||
const char *NameSuffix = "",
|
||||
ClonedCodeInfo *CodeInfo = 0,
|
||||
const DataLayout *TD = 0,
|
||||
Instruction *TheCall = 0);
|
||||
|
||||
|
||||
/// InlineFunctionInfo - This class captures the data input to the
|
||||
/// InlineFunction call, and records the auxiliary results produced by it.
|
||||
class InlineFunctionInfo {
|
||||
public:
|
||||
explicit InlineFunctionInfo(CallGraph *cg = 0, const DataLayout *td = 0)
|
||||
: CG(cg), TD(td) {}
|
||||
|
||||
/// CG - If non-null, InlineFunction will update the callgraph to reflect the
|
||||
/// changes it makes.
|
||||
CallGraph *CG;
|
||||
const DataLayout *TD;
|
||||
|
||||
/// StaticAllocas - InlineFunction fills this in with all static allocas that
|
||||
/// get copied into the caller.
|
||||
SmallVector<AllocaInst*, 4> StaticAllocas;
|
||||
|
||||
/// InlinedCalls - InlineFunction fills this in with callsites that were
|
||||
/// inlined from the callee. This is only filled in if CG is non-null.
|
||||
SmallVector<WeakVH, 8> InlinedCalls;
|
||||
|
||||
void reset() {
|
||||
StaticAllocas.clear();
|
||||
InlinedCalls.clear();
|
||||
}
|
||||
};
|
||||
|
||||
/// InlineFunction - This function inlines the called function into the basic
|
||||
/// block of the caller. This returns false if it is not possible to inline
|
||||
/// this call. The program is still in a well defined state if this occurs
|
||||
/// though.
|
||||
///
|
||||
/// Note that this only does one level of inlining. For example, if the
|
||||
/// instruction 'call B' is inlined, and 'B' calls 'C', then the call to 'C' now
|
||||
/// exists in the instruction stream. Similarly this will inline a recursive
|
||||
/// function by one level.
|
||||
///
|
||||
bool InlineFunction(CallInst *C, InlineFunctionInfo &IFI, bool InsertLifetime = true);
|
||||
bool InlineFunction(InvokeInst *II, InlineFunctionInfo &IFI, bool InsertLifetime = true);
|
||||
bool InlineFunction(CallSite CS, InlineFunctionInfo &IFI, bool InsertLifetime = true);
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
66
thirdparty/clang/include/llvm/Transforms/Utils/CmpInstAnalysis.h
vendored
Normal file
66
thirdparty/clang/include/llvm/Transforms/Utils/CmpInstAnalysis.h
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
//===-- CmpInstAnalysis.h - Utils to help fold compare insts ------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file holds routines to help analyse compare instructions
|
||||
// and fold them into constants or other compare instructions
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_CMPINSTANALYSIS_H
|
||||
#define LLVM_TRANSFORMS_UTILS_CMPINSTANALYSIS_H
|
||||
|
||||
#include "llvm/IR/InstrTypes.h"
|
||||
|
||||
namespace llvm {
|
||||
class ICmpInst;
|
||||
class Value;
|
||||
|
||||
/// getICmpCode - Encode a icmp predicate into a three bit mask. These bits
|
||||
/// are carefully arranged to allow folding of expressions such as:
|
||||
///
|
||||
/// (A < B) | (A > B) --> (A != B)
|
||||
///
|
||||
/// Note that this is only valid if the first and second predicates have the
|
||||
/// same sign. Is illegal to do: (A u< B) | (A s> B)
|
||||
///
|
||||
/// Three bits are used to represent the condition, as follows:
|
||||
/// 0 A > B
|
||||
/// 1 A == B
|
||||
/// 2 A < B
|
||||
///
|
||||
/// <=> Value Definition
|
||||
/// 000 0 Always false
|
||||
/// 001 1 A > B
|
||||
/// 010 2 A == B
|
||||
/// 011 3 A >= B
|
||||
/// 100 4 A < B
|
||||
/// 101 5 A != B
|
||||
/// 110 6 A <= B
|
||||
/// 111 7 Always true
|
||||
///
|
||||
unsigned getICmpCode(const ICmpInst *ICI, bool InvertPred = false);
|
||||
|
||||
/// getICmpValue - This is the complement of getICmpCode, which turns an
|
||||
/// opcode and two operands into either a constant true or false, or the
|
||||
/// predicate for a new ICmp instruction. The sign is passed in to determine
|
||||
/// which kind of predicate to use in the new icmp instruction.
|
||||
/// Non-NULL return value will be a true or false constant.
|
||||
/// NULL return means a new ICmp is needed. The predicate for which is
|
||||
/// output in NewICmpPred.
|
||||
Value *getICmpValue(bool Sign, unsigned Code, Value *LHS, Value *RHS,
|
||||
CmpInst::Predicate &NewICmpPred);
|
||||
|
||||
/// PredicatesFoldable - Return true if both predicates match sign or if at
|
||||
/// least one of them is an equality comparison (which is signless).
|
||||
bool PredicatesFoldable(CmpInst::Predicate p1, CmpInst::Predicate p2);
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
||||
|
||||
127
thirdparty/clang/include/llvm/Transforms/Utils/CodeExtractor.h
vendored
Normal file
127
thirdparty/clang/include/llvm/Transforms/Utils/CodeExtractor.h
vendored
Normal file
@@ -0,0 +1,127 @@
|
||||
//===-- Transform/Utils/CodeExtractor.h - Code extraction util --*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// A utility to support extracting code from one function into its own
|
||||
// stand-alone function.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_CODE_EXTRACTOR_H
|
||||
#define LLVM_TRANSFORMS_UTILS_CODE_EXTRACTOR_H
|
||||
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/SetVector.h"
|
||||
|
||||
namespace llvm {
|
||||
class BasicBlock;
|
||||
class DominatorTree;
|
||||
class Function;
|
||||
class Loop;
|
||||
class Module;
|
||||
class RegionNode;
|
||||
class Type;
|
||||
class Value;
|
||||
|
||||
/// \brief Utility class for extracting code into a new function.
|
||||
///
|
||||
/// This utility provides a simple interface for extracting some sequence of
|
||||
/// code into its own function, replacing it with a call to that function. It
|
||||
/// also provides various methods to query about the nature and result of
|
||||
/// such a transformation.
|
||||
///
|
||||
/// The rough algorithm used is:
|
||||
/// 1) Find both the inputs and outputs for the extracted region.
|
||||
/// 2) Pass the inputs as arguments, remapping them within the extracted
|
||||
/// function to arguments.
|
||||
/// 3) Add allocas for any scalar outputs, adding all of the outputs' allocas
|
||||
/// as arguments, and inserting stores to the arguments for any scalars.
|
||||
class CodeExtractor {
|
||||
typedef SetVector<Value *> ValueSet;
|
||||
|
||||
// Various bits of state computed on construction.
|
||||
DominatorTree *const DT;
|
||||
const bool AggregateArgs;
|
||||
|
||||
// Bits of intermediate state computed at various phases of extraction.
|
||||
SetVector<BasicBlock *> Blocks;
|
||||
unsigned NumExitBlocks;
|
||||
Type *RetTy;
|
||||
|
||||
public:
|
||||
/// \brief Create a code extractor for a single basic block.
|
||||
///
|
||||
/// In this formation, we don't require a dominator tree. The given basic
|
||||
/// block is set up for extraction.
|
||||
CodeExtractor(BasicBlock *BB, bool AggregateArgs = false);
|
||||
|
||||
/// \brief Create a code extractor for a sequence of blocks.
|
||||
///
|
||||
/// Given a sequence of basic blocks where the first block in the sequence
|
||||
/// dominates the rest, prepare a code extractor object for pulling this
|
||||
/// sequence out into its new function. When a DominatorTree is also given,
|
||||
/// extra checking and transformations are enabled.
|
||||
CodeExtractor(ArrayRef<BasicBlock *> BBs, DominatorTree *DT = 0,
|
||||
bool AggregateArgs = false);
|
||||
|
||||
/// \brief Create a code extractor for a loop body.
|
||||
///
|
||||
/// Behaves just like the generic code sequence constructor, but uses the
|
||||
/// block sequence of the loop.
|
||||
CodeExtractor(DominatorTree &DT, Loop &L, bool AggregateArgs = false);
|
||||
|
||||
/// \brief Create a code extractor for a region node.
|
||||
///
|
||||
/// Behaves just like the generic code sequence constructor, but uses the
|
||||
/// block sequence of the region node passed in.
|
||||
CodeExtractor(DominatorTree &DT, const RegionNode &RN,
|
||||
bool AggregateArgs = false);
|
||||
|
||||
/// \brief Perform the extraction, returning the new function.
|
||||
///
|
||||
/// Returns zero when called on a CodeExtractor instance where isEligible
|
||||
/// returns false.
|
||||
Function *extractCodeRegion();
|
||||
|
||||
/// \brief Test whether this code extractor is eligible.
|
||||
///
|
||||
/// Based on the blocks used when constructing the code extractor,
|
||||
/// determine whether it is eligible for extraction.
|
||||
bool isEligible() const { return !Blocks.empty(); }
|
||||
|
||||
/// \brief Compute the set of input values and output values for the code.
|
||||
///
|
||||
/// These can be used either when performing the extraction or to evaluate
|
||||
/// the expected size of a call to the extracted function. Note that this
|
||||
/// work cannot be cached between the two as once we decide to extract
|
||||
/// a code sequence, that sequence is modified, including changing these
|
||||
/// sets, before extraction occurs. These modifications won't have any
|
||||
/// significant impact on the cost however.
|
||||
void findInputsOutputs(ValueSet &Inputs, ValueSet &Outputs) const;
|
||||
|
||||
private:
|
||||
void severSplitPHINodes(BasicBlock *&Header);
|
||||
void splitReturnBlocks();
|
||||
|
||||
Function *constructFunction(const ValueSet &inputs,
|
||||
const ValueSet &outputs,
|
||||
BasicBlock *header,
|
||||
BasicBlock *newRootNode, BasicBlock *newHeader,
|
||||
Function *oldFunction, Module *M);
|
||||
|
||||
void moveCodeToFunction(Function *newFunction);
|
||||
|
||||
void emitCallAndSwitchStatement(Function *newFunction,
|
||||
BasicBlock *newHeader,
|
||||
ValueSet &inputs,
|
||||
ValueSet &outputs);
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
62
thirdparty/clang/include/llvm/Transforms/Utils/IntegerDivision.h
vendored
Normal file
62
thirdparty/clang/include/llvm/Transforms/Utils/IntegerDivision.h
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
//===- llvm/Transforms/Utils/IntegerDivision.h ------------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file contains an implementation of 32bit integer division for targets
|
||||
// that don't have native support. It's largely derived from compiler-rt's
|
||||
// implementation of __udivsi3, but hand-tuned for targets that prefer less
|
||||
// control flow.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_INTEGERDIVISION_H
|
||||
#define LLVM_TRANSFORMS_UTILS_INTEGERDIVISION_H
|
||||
|
||||
namespace llvm {
|
||||
class BinaryOperator;
|
||||
}
|
||||
|
||||
namespace llvm {
|
||||
|
||||
/// Generate code to calculate the remainder of two integers, replacing Rem
|
||||
/// with the generated code. This currently generates code using the udiv
|
||||
/// expansion, but future work includes generating more specialized code,
|
||||
/// e.g. when more information about the operands are known. Currently only
|
||||
/// implements 32bit scalar division (due to udiv's limitation), but future
|
||||
/// work is removing this limitation.
|
||||
///
|
||||
/// @brief Replace Rem with generated code.
|
||||
bool expandRemainder(BinaryOperator *Rem);
|
||||
|
||||
/// Generate code to divide two integers, replacing Div with the generated
|
||||
/// code. This currently generates code similarly to compiler-rt's
|
||||
/// implementations, but future work includes generating more specialized code
|
||||
/// when more information about the operands are known. Currently only
|
||||
/// implements 32bit scalar division, but future work is removing this
|
||||
/// limitation.
|
||||
///
|
||||
/// @brief Replace Div with generated code.
|
||||
bool expandDivision(BinaryOperator* Div);
|
||||
|
||||
/// Generate code to calculate the remainder of two integers, replacing Rem
|
||||
/// with the generated code. Uses the above 32bit routine, therefore adequate
|
||||
/// for targets with little or no support for less than 32 bit arithmetic.
|
||||
///
|
||||
/// @brief Replace Rem with generated code.
|
||||
bool expandRemainderUpTo32Bits(BinaryOperator *Rem);
|
||||
|
||||
/// Generate code to divide two integers, replacing Div with the generated
|
||||
/// code. Uses the above 32bit routine, therefore adequate for targets with
|
||||
/// little or no support for less than 32 bit arithmetic.
|
||||
///
|
||||
/// @brief Replace Rem with generated code.
|
||||
bool expandDivisionUpTo32Bits(BinaryOperator *Div);
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
267
thirdparty/clang/include/llvm/Transforms/Utils/Local.h
vendored
Normal file
267
thirdparty/clang/include/llvm/Transforms/Utils/Local.h
vendored
Normal file
@@ -0,0 +1,267 @@
|
||||
//===-- Local.h - Functions to perform local transformations ----*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This family of functions perform various local transformations to the
|
||||
// program.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_LOCAL_H
|
||||
#define LLVM_TRANSFORMS_UTILS_LOCAL_H
|
||||
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/IR/IRBuilder.h"
|
||||
#include "llvm/IR/Operator.h"
|
||||
#include "llvm/Support/GetElementPtrTypeIterator.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class User;
|
||||
class BasicBlock;
|
||||
class Function;
|
||||
class BranchInst;
|
||||
class Instruction;
|
||||
class DbgDeclareInst;
|
||||
class StoreInst;
|
||||
class LoadInst;
|
||||
class Value;
|
||||
class Pass;
|
||||
class PHINode;
|
||||
class AllocaInst;
|
||||
class ConstantExpr;
|
||||
class DataLayout;
|
||||
class TargetLibraryInfo;
|
||||
class TargetTransformInfo;
|
||||
class DIBuilder;
|
||||
|
||||
template<typename T> class SmallVectorImpl;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Local constant propagation.
|
||||
//
|
||||
|
||||
/// ConstantFoldTerminator - If a terminator instruction is predicated on a
|
||||
/// constant value, convert it into an unconditional branch to the constant
|
||||
/// destination. This is a nontrivial operation because the successors of this
|
||||
/// basic block must have their PHI nodes updated.
|
||||
/// Also calls RecursivelyDeleteTriviallyDeadInstructions() on any branch/switch
|
||||
/// conditions and indirectbr addresses this might make dead if
|
||||
/// DeleteDeadConditions is true.
|
||||
bool ConstantFoldTerminator(BasicBlock *BB, bool DeleteDeadConditions = false,
|
||||
const TargetLibraryInfo *TLI = 0);
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Local dead code elimination.
|
||||
//
|
||||
|
||||
/// isInstructionTriviallyDead - Return true if the result produced by the
|
||||
/// instruction is not used, and the instruction has no side effects.
|
||||
///
|
||||
bool isInstructionTriviallyDead(Instruction *I, const TargetLibraryInfo *TLI=0);
|
||||
|
||||
/// RecursivelyDeleteTriviallyDeadInstructions - If the specified value is a
|
||||
/// trivially dead instruction, delete it. If that makes any of its operands
|
||||
/// trivially dead, delete them too, recursively. Return true if any
|
||||
/// instructions were deleted.
|
||||
bool RecursivelyDeleteTriviallyDeadInstructions(Value *V,
|
||||
const TargetLibraryInfo *TLI=0);
|
||||
|
||||
/// RecursivelyDeleteDeadPHINode - If the specified value is an effectively
|
||||
/// dead PHI node, due to being a def-use chain of single-use nodes that
|
||||
/// either forms a cycle or is terminated by a trivially dead instruction,
|
||||
/// delete it. If that makes any of its operands trivially dead, delete them
|
||||
/// too, recursively. Return true if a change was made.
|
||||
bool RecursivelyDeleteDeadPHINode(PHINode *PN, const TargetLibraryInfo *TLI=0);
|
||||
|
||||
|
||||
/// SimplifyInstructionsInBlock - Scan the specified basic block and try to
|
||||
/// simplify any instructions in it and recursively delete dead instructions.
|
||||
///
|
||||
/// This returns true if it changed the code, note that it can delete
|
||||
/// instructions in other blocks as well in this block.
|
||||
bool SimplifyInstructionsInBlock(BasicBlock *BB, const DataLayout *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0);
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Control Flow Graph Restructuring.
|
||||
//
|
||||
|
||||
/// RemovePredecessorAndSimplify - Like BasicBlock::removePredecessor, this
|
||||
/// method is called when we're about to delete Pred as a predecessor of BB. If
|
||||
/// BB contains any PHI nodes, this drops the entries in the PHI nodes for Pred.
|
||||
///
|
||||
/// Unlike the removePredecessor method, this attempts to simplify uses of PHI
|
||||
/// nodes that collapse into identity values. For example, if we have:
|
||||
/// x = phi(1, 0, 0, 0)
|
||||
/// y = and x, z
|
||||
///
|
||||
/// .. and delete the predecessor corresponding to the '1', this will attempt to
|
||||
/// recursively fold the 'and' to 0.
|
||||
void RemovePredecessorAndSimplify(BasicBlock *BB, BasicBlock *Pred,
|
||||
DataLayout *TD = 0);
|
||||
|
||||
|
||||
/// MergeBasicBlockIntoOnlyPred - BB is a block with one predecessor and its
|
||||
/// predecessor is known to have one successor (BB!). Eliminate the edge
|
||||
/// between them, moving the instructions in the predecessor into BB. This
|
||||
/// deletes the predecessor block.
|
||||
///
|
||||
void MergeBasicBlockIntoOnlyPred(BasicBlock *BB, Pass *P = 0);
|
||||
|
||||
|
||||
/// TryToSimplifyUncondBranchFromEmptyBlock - BB is known to contain an
|
||||
/// unconditional branch, and contains no instructions other than PHI nodes,
|
||||
/// potential debug intrinsics and the branch. If possible, eliminate BB by
|
||||
/// rewriting all the predecessors to branch to the successor block and return
|
||||
/// true. If we can't transform, return false.
|
||||
bool TryToSimplifyUncondBranchFromEmptyBlock(BasicBlock *BB);
|
||||
|
||||
/// EliminateDuplicatePHINodes - Check for and eliminate duplicate PHI
|
||||
/// nodes in this block. This doesn't try to be clever about PHI nodes
|
||||
/// which differ only in the order of the incoming values, but instcombine
|
||||
/// orders them so it usually won't matter.
|
||||
///
|
||||
bool EliminateDuplicatePHINodes(BasicBlock *BB);
|
||||
|
||||
/// SimplifyCFG - This function is used to do simplification of a CFG. For
|
||||
/// example, it adjusts branches to branches to eliminate the extra hop, it
|
||||
/// eliminates unreachable basic blocks, and does other "peephole" optimization
|
||||
/// of the CFG. It returns true if a modification was made, possibly deleting
|
||||
/// the basic block that was pointed to.
|
||||
///
|
||||
bool SimplifyCFG(BasicBlock *BB, const TargetTransformInfo &TTI,
|
||||
const DataLayout *TD = 0);
|
||||
|
||||
/// FoldBranchToCommonDest - If this basic block is ONLY a setcc and a branch,
|
||||
/// and if a predecessor branches to us and one of our successors, fold the
|
||||
/// setcc into the predecessor and use logical operations to pick the right
|
||||
/// destination.
|
||||
bool FoldBranchToCommonDest(BranchInst *BI);
|
||||
|
||||
/// DemoteRegToStack - This function takes a virtual register computed by an
|
||||
/// Instruction and replaces it with a slot in the stack frame, allocated via
|
||||
/// alloca. This allows the CFG to be changed around without fear of
|
||||
/// invalidating the SSA information for the value. It returns the pointer to
|
||||
/// the alloca inserted to create a stack slot for X.
|
||||
///
|
||||
AllocaInst *DemoteRegToStack(Instruction &X,
|
||||
bool VolatileLoads = false,
|
||||
Instruction *AllocaPoint = 0);
|
||||
|
||||
/// DemotePHIToStack - This function takes a virtual register computed by a phi
|
||||
/// node and replaces it with a slot in the stack frame, allocated via alloca.
|
||||
/// The phi node is deleted and it returns the pointer to the alloca inserted.
|
||||
AllocaInst *DemotePHIToStack(PHINode *P, Instruction *AllocaPoint = 0);
|
||||
|
||||
/// getOrEnforceKnownAlignment - If the specified pointer has an alignment that
|
||||
/// we can determine, return it, otherwise return 0. If PrefAlign is specified,
|
||||
/// and it is more than the alignment of the ultimate object, see if we can
|
||||
/// increase the alignment of the ultimate object, making this check succeed.
|
||||
unsigned getOrEnforceKnownAlignment(Value *V, unsigned PrefAlign,
|
||||
const DataLayout *TD = 0);
|
||||
|
||||
/// getKnownAlignment - Try to infer an alignment for the specified pointer.
|
||||
static inline unsigned getKnownAlignment(Value *V, const DataLayout *TD = 0) {
|
||||
return getOrEnforceKnownAlignment(V, 0, TD);
|
||||
}
|
||||
|
||||
/// EmitGEPOffset - Given a getelementptr instruction/constantexpr, emit the
|
||||
/// code necessary to compute the offset from the base pointer (without adding
|
||||
/// in the base pointer). Return the result as a signed integer of intptr size.
|
||||
/// When NoAssumptions is true, no assumptions about index computation not
|
||||
/// overflowing is made.
|
||||
template<typename IRBuilderTy>
|
||||
Value *EmitGEPOffset(IRBuilderTy *Builder, const DataLayout &TD, User *GEP,
|
||||
bool NoAssumptions = false) {
|
||||
gep_type_iterator GTI = gep_type_begin(GEP);
|
||||
Type *IntPtrTy = TD.getIntPtrType(GEP->getContext());
|
||||
Value *Result = Constant::getNullValue(IntPtrTy);
|
||||
|
||||
// If the GEP is inbounds, we know that none of the addressing operations will
|
||||
// overflow in an unsigned sense.
|
||||
bool isInBounds = cast<GEPOperator>(GEP)->isInBounds() && !NoAssumptions;
|
||||
|
||||
// Build a mask for high order bits.
|
||||
unsigned IntPtrWidth = TD.getPointerSizeInBits();
|
||||
uint64_t PtrSizeMask = ~0ULL >> (64-IntPtrWidth);
|
||||
|
||||
for (User::op_iterator i = GEP->op_begin() + 1, e = GEP->op_end(); i != e;
|
||||
++i, ++GTI) {
|
||||
Value *Op = *i;
|
||||
uint64_t Size = TD.getTypeAllocSize(GTI.getIndexedType()) & PtrSizeMask;
|
||||
if (ConstantInt *OpC = dyn_cast<ConstantInt>(Op)) {
|
||||
if (OpC->isZero()) continue;
|
||||
|
||||
// Handle a struct index, which adds its field offset to the pointer.
|
||||
if (StructType *STy = dyn_cast<StructType>(*GTI)) {
|
||||
Size = TD.getStructLayout(STy)->getElementOffset(OpC->getZExtValue());
|
||||
|
||||
if (Size)
|
||||
Result = Builder->CreateAdd(Result, ConstantInt::get(IntPtrTy, Size),
|
||||
GEP->getName()+".offs");
|
||||
continue;
|
||||
}
|
||||
|
||||
Constant *Scale = ConstantInt::get(IntPtrTy, Size);
|
||||
Constant *OC = ConstantExpr::getIntegerCast(OpC, IntPtrTy, true /*SExt*/);
|
||||
Scale = ConstantExpr::getMul(OC, Scale, isInBounds/*NUW*/);
|
||||
// Emit an add instruction.
|
||||
Result = Builder->CreateAdd(Result, Scale, GEP->getName()+".offs");
|
||||
continue;
|
||||
}
|
||||
// Convert to correct type.
|
||||
if (Op->getType() != IntPtrTy)
|
||||
Op = Builder->CreateIntCast(Op, IntPtrTy, true, Op->getName()+".c");
|
||||
if (Size != 1) {
|
||||
// We'll let instcombine(mul) convert this to a shl if possible.
|
||||
Op = Builder->CreateMul(Op, ConstantInt::get(IntPtrTy, Size),
|
||||
GEP->getName()+".idx", isInBounds /*NUW*/);
|
||||
}
|
||||
|
||||
// Emit an add instruction.
|
||||
Result = Builder->CreateAdd(Op, Result, GEP->getName()+".offs");
|
||||
}
|
||||
return Result;
|
||||
}
|
||||
|
||||
///===---------------------------------------------------------------------===//
|
||||
/// Dbg Intrinsic utilities
|
||||
///
|
||||
|
||||
/// Inserts a llvm.dbg.value instrinsic before the stores to an alloca'd value
|
||||
/// that has an associated llvm.dbg.decl intrinsic.
|
||||
bool ConvertDebugDeclareToDebugValue(DbgDeclareInst *DDI,
|
||||
StoreInst *SI, DIBuilder &Builder);
|
||||
|
||||
/// Inserts a llvm.dbg.value instrinsic before the stores to an alloca'd value
|
||||
/// that has an associated llvm.dbg.decl intrinsic.
|
||||
bool ConvertDebugDeclareToDebugValue(DbgDeclareInst *DDI,
|
||||
LoadInst *LI, DIBuilder &Builder);
|
||||
|
||||
/// LowerDbgDeclare - Lowers llvm.dbg.declare intrinsics into appropriate set
|
||||
/// of llvm.dbg.value intrinsics.
|
||||
bool LowerDbgDeclare(Function &F);
|
||||
|
||||
/// FindAllocaDbgDeclare - Finds the llvm.dbg.declare intrinsic corresponding to
|
||||
/// an alloca, if any.
|
||||
DbgDeclareInst *FindAllocaDbgDeclare(Value *V);
|
||||
|
||||
/// replaceDbgDeclareForAlloca - Replaces llvm.dbg.declare instruction when
|
||||
/// alloca is replaced with a new value.
|
||||
bool replaceDbgDeclareForAlloca(AllocaInst *AI, Value *NewAllocaAddress,
|
||||
DIBuilder &Builder);
|
||||
|
||||
/// \brief Remove all blocks that can not be reached from the function's entry.
|
||||
///
|
||||
/// Returns true if any basic block was removed.
|
||||
bool removeUnreachableBlocks(Function &F);
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
33
thirdparty/clang/include/llvm/Transforms/Utils/ModuleUtils.h
vendored
Normal file
33
thirdparty/clang/include/llvm/Transforms/Utils/ModuleUtils.h
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
//===-- ModuleUtils.h - Functions to manipulate Modules ---------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This family of functions perform manipulations on Modules.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_MODULEUTILS_H
|
||||
#define LLVM_TRANSFORMS_UTILS_MODULEUTILS_H
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class Module;
|
||||
class Function;
|
||||
|
||||
/// Append F to the list of global ctors of module M with the given Priority.
|
||||
/// This wraps the function in the appropriate structure and stores it along
|
||||
/// side other global constructors. For details see
|
||||
/// http://llvm.org/docs/LangRef.html#intg_global_ctors
|
||||
void appendToGlobalCtors(Module &M, Function *F, int Priority);
|
||||
|
||||
/// Same as appendToGlobalCtors(), but for global dtors.
|
||||
void appendToGlobalDtors(Module &M, Function *F, int Priority);
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif // LLVM_TRANSFORMS_UTILS_MODULEUTILS_H
|
||||
44
thirdparty/clang/include/llvm/Transforms/Utils/PromoteMemToReg.h
vendored
Normal file
44
thirdparty/clang/include/llvm/Transforms/Utils/PromoteMemToReg.h
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
//===- PromoteMemToReg.h - Promote Allocas to Scalars -----------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file exposes an interface to promote alloca instructions to SSA
|
||||
// registers, by using the SSA construction algorithm.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_PROMOTEMEMTOREG_H
|
||||
#define LLVM_TRANSFORMS_UTILS_PROMOTEMEMTOREG_H
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class AllocaInst;
|
||||
class DominatorTree;
|
||||
class AliasSetTracker;
|
||||
|
||||
/// isAllocaPromotable - Return true if this alloca is legal for promotion.
|
||||
/// This is true if there are only loads and stores to the alloca...
|
||||
///
|
||||
bool isAllocaPromotable(const AllocaInst *AI);
|
||||
|
||||
/// PromoteMemToReg - Promote the specified list of alloca instructions into
|
||||
/// scalar registers, inserting PHI nodes as appropriate. This function makes
|
||||
/// use of DominanceFrontier information. This function does not modify the CFG
|
||||
/// of the function at all. All allocas must be from the same function.
|
||||
///
|
||||
/// If AST is specified, the specified tracker is updated to reflect changes
|
||||
/// made to the IR.
|
||||
///
|
||||
void PromoteMemToReg(const std::vector<AllocaInst*> &Allocas,
|
||||
DominatorTree &DT, AliasSetTracker *AST = 0);
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
167
thirdparty/clang/include/llvm/Transforms/Utils/SSAUpdater.h
vendored
Normal file
167
thirdparty/clang/include/llvm/Transforms/Utils/SSAUpdater.h
vendored
Normal file
@@ -0,0 +1,167 @@
|
||||
//===-- SSAUpdater.h - Unstructured SSA Update Tool -------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file declares the SSAUpdater class.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_SSAUPDATER_H
|
||||
#define LLVM_TRANSFORMS_UTILS_SSAUPDATER_H
|
||||
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/Support/Compiler.h"
|
||||
|
||||
namespace llvm {
|
||||
class BasicBlock;
|
||||
class Instruction;
|
||||
class LoadInst;
|
||||
template<typename T> class SmallVectorImpl;
|
||||
template<typename T> class SSAUpdaterTraits;
|
||||
class PHINode;
|
||||
class Type;
|
||||
class Use;
|
||||
class Value;
|
||||
|
||||
/// SSAUpdater - This class updates SSA form for a set of values defined in
|
||||
/// multiple blocks. This is used when code duplication or another unstructured
|
||||
/// transformation wants to rewrite a set of uses of one value with uses of a
|
||||
/// set of values.
|
||||
class SSAUpdater {
|
||||
friend class SSAUpdaterTraits<SSAUpdater>;
|
||||
|
||||
private:
|
||||
/// AvailableVals - This keeps track of which value to use on a per-block
|
||||
/// basis. When we insert PHI nodes, we keep track of them here.
|
||||
//typedef DenseMap<BasicBlock*, Value*> AvailableValsTy;
|
||||
void *AV;
|
||||
|
||||
/// ProtoType holds the type of the values being rewritten.
|
||||
Type *ProtoType;
|
||||
|
||||
// PHI nodes are given a name based on ProtoName.
|
||||
std::string ProtoName;
|
||||
|
||||
/// InsertedPHIs - If this is non-null, the SSAUpdater adds all PHI nodes that
|
||||
/// it creates to the vector.
|
||||
SmallVectorImpl<PHINode*> *InsertedPHIs;
|
||||
|
||||
public:
|
||||
/// SSAUpdater constructor. If InsertedPHIs is specified, it will be filled
|
||||
/// in with all PHI Nodes created by rewriting.
|
||||
explicit SSAUpdater(SmallVectorImpl<PHINode*> *InsertedPHIs = 0);
|
||||
~SSAUpdater();
|
||||
|
||||
/// Initialize - Reset this object to get ready for a new set of SSA
|
||||
/// updates with type 'Ty'. PHI nodes get a name based on 'Name'.
|
||||
void Initialize(Type *Ty, StringRef Name);
|
||||
|
||||
/// AddAvailableValue - Indicate that a rewritten value is available at the
|
||||
/// end of the specified block with the specified value.
|
||||
void AddAvailableValue(BasicBlock *BB, Value *V);
|
||||
|
||||
/// HasValueForBlock - Return true if the SSAUpdater already has a value for
|
||||
/// the specified block.
|
||||
bool HasValueForBlock(BasicBlock *BB) const;
|
||||
|
||||
/// GetValueAtEndOfBlock - Construct SSA form, materializing a value that is
|
||||
/// live at the end of the specified block.
|
||||
Value *GetValueAtEndOfBlock(BasicBlock *BB);
|
||||
|
||||
/// GetValueInMiddleOfBlock - Construct SSA form, materializing a value that
|
||||
/// is live in the middle of the specified block.
|
||||
///
|
||||
/// GetValueInMiddleOfBlock is the same as GetValueAtEndOfBlock except in one
|
||||
/// important case: if there is a definition of the rewritten value after the
|
||||
/// 'use' in BB. Consider code like this:
|
||||
///
|
||||
/// X1 = ...
|
||||
/// SomeBB:
|
||||
/// use(X)
|
||||
/// X2 = ...
|
||||
/// br Cond, SomeBB, OutBB
|
||||
///
|
||||
/// In this case, there are two values (X1 and X2) added to the AvailableVals
|
||||
/// set by the client of the rewriter, and those values are both live out of
|
||||
/// their respective blocks. However, the use of X happens in the *middle* of
|
||||
/// a block. Because of this, we need to insert a new PHI node in SomeBB to
|
||||
/// merge the appropriate values, and this value isn't live out of the block.
|
||||
///
|
||||
Value *GetValueInMiddleOfBlock(BasicBlock *BB);
|
||||
|
||||
/// RewriteUse - Rewrite a use of the symbolic value. This handles PHI nodes,
|
||||
/// which use their value in the corresponding predecessor. Note that this
|
||||
/// will not work if the use is supposed to be rewritten to a value defined in
|
||||
/// the same block as the use, but above it. Any 'AddAvailableValue's added
|
||||
/// for the use's block will be considered to be below it.
|
||||
void RewriteUse(Use &U);
|
||||
|
||||
/// RewriteUseAfterInsertions - Rewrite a use, just like RewriteUse. However,
|
||||
/// this version of the method can rewrite uses in the same block as a
|
||||
/// definition, because it assumes that all uses of a value are below any
|
||||
/// inserted values.
|
||||
void RewriteUseAfterInsertions(Use &U);
|
||||
|
||||
private:
|
||||
Value *GetValueAtEndOfBlockInternal(BasicBlock *BB);
|
||||
|
||||
void operator=(const SSAUpdater&) LLVM_DELETED_FUNCTION;
|
||||
SSAUpdater(const SSAUpdater&) LLVM_DELETED_FUNCTION;
|
||||
};
|
||||
|
||||
/// LoadAndStorePromoter - This little helper class provides a convenient way to
|
||||
/// promote a collection of loads and stores into SSA Form using the SSAUpdater.
|
||||
/// This handles complexities that SSAUpdater doesn't, such as multiple loads
|
||||
/// and stores in one block.
|
||||
///
|
||||
/// Clients of this class are expected to subclass this and implement the
|
||||
/// virtual methods.
|
||||
///
|
||||
class LoadAndStorePromoter {
|
||||
protected:
|
||||
SSAUpdater &SSA;
|
||||
public:
|
||||
LoadAndStorePromoter(const SmallVectorImpl<Instruction*> &Insts,
|
||||
SSAUpdater &S, StringRef Name = StringRef());
|
||||
virtual ~LoadAndStorePromoter() {}
|
||||
|
||||
/// run - This does the promotion. Insts is a list of loads and stores to
|
||||
/// promote, and Name is the basename for the PHIs to insert. After this is
|
||||
/// complete, the loads and stores are removed from the code.
|
||||
void run(const SmallVectorImpl<Instruction*> &Insts) const;
|
||||
|
||||
|
||||
/// Return true if the specified instruction is in the Inst list (which was
|
||||
/// passed into the run method). Clients should implement this with a more
|
||||
/// efficient version if possible.
|
||||
virtual bool isInstInList(Instruction *I,
|
||||
const SmallVectorImpl<Instruction*> &Insts) const;
|
||||
|
||||
/// doExtraRewritesBeforeFinalDeletion - This hook is invoked after all the
|
||||
/// stores are found and inserted as available values, but
|
||||
virtual void doExtraRewritesBeforeFinalDeletion() const {
|
||||
}
|
||||
|
||||
/// replaceLoadWithValue - Clients can choose to implement this to get
|
||||
/// notified right before a load is RAUW'd another value.
|
||||
virtual void replaceLoadWithValue(LoadInst *LI, Value *V) const {
|
||||
}
|
||||
|
||||
/// This is called before each instruction is deleted.
|
||||
virtual void instructionDeleted(Instruction *I) const {
|
||||
}
|
||||
|
||||
/// updateDebugInfo - This is called to update debug info associated with the
|
||||
/// instruction.
|
||||
virtual void updateDebugInfo(Instruction *I) const {
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
456
thirdparty/clang/include/llvm/Transforms/Utils/SSAUpdaterImpl.h
vendored
Normal file
456
thirdparty/clang/include/llvm/Transforms/Utils/SSAUpdaterImpl.h
vendored
Normal file
@@ -0,0 +1,456 @@
|
||||
//===-- SSAUpdaterImpl.h - SSA Updater Implementation -----------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file provides a template that implements the core algorithm for the
|
||||
// SSAUpdater and MachineSSAUpdater.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_SSAUPDATERIMPL_H
|
||||
#define LLVM_TRANSFORMS_UTILS_SSAUPDATERIMPL_H
|
||||
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/Support/Allocator.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ValueHandle.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class CastInst;
|
||||
class PHINode;
|
||||
template<typename T> class SSAUpdaterTraits;
|
||||
|
||||
template<typename UpdaterT>
|
||||
class SSAUpdaterImpl {
|
||||
private:
|
||||
UpdaterT *Updater;
|
||||
|
||||
typedef SSAUpdaterTraits<UpdaterT> Traits;
|
||||
typedef typename Traits::BlkT BlkT;
|
||||
typedef typename Traits::ValT ValT;
|
||||
typedef typename Traits::PhiT PhiT;
|
||||
|
||||
/// BBInfo - Per-basic block information used internally by SSAUpdaterImpl.
|
||||
/// The predecessors of each block are cached here since pred_iterator is
|
||||
/// slow and we need to iterate over the blocks at least a few times.
|
||||
class BBInfo {
|
||||
public:
|
||||
BlkT *BB; // Back-pointer to the corresponding block.
|
||||
ValT AvailableVal; // Value to use in this block.
|
||||
BBInfo *DefBB; // Block that defines the available value.
|
||||
int BlkNum; // Postorder number.
|
||||
BBInfo *IDom; // Immediate dominator.
|
||||
unsigned NumPreds; // Number of predecessor blocks.
|
||||
BBInfo **Preds; // Array[NumPreds] of predecessor blocks.
|
||||
PhiT *PHITag; // Marker for existing PHIs that match.
|
||||
|
||||
BBInfo(BlkT *ThisBB, ValT V)
|
||||
: BB(ThisBB), AvailableVal(V), DefBB(V ? this : 0), BlkNum(0), IDom(0),
|
||||
NumPreds(0), Preds(0), PHITag(0) { }
|
||||
};
|
||||
|
||||
typedef DenseMap<BlkT*, ValT> AvailableValsTy;
|
||||
AvailableValsTy *AvailableVals;
|
||||
|
||||
SmallVectorImpl<PhiT*> *InsertedPHIs;
|
||||
|
||||
typedef SmallVectorImpl<BBInfo*> BlockListTy;
|
||||
typedef DenseMap<BlkT*, BBInfo*> BBMapTy;
|
||||
BBMapTy BBMap;
|
||||
BumpPtrAllocator Allocator;
|
||||
|
||||
public:
|
||||
explicit SSAUpdaterImpl(UpdaterT *U, AvailableValsTy *A,
|
||||
SmallVectorImpl<PhiT*> *Ins) :
|
||||
Updater(U), AvailableVals(A), InsertedPHIs(Ins) { }
|
||||
|
||||
/// GetValue - Check to see if AvailableVals has an entry for the specified
|
||||
/// BB and if so, return it. If not, construct SSA form by first
|
||||
/// calculating the required placement of PHIs and then inserting new PHIs
|
||||
/// where needed.
|
||||
ValT GetValue(BlkT *BB) {
|
||||
SmallVector<BBInfo*, 100> BlockList;
|
||||
BBInfo *PseudoEntry = BuildBlockList(BB, &BlockList);
|
||||
|
||||
// Special case: bail out if BB is unreachable.
|
||||
if (BlockList.size() == 0) {
|
||||
ValT V = Traits::GetUndefVal(BB, Updater);
|
||||
(*AvailableVals)[BB] = V;
|
||||
return V;
|
||||
}
|
||||
|
||||
FindDominators(&BlockList, PseudoEntry);
|
||||
FindPHIPlacement(&BlockList);
|
||||
FindAvailableVals(&BlockList);
|
||||
|
||||
return BBMap[BB]->DefBB->AvailableVal;
|
||||
}
|
||||
|
||||
/// BuildBlockList - Starting from the specified basic block, traverse back
|
||||
/// through its predecessors until reaching blocks with known values.
|
||||
/// Create BBInfo structures for the blocks and append them to the block
|
||||
/// list.
|
||||
BBInfo *BuildBlockList(BlkT *BB, BlockListTy *BlockList) {
|
||||
SmallVector<BBInfo*, 10> RootList;
|
||||
SmallVector<BBInfo*, 64> WorkList;
|
||||
|
||||
BBInfo *Info = new (Allocator) BBInfo(BB, 0);
|
||||
BBMap[BB] = Info;
|
||||
WorkList.push_back(Info);
|
||||
|
||||
// Search backward from BB, creating BBInfos along the way and stopping
|
||||
// when reaching blocks that define the value. Record those defining
|
||||
// blocks on the RootList.
|
||||
SmallVector<BlkT*, 10> Preds;
|
||||
while (!WorkList.empty()) {
|
||||
Info = WorkList.pop_back_val();
|
||||
Preds.clear();
|
||||
Traits::FindPredecessorBlocks(Info->BB, &Preds);
|
||||
Info->NumPreds = Preds.size();
|
||||
if (Info->NumPreds == 0)
|
||||
Info->Preds = 0;
|
||||
else
|
||||
Info->Preds = static_cast<BBInfo**>
|
||||
(Allocator.Allocate(Info->NumPreds * sizeof(BBInfo*),
|
||||
AlignOf<BBInfo*>::Alignment));
|
||||
|
||||
for (unsigned p = 0; p != Info->NumPreds; ++p) {
|
||||
BlkT *Pred = Preds[p];
|
||||
// Check if BBMap already has a BBInfo for the predecessor block.
|
||||
typename BBMapTy::value_type &BBMapBucket =
|
||||
BBMap.FindAndConstruct(Pred);
|
||||
if (BBMapBucket.second) {
|
||||
Info->Preds[p] = BBMapBucket.second;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Create a new BBInfo for the predecessor.
|
||||
ValT PredVal = AvailableVals->lookup(Pred);
|
||||
BBInfo *PredInfo = new (Allocator) BBInfo(Pred, PredVal);
|
||||
BBMapBucket.second = PredInfo;
|
||||
Info->Preds[p] = PredInfo;
|
||||
|
||||
if (PredInfo->AvailableVal) {
|
||||
RootList.push_back(PredInfo);
|
||||
continue;
|
||||
}
|
||||
WorkList.push_back(PredInfo);
|
||||
}
|
||||
}
|
||||
|
||||
// Now that we know what blocks are backwards-reachable from the starting
|
||||
// block, do a forward depth-first traversal to assign postorder numbers
|
||||
// to those blocks.
|
||||
BBInfo *PseudoEntry = new (Allocator) BBInfo(0, 0);
|
||||
unsigned BlkNum = 1;
|
||||
|
||||
// Initialize the worklist with the roots from the backward traversal.
|
||||
while (!RootList.empty()) {
|
||||
Info = RootList.pop_back_val();
|
||||
Info->IDom = PseudoEntry;
|
||||
Info->BlkNum = -1;
|
||||
WorkList.push_back(Info);
|
||||
}
|
||||
|
||||
while (!WorkList.empty()) {
|
||||
Info = WorkList.back();
|
||||
|
||||
if (Info->BlkNum == -2) {
|
||||
// All the successors have been handled; assign the postorder number.
|
||||
Info->BlkNum = BlkNum++;
|
||||
// If not a root, put it on the BlockList.
|
||||
if (!Info->AvailableVal)
|
||||
BlockList->push_back(Info);
|
||||
WorkList.pop_back();
|
||||
continue;
|
||||
}
|
||||
|
||||
// Leave this entry on the worklist, but set its BlkNum to mark that its
|
||||
// successors have been put on the worklist. When it returns to the top
|
||||
// the list, after handling its successors, it will be assigned a
|
||||
// number.
|
||||
Info->BlkNum = -2;
|
||||
|
||||
// Add unvisited successors to the work list.
|
||||
for (typename Traits::BlkSucc_iterator SI =
|
||||
Traits::BlkSucc_begin(Info->BB),
|
||||
E = Traits::BlkSucc_end(Info->BB); SI != E; ++SI) {
|
||||
BBInfo *SuccInfo = BBMap[*SI];
|
||||
if (!SuccInfo || SuccInfo->BlkNum)
|
||||
continue;
|
||||
SuccInfo->BlkNum = -1;
|
||||
WorkList.push_back(SuccInfo);
|
||||
}
|
||||
}
|
||||
PseudoEntry->BlkNum = BlkNum;
|
||||
return PseudoEntry;
|
||||
}
|
||||
|
||||
/// IntersectDominators - This is the dataflow lattice "meet" operation for
|
||||
/// finding dominators. Given two basic blocks, it walks up the dominator
|
||||
/// tree until it finds a common dominator of both. It uses the postorder
|
||||
/// number of the blocks to determine how to do that.
|
||||
BBInfo *IntersectDominators(BBInfo *Blk1, BBInfo *Blk2) {
|
||||
while (Blk1 != Blk2) {
|
||||
while (Blk1->BlkNum < Blk2->BlkNum) {
|
||||
Blk1 = Blk1->IDom;
|
||||
if (!Blk1)
|
||||
return Blk2;
|
||||
}
|
||||
while (Blk2->BlkNum < Blk1->BlkNum) {
|
||||
Blk2 = Blk2->IDom;
|
||||
if (!Blk2)
|
||||
return Blk1;
|
||||
}
|
||||
}
|
||||
return Blk1;
|
||||
}
|
||||
|
||||
/// FindDominators - Calculate the dominator tree for the subset of the CFG
|
||||
/// corresponding to the basic blocks on the BlockList. This uses the
|
||||
/// algorithm from: "A Simple, Fast Dominance Algorithm" by Cooper, Harvey
|
||||
/// and Kennedy, published in Software--Practice and Experience, 2001,
|
||||
/// 4:1-10. Because the CFG subset does not include any edges leading into
|
||||
/// blocks that define the value, the results are not the usual dominator
|
||||
/// tree. The CFG subset has a single pseudo-entry node with edges to a set
|
||||
/// of root nodes for blocks that define the value. The dominators for this
|
||||
/// subset CFG are not the standard dominators but they are adequate for
|
||||
/// placing PHIs within the subset CFG.
|
||||
void FindDominators(BlockListTy *BlockList, BBInfo *PseudoEntry) {
|
||||
bool Changed;
|
||||
do {
|
||||
Changed = false;
|
||||
// Iterate over the list in reverse order, i.e., forward on CFG edges.
|
||||
for (typename BlockListTy::reverse_iterator I = BlockList->rbegin(),
|
||||
E = BlockList->rend(); I != E; ++I) {
|
||||
BBInfo *Info = *I;
|
||||
BBInfo *NewIDom = 0;
|
||||
|
||||
// Iterate through the block's predecessors.
|
||||
for (unsigned p = 0; p != Info->NumPreds; ++p) {
|
||||
BBInfo *Pred = Info->Preds[p];
|
||||
|
||||
// Treat an unreachable predecessor as a definition with 'undef'.
|
||||
if (Pred->BlkNum == 0) {
|
||||
Pred->AvailableVal = Traits::GetUndefVal(Pred->BB, Updater);
|
||||
(*AvailableVals)[Pred->BB] = Pred->AvailableVal;
|
||||
Pred->DefBB = Pred;
|
||||
Pred->BlkNum = PseudoEntry->BlkNum;
|
||||
PseudoEntry->BlkNum++;
|
||||
}
|
||||
|
||||
if (!NewIDom)
|
||||
NewIDom = Pred;
|
||||
else
|
||||
NewIDom = IntersectDominators(NewIDom, Pred);
|
||||
}
|
||||
|
||||
// Check if the IDom value has changed.
|
||||
if (NewIDom && NewIDom != Info->IDom) {
|
||||
Info->IDom = NewIDom;
|
||||
Changed = true;
|
||||
}
|
||||
}
|
||||
} while (Changed);
|
||||
}
|
||||
|
||||
/// IsDefInDomFrontier - Search up the dominator tree from Pred to IDom for
|
||||
/// any blocks containing definitions of the value. If one is found, then
|
||||
/// the successor of Pred is in the dominance frontier for the definition,
|
||||
/// and this function returns true.
|
||||
bool IsDefInDomFrontier(const BBInfo *Pred, const BBInfo *IDom) {
|
||||
for (; Pred != IDom; Pred = Pred->IDom) {
|
||||
if (Pred->DefBB == Pred)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// FindPHIPlacement - PHIs are needed in the iterated dominance frontiers
|
||||
/// of the known definitions. Iteratively add PHIs in the dom frontiers
|
||||
/// until nothing changes. Along the way, keep track of the nearest
|
||||
/// dominating definitions for non-PHI blocks.
|
||||
void FindPHIPlacement(BlockListTy *BlockList) {
|
||||
bool Changed;
|
||||
do {
|
||||
Changed = false;
|
||||
// Iterate over the list in reverse order, i.e., forward on CFG edges.
|
||||
for (typename BlockListTy::reverse_iterator I = BlockList->rbegin(),
|
||||
E = BlockList->rend(); I != E; ++I) {
|
||||
BBInfo *Info = *I;
|
||||
|
||||
// If this block already needs a PHI, there is nothing to do here.
|
||||
if (Info->DefBB == Info)
|
||||
continue;
|
||||
|
||||
// Default to use the same def as the immediate dominator.
|
||||
BBInfo *NewDefBB = Info->IDom->DefBB;
|
||||
for (unsigned p = 0; p != Info->NumPreds; ++p) {
|
||||
if (IsDefInDomFrontier(Info->Preds[p], Info->IDom)) {
|
||||
// Need a PHI here.
|
||||
NewDefBB = Info;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if anything changed.
|
||||
if (NewDefBB != Info->DefBB) {
|
||||
Info->DefBB = NewDefBB;
|
||||
Changed = true;
|
||||
}
|
||||
}
|
||||
} while (Changed);
|
||||
}
|
||||
|
||||
/// FindAvailableVal - If this block requires a PHI, first check if an
|
||||
/// existing PHI matches the PHI placement and reaching definitions computed
|
||||
/// earlier, and if not, create a new PHI. Visit all the block's
|
||||
/// predecessors to calculate the available value for each one and fill in
|
||||
/// the incoming values for a new PHI.
|
||||
void FindAvailableVals(BlockListTy *BlockList) {
|
||||
// Go through the worklist in forward order (i.e., backward through the CFG)
|
||||
// and check if existing PHIs can be used. If not, create empty PHIs where
|
||||
// they are needed.
|
||||
for (typename BlockListTy::iterator I = BlockList->begin(),
|
||||
E = BlockList->end(); I != E; ++I) {
|
||||
BBInfo *Info = *I;
|
||||
// Check if there needs to be a PHI in BB.
|
||||
if (Info->DefBB != Info)
|
||||
continue;
|
||||
|
||||
// Look for an existing PHI.
|
||||
FindExistingPHI(Info->BB, BlockList);
|
||||
if (Info->AvailableVal)
|
||||
continue;
|
||||
|
||||
ValT PHI = Traits::CreateEmptyPHI(Info->BB, Info->NumPreds, Updater);
|
||||
Info->AvailableVal = PHI;
|
||||
(*AvailableVals)[Info->BB] = PHI;
|
||||
}
|
||||
|
||||
// Now go back through the worklist in reverse order to fill in the
|
||||
// arguments for any new PHIs added in the forward traversal.
|
||||
for (typename BlockListTy::reverse_iterator I = BlockList->rbegin(),
|
||||
E = BlockList->rend(); I != E; ++I) {
|
||||
BBInfo *Info = *I;
|
||||
|
||||
if (Info->DefBB != Info) {
|
||||
// Record the available value at join nodes to speed up subsequent
|
||||
// uses of this SSAUpdater for the same value.
|
||||
if (Info->NumPreds > 1)
|
||||
(*AvailableVals)[Info->BB] = Info->DefBB->AvailableVal;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check if this block contains a newly added PHI.
|
||||
PhiT *PHI = Traits::ValueIsNewPHI(Info->AvailableVal, Updater);
|
||||
if (!PHI)
|
||||
continue;
|
||||
|
||||
// Iterate through the block's predecessors.
|
||||
for (unsigned p = 0; p != Info->NumPreds; ++p) {
|
||||
BBInfo *PredInfo = Info->Preds[p];
|
||||
BlkT *Pred = PredInfo->BB;
|
||||
// Skip to the nearest preceding definition.
|
||||
if (PredInfo->DefBB != PredInfo)
|
||||
PredInfo = PredInfo->DefBB;
|
||||
Traits::AddPHIOperand(PHI, PredInfo->AvailableVal, Pred);
|
||||
}
|
||||
|
||||
DEBUG(dbgs() << " Inserted PHI: " << *PHI << "\n");
|
||||
|
||||
// If the client wants to know about all new instructions, tell it.
|
||||
if (InsertedPHIs) InsertedPHIs->push_back(PHI);
|
||||
}
|
||||
}
|
||||
|
||||
/// FindExistingPHI - Look through the PHI nodes in a block to see if any of
|
||||
/// them match what is needed.
|
||||
void FindExistingPHI(BlkT *BB, BlockListTy *BlockList) {
|
||||
for (typename BlkT::iterator BBI = BB->begin(), BBE = BB->end();
|
||||
BBI != BBE; ++BBI) {
|
||||
PhiT *SomePHI = Traits::InstrIsPHI(BBI);
|
||||
if (!SomePHI)
|
||||
break;
|
||||
if (CheckIfPHIMatches(SomePHI)) {
|
||||
RecordMatchingPHIs(BlockList);
|
||||
break;
|
||||
}
|
||||
// Match failed: clear all the PHITag values.
|
||||
for (typename BlockListTy::iterator I = BlockList->begin(),
|
||||
E = BlockList->end(); I != E; ++I)
|
||||
(*I)->PHITag = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/// CheckIfPHIMatches - Check if a PHI node matches the placement and values
|
||||
/// in the BBMap.
|
||||
bool CheckIfPHIMatches(PhiT *PHI) {
|
||||
SmallVector<PhiT*, 20> WorkList;
|
||||
WorkList.push_back(PHI);
|
||||
|
||||
// Mark that the block containing this PHI has been visited.
|
||||
BBMap[PHI->getParent()]->PHITag = PHI;
|
||||
|
||||
while (!WorkList.empty()) {
|
||||
PHI = WorkList.pop_back_val();
|
||||
|
||||
// Iterate through the PHI's incoming values.
|
||||
for (typename Traits::PHI_iterator I = Traits::PHI_begin(PHI),
|
||||
E = Traits::PHI_end(PHI); I != E; ++I) {
|
||||
ValT IncomingVal = I.getIncomingValue();
|
||||
BBInfo *PredInfo = BBMap[I.getIncomingBlock()];
|
||||
// Skip to the nearest preceding definition.
|
||||
if (PredInfo->DefBB != PredInfo)
|
||||
PredInfo = PredInfo->DefBB;
|
||||
|
||||
// Check if it matches the expected value.
|
||||
if (PredInfo->AvailableVal) {
|
||||
if (IncomingVal == PredInfo->AvailableVal)
|
||||
continue;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if the value is a PHI in the correct block.
|
||||
PhiT *IncomingPHIVal = Traits::ValueIsPHI(IncomingVal, Updater);
|
||||
if (!IncomingPHIVal || IncomingPHIVal->getParent() != PredInfo->BB)
|
||||
return false;
|
||||
|
||||
// If this block has already been visited, check if this PHI matches.
|
||||
if (PredInfo->PHITag) {
|
||||
if (IncomingPHIVal == PredInfo->PHITag)
|
||||
continue;
|
||||
return false;
|
||||
}
|
||||
PredInfo->PHITag = IncomingPHIVal;
|
||||
|
||||
WorkList.push_back(IncomingPHIVal);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// RecordMatchingPHIs - For each PHI node that matches, record it in both
|
||||
/// the BBMap and the AvailableVals mapping.
|
||||
void RecordMatchingPHIs(BlockListTy *BlockList) {
|
||||
for (typename BlockListTy::iterator I = BlockList->begin(),
|
||||
E = BlockList->end(); I != E; ++I)
|
||||
if (PhiT *PHI = (*I)->PHITag) {
|
||||
BlkT *BB = PHI->getParent();
|
||||
ValT PHIVal = Traits::GetPHIValue(PHI);
|
||||
(*AvailableVals)[BB] = PHIVal;
|
||||
BBMap[BB]->AvailableVal = PHIVal;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
52
thirdparty/clang/include/llvm/Transforms/Utils/SimplifyIndVar.h
vendored
Normal file
52
thirdparty/clang/include/llvm/Transforms/Utils/SimplifyIndVar.h
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
//===-- llvm/Transforms/Utils/SimplifyIndVar.h - Indvar Utils ---*- 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 in interface for induction variable simplification. It does
|
||||
// not define any actual pass or policy, but provides a single function to
|
||||
// simplify a loop's induction variables based on ScalarEvolution.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_SIMPLIFYINDVAR_H
|
||||
#define LLVM_TRANSFORMS_UTILS_SIMPLIFYINDVAR_H
|
||||
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/ValueHandle.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class CastInst;
|
||||
class IVUsers;
|
||||
class Loop;
|
||||
class LPPassManager;
|
||||
class PHINode;
|
||||
class ScalarEvolution;
|
||||
|
||||
/// Interface for visiting interesting IV users that are recognized but not
|
||||
/// simplified by this utility.
|
||||
class IVVisitor {
|
||||
virtual void anchor();
|
||||
public:
|
||||
virtual ~IVVisitor() {}
|
||||
virtual void visitCast(CastInst *Cast) = 0;
|
||||
};
|
||||
|
||||
/// simplifyUsersOfIV - Simplify instructions that use this induction variable
|
||||
/// by using ScalarEvolution to analyze the IV's recurrence.
|
||||
bool simplifyUsersOfIV(PHINode *CurrIV, ScalarEvolution *SE, LPPassManager *LPM,
|
||||
SmallVectorImpl<WeakVH> &Dead, IVVisitor *V = NULL);
|
||||
|
||||
/// SimplifyLoopIVs - Simplify users of induction variables within this
|
||||
/// loop. This does not actually change or add IVs.
|
||||
bool simplifyLoopIVs(Loop *L, ScalarEvolution *SE, LPPassManager *LPM,
|
||||
SmallVectorImpl<WeakVH> &Dead);
|
||||
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
53
thirdparty/clang/include/llvm/Transforms/Utils/SimplifyLibCalls.h
vendored
Normal file
53
thirdparty/clang/include/llvm/Transforms/Utils/SimplifyLibCalls.h
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
//===- SimplifyLibCalls.h - Library call simplifier -------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file exposes an interface to build some C language libcalls for
|
||||
// optimization passes that need to call the various functions.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_SIMPLIFYLIBCALLS_H
|
||||
#define LLVM_TRANSFORMS_UTILS_SIMPLIFYLIBCALLS_H
|
||||
|
||||
namespace llvm {
|
||||
class Value;
|
||||
class CallInst;
|
||||
class DataLayout;
|
||||
class Instruction;
|
||||
class TargetLibraryInfo;
|
||||
class LibCallSimplifierImpl;
|
||||
|
||||
/// LibCallSimplifier - This class implements a collection of optimizations
|
||||
/// that replace well formed calls to library functions with a more optimal
|
||||
/// form. For example, replacing 'printf("Hello!")' with 'puts("Hello!")'.
|
||||
class LibCallSimplifier {
|
||||
/// Impl - A pointer to the actual implementation of the library call
|
||||
/// simplifier.
|
||||
LibCallSimplifierImpl *Impl;
|
||||
public:
|
||||
LibCallSimplifier(const DataLayout *TD, const TargetLibraryInfo *TLI,
|
||||
bool UnsafeFPShrink);
|
||||
virtual ~LibCallSimplifier();
|
||||
|
||||
/// optimizeCall - Take the given call instruction and return a more
|
||||
/// optimal value to replace the instruction with or 0 if a more
|
||||
/// optimal form can't be found. Note that the returned value may
|
||||
/// be equal to the instruction being optimized. In this case all
|
||||
/// other instructions that use the given instruction were modified
|
||||
/// and the given instruction is dead.
|
||||
Value *optimizeCall(CallInst *CI);
|
||||
|
||||
/// replaceAllUsesWith - This method is used when the library call
|
||||
/// simplifier needs to replace instructions other than the library
|
||||
/// call being modified.
|
||||
virtual void replaceAllUsesWith(Instruction *I, Value *With) const;
|
||||
};
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
51
thirdparty/clang/include/llvm/Transforms/Utils/UnifyFunctionExitNodes.h
vendored
Normal file
51
thirdparty/clang/include/llvm/Transforms/Utils/UnifyFunctionExitNodes.h
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
//===-- UnifyFunctionExitNodes.h - Ensure fn's have one return --*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This pass is used to ensure that functions have at most one return and one
|
||||
// unwind instruction in them. Additionally, it keeps track of which node is
|
||||
// the new exit node of the CFG. If there are no return or unwind instructions
|
||||
// in the function, the getReturnBlock/getUnwindBlock methods will return a null
|
||||
// pointer.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UNIFYFUNCTIONEXITNODES_H
|
||||
#define LLVM_TRANSFORMS_UNIFYFUNCTIONEXITNODES_H
|
||||
|
||||
#include "llvm/Pass.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
struct UnifyFunctionExitNodes : public FunctionPass {
|
||||
BasicBlock *ReturnBlock, *UnwindBlock, *UnreachableBlock;
|
||||
public:
|
||||
static char ID; // Pass identification, replacement for typeid
|
||||
UnifyFunctionExitNodes() : FunctionPass(ID),
|
||||
ReturnBlock(0), UnwindBlock(0) {
|
||||
initializeUnifyFunctionExitNodesPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
// We can preserve non-critical-edgeness when we unify function exit nodes
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const;
|
||||
|
||||
// getReturn|Unwind|UnreachableBlock - Return the new single (or nonexistant)
|
||||
// return, unwind, or unreachable basic blocks in the CFG.
|
||||
//
|
||||
BasicBlock *getReturnBlock() const { return ReturnBlock; }
|
||||
BasicBlock *getUnwindBlock() const { return UnwindBlock; }
|
||||
BasicBlock *getUnreachableBlock() const { return UnreachableBlock; }
|
||||
|
||||
virtual bool runOnFunction(Function &F);
|
||||
};
|
||||
|
||||
Pass *createUnifyFunctionExitNodesPass();
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
33
thirdparty/clang/include/llvm/Transforms/Utils/UnrollLoop.h
vendored
Normal file
33
thirdparty/clang/include/llvm/Transforms/Utils/UnrollLoop.h
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
//===- llvm/Transforms/Utils/UnrollLoop.h - Unrolling utilities -*- 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 some loop unrolling utilities. It does not define any
|
||||
// actual pass or policy, but provides a single function to perform loop
|
||||
// unrolling.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_UNROLLLOOP_H
|
||||
#define LLVM_TRANSFORMS_UTILS_UNROLLLOOP_H
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class Loop;
|
||||
class LoopInfo;
|
||||
class LPPassManager;
|
||||
|
||||
bool UnrollLoop(Loop *L, unsigned Count, unsigned TripCount, bool AllowRuntime,
|
||||
unsigned TripMultiple, LoopInfo* LI, LPPassManager* LPM);
|
||||
|
||||
bool UnrollRuntimeLoopProlog(Loop *L, unsigned Count, LoopInfo *LI,
|
||||
LPPassManager* LPM);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
80
thirdparty/clang/include/llvm/Transforms/Utils/ValueMapper.h
vendored
Normal file
80
thirdparty/clang/include/llvm/Transforms/Utils/ValueMapper.h
vendored
Normal file
@@ -0,0 +1,80 @@
|
||||
//===- ValueMapper.h - Remapping for constants and metadata -----*- 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 MapValue interface which is used by various parts of
|
||||
// the Transforms/Utils library to implement cloning and linking facilities.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_VALUEMAPPER_H
|
||||
#define LLVM_TRANSFORMS_UTILS_VALUEMAPPER_H
|
||||
|
||||
#include "llvm/ADT/ValueMap.h"
|
||||
|
||||
namespace llvm {
|
||||
class Value;
|
||||
class Instruction;
|
||||
typedef ValueMap<const Value *, WeakVH> ValueToValueMapTy;
|
||||
|
||||
/// ValueMapTypeRemapper - This is a class that can be implemented by clients
|
||||
/// to remap types when cloning constants and instructions.
|
||||
class ValueMapTypeRemapper {
|
||||
virtual void anchor(); // Out of line method.
|
||||
public:
|
||||
virtual ~ValueMapTypeRemapper() {}
|
||||
|
||||
/// remapType - The client should implement this method if they want to
|
||||
/// remap types while mapping values.
|
||||
virtual Type *remapType(Type *SrcTy) = 0;
|
||||
};
|
||||
|
||||
/// RemapFlags - These are flags that the value mapping APIs allow.
|
||||
enum RemapFlags {
|
||||
RF_None = 0,
|
||||
|
||||
/// RF_NoModuleLevelChanges - If this flag is set, the remapper knows that
|
||||
/// only local values within a function (such as an instruction or argument)
|
||||
/// are mapped, not global values like functions and global metadata.
|
||||
RF_NoModuleLevelChanges = 1,
|
||||
|
||||
/// RF_IgnoreMissingEntries - If this flag is set, the remapper ignores
|
||||
/// entries that are not in the value map. If it is unset, it aborts if an
|
||||
/// operand is asked to be remapped which doesn't exist in the mapping.
|
||||
RF_IgnoreMissingEntries = 2
|
||||
};
|
||||
|
||||
static inline RemapFlags operator|(RemapFlags LHS, RemapFlags RHS) {
|
||||
return RemapFlags(unsigned(LHS)|unsigned(RHS));
|
||||
}
|
||||
|
||||
Value *MapValue(const Value *V, ValueToValueMapTy &VM,
|
||||
RemapFlags Flags = RF_None,
|
||||
ValueMapTypeRemapper *TypeMapper = 0);
|
||||
|
||||
void RemapInstruction(Instruction *I, ValueToValueMapTy &VM,
|
||||
RemapFlags Flags = RF_None,
|
||||
ValueMapTypeRemapper *TypeMapper = 0);
|
||||
|
||||
/// MapValue - provide versions that preserve type safety for MDNode and
|
||||
/// Constants.
|
||||
inline MDNode *MapValue(const MDNode *V, ValueToValueMapTy &VM,
|
||||
RemapFlags Flags = RF_None,
|
||||
ValueMapTypeRemapper *TypeMapper = 0) {
|
||||
return cast<MDNode>(MapValue((const Value*)V, VM, Flags, TypeMapper));
|
||||
}
|
||||
inline Constant *MapValue(const Constant *V, ValueToValueMapTy &VM,
|
||||
RemapFlags Flags = RF_None,
|
||||
ValueMapTypeRemapper *TypeMapper = 0) {
|
||||
return cast<Constant>(MapValue((const Value*)V, VM, Flags, TypeMapper));
|
||||
}
|
||||
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
140
thirdparty/clang/include/llvm/Transforms/Vectorize.h
vendored
Normal file
140
thirdparty/clang/include/llvm/Transforms/Vectorize.h
vendored
Normal file
@@ -0,0 +1,140 @@
|
||||
//===-- Vectorize.h - Vectorization Transformations -------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This header file defines prototypes for accessor functions that expose passes
|
||||
// in the Vectorize transformations library.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_VECTORIZE_H
|
||||
#define LLVM_TRANSFORMS_VECTORIZE_H
|
||||
|
||||
namespace llvm {
|
||||
class BasicBlock;
|
||||
class BasicBlockPass;
|
||||
class Pass;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// @brief Vectorize configuration.
|
||||
struct VectorizeConfig {
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Target architecture related parameters
|
||||
|
||||
/// @brief The size of the native vector registers.
|
||||
unsigned VectorBits;
|
||||
|
||||
/// @brief Vectorize boolean values.
|
||||
bool VectorizeBools;
|
||||
|
||||
/// @brief Vectorize integer values.
|
||||
bool VectorizeInts;
|
||||
|
||||
/// @brief Vectorize floating-point values.
|
||||
bool VectorizeFloats;
|
||||
|
||||
/// @brief Vectorize pointer values.
|
||||
bool VectorizePointers;
|
||||
|
||||
/// @brief Vectorize casting (conversion) operations.
|
||||
bool VectorizeCasts;
|
||||
|
||||
/// @brief Vectorize floating-point math intrinsics.
|
||||
bool VectorizeMath;
|
||||
|
||||
/// @brief Vectorize the fused-multiply-add intrinsic.
|
||||
bool VectorizeFMA;
|
||||
|
||||
/// @brief Vectorize select instructions.
|
||||
bool VectorizeSelect;
|
||||
|
||||
/// @brief Vectorize comparison instructions.
|
||||
bool VectorizeCmp;
|
||||
|
||||
/// @brief Vectorize getelementptr instructions.
|
||||
bool VectorizeGEP;
|
||||
|
||||
/// @brief Vectorize loads and stores.
|
||||
bool VectorizeMemOps;
|
||||
|
||||
/// @brief Only generate aligned loads and stores.
|
||||
bool AlignedOnly;
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Misc parameters
|
||||
|
||||
/// @brief The required chain depth for vectorization.
|
||||
unsigned ReqChainDepth;
|
||||
|
||||
/// @brief The maximum search distance for instruction pairs.
|
||||
unsigned SearchLimit;
|
||||
|
||||
/// @brief The maximum number of candidate pairs with which to use a full
|
||||
/// cycle check.
|
||||
unsigned MaxCandPairsForCycleCheck;
|
||||
|
||||
/// @brief Replicating one element to a pair breaks the chain.
|
||||
bool SplatBreaksChain;
|
||||
|
||||
/// @brief The maximum number of pairable instructions per group.
|
||||
unsigned MaxInsts;
|
||||
|
||||
/// @brief The maximum number of candidate instruction pairs per group.
|
||||
unsigned MaxPairs;
|
||||
|
||||
/// @brief The maximum number of pairing iterations.
|
||||
unsigned MaxIter;
|
||||
|
||||
/// @brief Don't try to form odd-length vectors.
|
||||
bool Pow2LenOnly;
|
||||
|
||||
/// @brief Don't boost the chain-depth contribution of loads and stores.
|
||||
bool NoMemOpBoost;
|
||||
|
||||
/// @brief Use a fast instruction dependency analysis.
|
||||
bool FastDep;
|
||||
|
||||
/// @brief Initialize the VectorizeConfig from command line options.
|
||||
VectorizeConfig();
|
||||
};
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// BBVectorize - A basic-block vectorization pass.
|
||||
//
|
||||
BasicBlockPass *
|
||||
createBBVectorizePass(const VectorizeConfig &C = VectorizeConfig());
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// LoopVectorize - Create a loop vectorization pass.
|
||||
//
|
||||
Pass *createLoopVectorizePass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// SLPVectorizer - Create a bottom-up SLP vectorizer pass.
|
||||
//
|
||||
Pass *createSLPVectorizerPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// @brief Vectorize the BasicBlock.
|
||||
///
|
||||
/// @param BB The BasicBlock to be vectorized
|
||||
/// @param P The current running pass, should require AliasAnalysis and
|
||||
/// ScalarEvolution. After the vectorization, AliasAnalysis,
|
||||
/// ScalarEvolution and CFG are preserved.
|
||||
///
|
||||
/// @return True if the BB is changed, false otherwise.
|
||||
///
|
||||
bool vectorizeBasicBlock(Pass *P, BasicBlock &BB,
|
||||
const VectorizeConfig &C = VectorizeConfig());
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user