[llvm-commits] [llvm] r165665 - in /llvm/trunk: include/llvm/ include/llvm/Analysis/ include/llvm/CodeGen/ include/llvm/Target/ include/llvm/Transforms/ lib/Analysis/ lib/CodeGen/ lib/Target/ lib/Target/ARM/ lib/Target/CellSPU/ lib/Target/Hexagon
Nadav Rotem
nrotem at apple.com
Wed Oct 10 15:45:22 PDT 2012
Thanks David! I actually forgot to put the 'getters' for these members. Will a fix once the tests pass.
On Oct 10, 2012, at 3:40 PM, David Blaikie <dblaikie at gmail.com> wrote:
> On Wed, Oct 10, 2012 at 3:04 PM, Nadav Rotem <nrotem at apple.com> wrote:
>> Author: nadav
>> Date: Wed Oct 10 17:04:55 2012
>> New Revision: 165665
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=165665&view=rev
>> Log:
>>
>> Add a new interface to allow IR-level passes to access codegen-specific information.
>>
>>
>> Added:
>> llvm/trunk/include/llvm/CodeGen/CommandFlags.h
>> llvm/trunk/include/llvm/Target/TargetTransformImpl.h
>> llvm/trunk/include/llvm/TargetTransformInfo.h
>> llvm/trunk/lib/Target/TargetTransformImpl.cpp
>> llvm/trunk/lib/VMCore/TargetTransformInfo.cpp
>> Modified:
>> llvm/trunk/include/llvm/Analysis/ScalarEvolutionExpander.h
>> llvm/trunk/include/llvm/InitializePasses.h
>> llvm/trunk/include/llvm/Target/TargetMachine.h
>> llvm/trunk/include/llvm/Transforms/Scalar.h
>> llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp
>> llvm/trunk/lib/CodeGen/Passes.cpp
>> llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp
>> llvm/trunk/lib/Target/ARM/ARMTargetMachine.h
>> llvm/trunk/lib/Target/CMakeLists.txt
>> llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.cpp
>> llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.h
>> llvm/trunk/lib/Target/Hexagon/HexagonTargetMachine.cpp
>> llvm/trunk/lib/Target/Hexagon/HexagonTargetMachine.h
>> llvm/trunk/lib/Target/MBlaze/MBlazeTargetMachine.cpp
>> llvm/trunk/lib/Target/MBlaze/MBlazeTargetMachine.h
>> llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.cpp
>> llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.h
>> llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp
>> llvm/trunk/lib/Target/Mips/MipsTargetMachine.h
>> llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.cpp
>> llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.h
>> llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.cpp
>> llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.h
>> llvm/trunk/lib/Target/Sparc/SparcTargetMachine.cpp
>> llvm/trunk/lib/Target/Sparc/SparcTargetMachine.h
>> llvm/trunk/lib/Target/Target.cpp
>> llvm/trunk/lib/Target/X86/X86TargetMachine.cpp
>> llvm/trunk/lib/Target/X86/X86TargetMachine.h
>> llvm/trunk/lib/Target/XCore/XCoreTargetMachine.cpp
>> llvm/trunk/lib/Target/XCore/XCoreTargetMachine.h
>> llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
>> llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp
>> llvm/trunk/lib/VMCore/CMakeLists.txt
>> llvm/trunk/tools/llc/llc.cpp
>> llvm/trunk/tools/opt/CMakeLists.txt
>> llvm/trunk/tools/opt/LLVMBuild.txt
>> llvm/trunk/tools/opt/Makefile
>> llvm/trunk/tools/opt/opt.cpp
>>
>> Modified: llvm/trunk/include/llvm/Analysis/ScalarEvolutionExpander.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScalarEvolutionExpander.h?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/ScalarEvolutionExpander.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/ScalarEvolutionExpander.h Wed Oct 10 17:04:55 2012
>> @@ -22,7 +22,7 @@
>> #include <set>
>>
>> namespace llvm {
>> - class TargetLowering;
>> + class ScalarTargetTransformInfo;
>>
>> /// Return true if the given expression is safe to expand in the sense that
>> /// all materialized values are safe to speculate.
>> @@ -129,7 +129,7 @@
>> /// representative. Return the number of phis eliminated.
>> unsigned replaceCongruentIVs(Loop *L, const DominatorTree *DT,
>> SmallVectorImpl<WeakVH> &DeadInsts,
>> - const TargetLowering *TLI = NULL);
>> + const ScalarTargetTransformInfo *STTI = NULL);
>>
>> /// expandCodeFor - Insert code to directly compute the specified SCEV
>> /// expression into the program. The inserted code is inserted into the
>>
>> Added: llvm/trunk/include/llvm/CodeGen/CommandFlags.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/CommandFlags.h?rev=165665&view=auto
>> ==============================================================================
>> --- llvm/trunk/include/llvm/CodeGen/CommandFlags.h (added)
>> +++ llvm/trunk/include/llvm/CodeGen/CommandFlags.h Wed Oct 10 17:04:55 2012
>> @@ -0,0 +1,228 @@
>> +//===-- CommandFlags.h - Register Coalescing Interface ----------*- 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 codegen-specific flags that are shared between different
>> +// command line tools. The tools "llc" and "opt" both use this file to prevent
>> +// flag duplication.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLVM_CODEGEN_COMMAND_LINE_FLAGS_H
>> +#define LLVM_CODEGEN_COMMAND_LINE_FLAGS_H
>> +
>> +#include "llvm/Support/CommandLine.h"
>> +#include "llvm/Support/CodeGen.h"
>> +#include "llvm/Target/TargetMachine.h"
>> +
>> +#include <string>
>> +using namespace llvm;
>> +
>> +cl::opt<std::string>
>> +MArch("march", cl::desc("Architecture to generate code for (see --version)"));
>> +
>> +cl::opt<std::string>
>> +MCPU("mcpu",
>> + cl::desc("Target a specific cpu type (-mcpu=help for details)"),
>> + cl::value_desc("cpu-name"),
>> + cl::init(""));
>> +
>> +cl::list<std::string>
>> +MAttrs("mattr",
>> + cl::CommaSeparated,
>> + cl::desc("Target specific attributes (-mattr=help for details)"),
>> + cl::value_desc("a1,+a2,-a3,..."));
>> +
>> +cl::opt<Reloc::Model>
>> +RelocModel("relocation-model",
>> + cl::desc("Choose relocation model"),
>> + cl::init(Reloc::Default),
>> + cl::values(
>> + clEnumValN(Reloc::Default, "default",
>> + "Target default relocation model"),
>> + clEnumValN(Reloc::Static, "static",
>> + "Non-relocatable code"),
>> + clEnumValN(Reloc::PIC_, "pic",
>> + "Fully relocatable, position independent code"),
>> + clEnumValN(Reloc::DynamicNoPIC, "dynamic-no-pic",
>> + "Relocatable external references, non-relocatable code"),
>> + clEnumValEnd));
>> +
>> +cl::opt<llvm::CodeModel::Model>
>> +CMModel("code-model",
>> + cl::desc("Choose code model"),
>> + cl::init(CodeModel::Default),
>> + cl::values(clEnumValN(CodeModel::Default, "default",
>> + "Target default code model"),
>> + clEnumValN(CodeModel::Small, "small",
>> + "Small code model"),
>> + clEnumValN(CodeModel::Kernel, "kernel",
>> + "Kernel code model"),
>> + clEnumValN(CodeModel::Medium, "medium",
>> + "Medium code model"),
>> + clEnumValN(CodeModel::Large, "large",
>> + "Large code model"),
>> + clEnumValEnd));
>> +
>> +cl::opt<bool>
>> +RelaxAll("mc-relax-all",
>> + cl::desc("When used with filetype=obj, "
>> + "relax all fixups in the emitted object file"));
>> +
>> +cl::opt<TargetMachine::CodeGenFileType>
>> +FileType("filetype", cl::init(TargetMachine::CGFT_AssemblyFile),
>> + cl::desc("Choose a file type (not all types are supported by all targets):"),
>> + cl::values(
>> + clEnumValN(TargetMachine::CGFT_AssemblyFile, "asm",
>> + "Emit an assembly ('.s') file"),
>> + clEnumValN(TargetMachine::CGFT_ObjectFile, "obj",
>> + "Emit a native object ('.o') file"),
>> + clEnumValN(TargetMachine::CGFT_Null, "null",
>> + "Emit nothing, for performance testing"),
>> + clEnumValEnd));
>> +
>> +cl::opt<bool> DisableDotLoc("disable-dot-loc", cl::Hidden,
>> + cl::desc("Do not use .loc entries"));
>> +
>> +cl::opt<bool> DisableCFI("disable-cfi", cl::Hidden,
>> + cl::desc("Do not use .cfi_* directives"));
>> +
>> +cl::opt<bool> EnableDwarfDirectory("enable-dwarf-directory", cl::Hidden,
>> + cl::desc("Use .file directives with an explicit directory."));
>> +
>> +cl::opt<bool>
>> +DisableRedZone("disable-red-zone",
>> + cl::desc("Do not emit code that uses the red zone."),
>> + cl::init(false));
>> +
>> +cl::opt<bool>
>> +EnableFPMAD("enable-fp-mad",
>> + cl::desc("Enable less precise MAD instructions to be generated"),
>> + cl::init(false));
>> +
>> +cl::opt<bool>
>> +DisableFPElim("disable-fp-elim",
>> + cl::desc("Disable frame pointer elimination optimization"),
>> + cl::init(false));
>> +
>> +cl::opt<bool>
>> +DisableFPElimNonLeaf("disable-non-leaf-fp-elim",
>> + cl::desc("Disable frame pointer elimination optimization for non-leaf funcs"),
>> + cl::init(false));
>> +
>> +cl::opt<bool>
>> +EnableUnsafeFPMath("enable-unsafe-fp-math",
>> + cl::desc("Enable optimizations that may decrease FP precision"),
>> + cl::init(false));
>> +
>> +cl::opt<bool>
>> +EnableNoInfsFPMath("enable-no-infs-fp-math",
>> + cl::desc("Enable FP math optimizations that assume no +-Infs"),
>> + cl::init(false));
>> +
>> +cl::opt<bool>
>> +EnableNoNaNsFPMath("enable-no-nans-fp-math",
>> + cl::desc("Enable FP math optimizations that assume no NaNs"),
>> + cl::init(false));
>> +
>> +cl::opt<bool>
>> +EnableHonorSignDependentRoundingFPMath("enable-sign-dependent-rounding-fp-math",
>> + cl::Hidden,
>> + cl::desc("Force codegen to assume rounding mode can change dynamically"),
>> + cl::init(false));
>> +
>> +cl::opt<bool>
>> +GenerateSoftFloatCalls("soft-float",
>> + cl::desc("Generate software floating point library calls"),
>> + cl::init(false));
>> +
>> +cl::opt<llvm::FloatABI::ABIType>
>> +FloatABIForCalls("float-abi",
>> + cl::desc("Choose float ABI type"),
>> + cl::init(FloatABI::Default),
>> + cl::values(
>> + clEnumValN(FloatABI::Default, "default",
>> + "Target default float ABI type"),
>> + clEnumValN(FloatABI::Soft, "soft",
>> + "Soft float ABI (implied by -soft-float)"),
>> + clEnumValN(FloatABI::Hard, "hard",
>> + "Hard float ABI (uses FP registers)"),
>> + clEnumValEnd));
>> +
>> +cl::opt<llvm::FPOpFusion::FPOpFusionMode>
>> +FuseFPOps("fp-contract",
>> + cl::desc("Enable aggresive formation of fused FP ops"),
>> + cl::init(FPOpFusion::Standard),
>> + cl::values(
>> + clEnumValN(FPOpFusion::Fast, "fast",
>> + "Fuse FP ops whenever profitable"),
>> + clEnumValN(FPOpFusion::Standard, "on",
>> + "Only fuse 'blessed' FP ops."),
>> + clEnumValN(FPOpFusion::Strict, "off",
>> + "Only fuse FP ops when the result won't be effected."),
>> + clEnumValEnd));
>> +
>> +cl::opt<bool>
>> +DontPlaceZerosInBSS("nozero-initialized-in-bss",
>> + cl::desc("Don't place zero-initialized symbols into bss section"),
>> + cl::init(false));
>> +
>> +cl::opt<bool>
>> +EnableGuaranteedTailCallOpt("tailcallopt",
>> + cl::desc("Turn fastcc calls into tail calls by (potentially) changing ABI."),
>> + cl::init(false));
>> +
>> +cl::opt<bool>
>> +DisableTailCalls("disable-tail-calls",
>> + cl::desc("Never emit tail calls"),
>> + cl::init(false));
>> +
>> +cl::opt<unsigned>
>> +OverrideStackAlignment("stack-alignment",
>> + cl::desc("Override default stack alignment"),
>> + cl::init(0));
>> +
>> +cl::opt<bool>
>> +EnableRealignStack("realign-stack",
>> + cl::desc("Realign stack if needed"),
>> + cl::init(true));
>> +
>> +cl::opt<std::string>
>> +TrapFuncName("trap-func", cl::Hidden,
>> + cl::desc("Emit a call to trap function rather than a trap instruction"),
>> + cl::init(""));
>> +
>> +cl::opt<bool>
>> +EnablePIE("enable-pie",
>> + cl::desc("Assume the creation of a position independent executable."),
>> + cl::init(false));
>> +
>> +cl::opt<bool>
>> +SegmentedStacks("segmented-stacks",
>> + cl::desc("Use segmented stacks if possible."),
>> + cl::init(false));
>> +
>> +cl::opt<bool>
>> +UseInitArray("use-init-array",
>> + cl::desc("Use .init_array instead of .ctors."),
>> + cl::init(false));
>> +
>> +cl::opt<std::string> StopAfter("stop-after",
>> + cl::desc("Stop compilation after a specific pass"),
>> + cl::value_desc("pass-name"),
>> + cl::init(""));
>> +cl::opt<std::string> StartAfter("start-after",
>> + cl::desc("Resume compilation after a specific pass"),
>> + cl::value_desc("pass-name"),
>> + cl::init(""));
>> +
>> +cl::opt<unsigned>
>> +SSPBufferSize("stack-protector-buffer-size", cl::init(8),
>> + cl::desc("Lower bound for a buffer to be considered for "
>> + "stack protection"));
>> +#endif
>>
>> Modified: llvm/trunk/include/llvm/InitializePasses.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/InitializePasses.h (original)
>> +++ llvm/trunk/include/llvm/InitializePasses.h Wed Oct 10 17:04:55 2012
>> @@ -247,6 +247,7 @@
>> void initializeTailDuplicatePassPass(PassRegistry&);
>> void initializeTargetPassConfigPass(PassRegistry&);
>> void initializeDataLayoutPass(PassRegistry&);
>> +void initializeTargetTransformInfoPass(PassRegistry&);
>> void initializeTargetLibraryInfoPass(PassRegistry&);
>> void initializeTwoAddressInstructionPassPass(PassRegistry&);
>> void initializeTypeBasedAliasAnalysisPass(PassRegistry&);
>>
>> Modified: llvm/trunk/include/llvm/Target/TargetMachine.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetMachine.h?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Target/TargetMachine.h (original)
>> +++ llvm/trunk/include/llvm/Target/TargetMachine.h Wed Oct 10 17:04:55 2012
>> @@ -17,6 +17,8 @@
>> #include "llvm/Pass.h"
>> #include "llvm/Support/CodeGen.h"
>> #include "llvm/Target/TargetOptions.h"
>> +#include "llvm/TargetTransformInfo.h"
>> +#include "llvm/Target/TargetTransformImpl.h"
>> #include "llvm/ADT/StringRef.h"
>> #include <cassert>
>> #include <string>
>> @@ -107,6 +109,10 @@
>> virtual const TargetLowering *getTargetLowering() const { return 0; }
>> virtual const TargetSelectionDAGInfo *getSelectionDAGInfo() const{ return 0; }
>> virtual const DataLayout *getDataLayout() const { return 0; }
>> + virtual const ScalarTargetTransformInfo*
>> + getScalarTargetTransformInfo() const { return 0; }
>> + virtual const VectorTargetTransformInfo*
>> + getVectorTargetTransformInfo() const { return 0; }
>>
>> /// getMCAsmInfo - Return target specific asm information.
>> ///
>>
>> Added: llvm/trunk/include/llvm/Target/TargetTransformImpl.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetTransformImpl.h?rev=165665&view=auto
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Target/TargetTransformImpl.h (added)
>> +++ llvm/trunk/include/llvm/Target/TargetTransformImpl.h Wed Oct 10 17:04:55 2012
>> @@ -0,0 +1,54 @@
>> +//=- llvm/Target/TargetTransformImpl.h - Target Loop Trans Info----*- 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 the target-specific implementations of the
>> +// TargetTransform interfaces.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLVM_TARGET_TARGET_TRANSFORMATION_IMPL_H
>> +#define LLVM_TARGET_TARGET_TRANSFORMATION_IMPL_H
>> +
>> +#include "llvm/TargetTransformInfo.h"
>> +
>> +namespace llvm {
>> +
>> +class TargetLowering;
>> +
>> +/// ScalarTargetTransformInfo - This is a default implementation for the
>> +/// ScalarTargetTransformInfo interface. Different targets can implement
>> +/// this interface differently.
>> +class ScalarTargetTransformImpl : public ScalarTargetTransformInfo {
>> +private:
>> + const TargetLowering *TLI;
>> +
>> +public:
>> + /// Ctor
>> + explicit ScalarTargetTransformImpl(const TargetLowering *TL): TLI(TL) {}
>> +
>> + virtual bool isLegalAddImmediate(int64_t imm) const;
>> +
>> + virtual bool isLegalICmpImmediate(int64_t imm) const;
>> +
>> + virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const;
>> +
>> + virtual bool isTruncateFree(Type *Ty1, Type *Ty2) const;
>> +
>> + virtual bool isTypeLegal(Type *Ty) const;
>> +
>> + virtual unsigned getJumpBufAlignment() const;
>> +
>> + virtual unsigned getJumpBufSize() const;
>> +};
>> +
>> +class VectorTargetTransformImpl : public VectorTargetTransformInfo { };
>> +
>> +} // end llvm namespace
>> +
>> +#endif
>>
>> Added: llvm/trunk/include/llvm/TargetTransformInfo.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/TargetTransformInfo.h?rev=165665&view=auto
>> ==============================================================================
>> --- llvm/trunk/include/llvm/TargetTransformInfo.h (added)
>> +++ llvm/trunk/include/llvm/TargetTransformInfo.h Wed Oct 10 17:04:55 2012
>> @@ -0,0 +1,126 @@
>> +//===- llvm/Transforms/TargetTransformInfo.h --------------------*- C++ -*-===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// This pass exposes codegen information to IR-level passes. Every
>> +// transformation that uses codegen information is broken into three parts:
>> +// 1. The IR-level analysis pass.
>> +// 2. The IR-level transformation interface which provides the needed
>> +// information.
>> +// 3. Codegen-level implementation which uses target-specific hooks.
>> +//
>> +// This file defines #2, which is the interface that IR-level transformations
>> +// use for querying the codegen.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLVM_TRANSFORMS_TARGET_TRANSFORM_INTERFACE
>> +#define LLVM_TRANSFORMS_TARGET_TRANSFORM_INTERFACE
>> +
>> +#include "llvm/Pass.h"
>> +#include "llvm/AddressingMode.h"
>> +#include "llvm/Support/DataTypes.h"
>> +#include "llvm/Type.h"
>> +
>> +namespace llvm {
>> +
>> +class ScalarTargetTransformInfo;
>> +class VectorTargetTransformInfo;
>> +
>> +/// TargetTransformInfo - This pass provides access to the codegen
>> +/// interfaces that are needed for IR-level transformations.
>> +class TargetTransformInfo : public ImmutablePass {
>> +private:
>> + const ScalarTargetTransformInfo *STTI;
>> + const VectorTargetTransformInfo *VTTI;
>> +public:
>> + /// Default ctor.
>> + ///
>> + /// @note This has to exist, because this is a pass, but it should never be
>> + /// used.
>> + TargetTransformInfo();
>> +
>> + explicit TargetTransformInfo(const ScalarTargetTransformInfo* S,
>> + const VectorTargetTransformInfo *V)
>> + : ImmutablePass(ID), STTI(S), VTTI(V) {
>> + initializeTargetTransformInfoPass(*PassRegistry::getPassRegistry());
>> + }
>> +
>> + TargetTransformInfo(const TargetTransformInfo &T) :
>> + ImmutablePass(ID), STTI(T.STTI), VTTI(T.VTTI) { }
>> +
>> + const ScalarTargetTransformInfo* getScalarTargetTransformInfo() {
>> + return STTI;
>> + }
>> + const VectorTargetTransformInfo* getVectorTargetTransformInfo() {
>> + return VTTI;
>> + }
>> +
>> + /// Pass identification, replacement for typeid.
>> + static char ID;
>> +};
>> +
>> +// ---------------------------------------------------------------------------//
>> +// The classes below are inherited and implemented by target-specific classes
>> +// in the codegen.
>> +// ---------------------------------------------------------------------------//
>> +
>> +/// ScalarTargetTransformInfo - This interface is used by IR-level passes
>> +/// that need target-dependent information for generic scalar transformations.
>> +/// LSR, and LowerInvoke use this interface.
>> +class ScalarTargetTransformInfo {
>> +public:
>> + /// isLegalAddImmediate - Return true if the specified immediate is legal
>> + /// add immediate, that is the target has add instructions which can add
>> + /// a register with the immediate without having to materialize the
>> + /// immediate into a register.
>> + virtual bool isLegalAddImmediate(int64_t) const {
>> + return false;
>> + }
>> + /// isLegalICmpImmediate - Return true if the specified immediate is legal
>> + /// icmp immediate, that is the target has icmp instructions which can compare
>> + /// a register against the immediate without having to materialize the
>> + /// immediate into a register.
>> + virtual bool isLegalICmpImmediate(int64_t) const {
>> + return false;
>> + }
>> + /// isLegalAddressingMode - Return true if the addressing mode represented by
>> + /// AM is legal for this target, for a load/store of the specified type.
>> + /// The type may be VoidTy, in which case only return true if the addressing
>> + /// mode is legal for a load/store of any legal type.
>> + /// TODO: Handle pre/postinc as well.
>> + virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const {
>> + return false;
>> + }
>> + /// isTruncateFree - Return true if it's free to truncate a value of
>> + /// type Ty1 to type Ty2. e.g. On x86 it's free to truncate a i32 value in
>> + /// register EAX to i16 by referencing its sub-register AX.
>> + virtual bool isTruncateFree(Type * /*Ty1*/, Type * /*Ty2*/) const {
>> + return false;
>> + }
>> + /// Is this type legal.
>> + virtual bool isTypeLegal(Type *Ty) const {
>> + return false;
>> + }
>> + /// getJumpBufAlignment - returns the target's jmp_buf alignment in bytes
>> + virtual unsigned getJumpBufAlignment() const {
>> + return 0;
>> + }
>> + /// getJumpBufSize - returns the target's jmp_buf size in bytes.
>> + virtual unsigned getJumpBufSize() const {
>> + return 0;
>> + }
>> +};
>> +
>> +class VectorTargetTransformInfo {
>> + // TODO: define an interface for VectorTargetTransformInfo.
>> +};
>> +
>> +} // End llvm namespace
>> +
>> +#endif
>>
>> Modified: llvm/trunk/include/llvm/Transforms/Scalar.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar.h?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Transforms/Scalar.h (original)
>> +++ llvm/trunk/include/llvm/Transforms/Scalar.h Wed Oct 10 17:04:55 2012
>> @@ -119,7 +119,7 @@
>> // optional parameter used to consult the target machine whether certain
>> // transformations are profitable.
>> //
>> -Pass *createLoopStrengthReducePass(const TargetLowering *TLI = 0);
>> +Pass *createLoopStrengthReducePass();
>>
>> Pass *createGlobalMergePass(const TargetLowering *TLI = 0);
>>
>> @@ -249,9 +249,8 @@
>> // 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);
>> +FunctionPass *createLowerInvokePass();
>> +FunctionPass *createLowerInvokePass(bool useExpensiveEHSupport);
>> extern char &LowerInvokePassID;
>>
>> //===----------------------------------------------------------------------===//
>>
>> Modified: llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp (original)
>> +++ llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp Wed Oct 10 17:04:55 2012
>> @@ -19,8 +19,8 @@
>> #include "llvm/LLVMContext.h"
>> #include "llvm/Support/Debug.h"
>> #include "llvm/DataLayout.h"
>> -#include "llvm/Target/TargetLowering.h"
>> #include "llvm/ADT/STLExtras.h"
>> +#include "llvm/TargetTransformInfo.h"
>>
>> using namespace llvm;
>>
>> @@ -1599,15 +1599,15 @@
>> /// This does not depend on any SCEVExpander state but should be used in
>> /// the same context that SCEVExpander is used.
>> unsigned SCEVExpander::replaceCongruentIVs(Loop *L, const DominatorTree *DT,
>> - SmallVectorImpl<WeakVH> &DeadInsts,
>> - const TargetLowering *TLI) {
>> + SmallVectorImpl<WeakVH> &DeadInsts,
>> + const ScalarTargetTransformInfo *STTI) {
>> // Find integer phis in order of increasing width.
>> SmallVector<PHINode*, 8> Phis;
>> for (BasicBlock::iterator I = L->getHeader()->begin();
>> PHINode *Phi = dyn_cast<PHINode>(I); ++I) {
>> Phis.push_back(Phi);
>> }
>> - if (TLI)
>> + if (STTI)
>> std::sort(Phis.begin(), Phis.end(), width_descending);
>>
>> unsigned NumElim = 0;
>> @@ -1624,8 +1624,8 @@
>> PHINode *&OrigPhiRef = ExprToIVMap[SE.getSCEV(Phi)];
>> if (!OrigPhiRef) {
>> OrigPhiRef = Phi;
>> - if (Phi->getType()->isIntegerTy() && TLI
>> - && TLI->isTruncateFree(Phi->getType(), Phis.back()->getType())) {
>> + if (Phi->getType()->isIntegerTy() && STTI &&
>> + STTI->isTruncateFree(Phi->getType(), Phis.back()->getType())) {
>> // This phi can be freely truncated to the narrowest phi type. Map the
>> // truncated expression to it so it will be reused for narrow types.
>> const SCEV *TruncExpr =
>>
>> Modified: llvm/trunk/lib/CodeGen/Passes.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/Passes.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/Passes.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/Passes.cpp Wed Oct 10 17:04:55 2012
>> @@ -359,7 +359,7 @@
>>
>> // Run loop strength reduction before anything else.
>> if (getOptLevel() != CodeGenOpt::None && !DisableLSR) {
>> - addPass(createLoopStrengthReducePass(getTargetLowering()));
>> + addPass(createLoopStrengthReducePass());
>> if (PrintLSR)
>> addPass(createPrintFunctionPass("\n\n*** Code after LSR ***\n", &dbgs()));
>> }
>> @@ -389,7 +389,7 @@
>> addPass(createDwarfEHPass(TM));
>> break;
>> case ExceptionHandling::None:
>> - addPass(createLowerInvokePass(TM->getTargetLowering()));
>> + addPass(createLowerInvokePass());
>>
>> // The lower invoke pass may create unreachable code. Remove it.
>> addPass(createUnreachableBlockEliminationPass());
>>
>> Modified: llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp Wed Oct 10 17:04:55 2012
>> @@ -71,7 +71,8 @@
>> ELFWriterInfo(*this),
>> TLInfo(*this),
>> TSInfo(*this),
>> - FrameLowering(Subtarget) {
>> + FrameLowering(Subtarget),
>> + STTI(&TLInfo) {
>> if (!Subtarget.hasARMOps())
>> report_fatal_error("CPU: '" + Subtarget.getCPUString() + "' does not "
>> "support ARM mode execution!");
>> @@ -104,7 +105,8 @@
>> TSInfo(*this),
>> FrameLowering(Subtarget.hasThumb2()
>> ? new ARMFrameLowering(Subtarget)
>> - : (ARMFrameLowering*)new Thumb1FrameLowering(Subtarget)) {
>> + : (ARMFrameLowering*)new Thumb1FrameLowering(Subtarget)),
>> + STTI(&TLInfo){
>> }
>>
>> namespace {
>>
>> Modified: llvm/trunk/lib/Target/ARM/ARMTargetMachine.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMTargetMachine.h?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMTargetMachine.h (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMTargetMachine.h Wed Oct 10 17:04:55 2012
>> @@ -25,6 +25,7 @@
>> #include "Thumb1FrameLowering.h"
>> #include "Thumb2InstrInfo.h"
>> #include "llvm/Target/TargetMachine.h"
>> +#include "llvm/Target/TargetTransformImpl.h"
>> #include "llvm/DataLayout.h"
>> #include "llvm/MC/MCStreamer.h"
>> #include "llvm/ADT/OwningPtr.h"
>> @@ -67,6 +68,8 @@
>> ARMTargetLowering TLInfo;
>> ARMSelectionDAGInfo TSInfo;
>> ARMFrameLowering FrameLowering;
>> + ScalarTargetTransformImpl STTI;
>> + VectorTargetTransformImpl VTTI;
>> public:
>> ARMTargetMachine(const Target &T, StringRef TT,
>> StringRef CPU, StringRef FS,
>> @@ -88,7 +91,12 @@
>> virtual const ARMFrameLowering *getFrameLowering() const {
>> return &FrameLowering;
>> }
>> -
>> + virtual const ScalarTargetTransformInfo *getScalarTargetTransformInfo()const {
>> + return &STTI;
>> + }
>> + virtual const VectorTargetTransformInfo *getVectorTargetTransformInfo()const {
>> + return &VTTI;
>> + }
>> virtual const ARMInstrInfo *getInstrInfo() const { return &InstrInfo; }
>> virtual const DataLayout *getDataLayout() const { return &DL; }
>> virtual const ARMELFWriterInfo *getELFWriterInfo() const {
>> @@ -110,6 +118,8 @@
>> ARMSelectionDAGInfo TSInfo;
>> // Either Thumb1FrameLowering or ARMFrameLowering.
>> OwningPtr<ARMFrameLowering> FrameLowering;
>> + ScalarTargetTransformImpl STTI;
>> + VectorTargetTransformImpl VTTI;
>> public:
>> ThumbTargetMachine(const Target &T, StringRef TT,
>> StringRef CPU, StringRef FS,
>> @@ -138,6 +148,12 @@
>> virtual const ARMFrameLowering *getFrameLowering() const {
>> return FrameLowering.get();
>> }
>> + virtual const ScalarTargetTransformInfo *getScalarTargetTransformInfo()const {
>> + return &STTI;
>> + }
>> + virtual const VectorTargetTransformInfo *getVectorTargetTransformInfo()const {
>> + return &VTTI;
>> + }
>> virtual const DataLayout *getDataLayout() const { return &DL; }
>> virtual const ARMELFWriterInfo *getELFWriterInfo() const {
>> return Subtarget.isTargetELF() ? &ELFWriterInfo : 0;
>>
>> Modified: llvm/trunk/lib/Target/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CMakeLists.txt?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/CMakeLists.txt (original)
>> +++ llvm/trunk/lib/Target/CMakeLists.txt Wed Oct 10 17:04:55 2012
>> @@ -11,6 +11,7 @@
>> TargetMachineC.cpp
>> TargetRegisterInfo.cpp
>> TargetSubtargetInfo.cpp
>> + TargetTransformImpl.cpp
>> )
>>
>> foreach(t ${LLVM_TARGETS_TO_BUILD})
>>
>> Modified: llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.cpp (original)
>> +++ llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.cpp Wed Oct 10 17:04:55 2012
>> @@ -43,7 +43,8 @@
>> FrameLowering(Subtarget),
>> TLInfo(*this),
>> TSInfo(*this),
>> - InstrItins(Subtarget.getInstrItineraryData()) {
>> + InstrItins(Subtarget.getInstrItineraryData()),
>> + STTI(&TLInfo){
>> }
>>
>> //===----------------------------------------------------------------------===//
>>
>> Modified: llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.h?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.h (original)
>> +++ llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.h Wed Oct 10 17:04:55 2012
>> @@ -20,6 +20,7 @@
>> #include "SPUSelectionDAGInfo.h"
>> #include "SPUFrameLowering.h"
>> #include "llvm/Target/TargetMachine.h"
>> +#include "llvm/Target/TargetTransformImpl.h"
>> #include "llvm/DataLayout.h"
>>
>> namespace llvm {
>> @@ -34,6 +35,8 @@
>> SPUTargetLowering TLInfo;
>> SPUSelectionDAGInfo TSInfo;
>> InstrItineraryData InstrItins;
>> + ScalarTargetTransformImpl STTI;
>> + VectorTargetTransformImpl VTTI;
>> public:
>> SPUTargetMachine(const Target &T, StringRef TT,
>> StringRef CPU, StringRef FS, const TargetOptions &Options,
>> @@ -77,6 +80,12 @@
>> virtual const InstrItineraryData *getInstrItineraryData() const {
>> return &InstrItins;
>> }
>> + virtual const ScalarTargetTransformInfo *getScalarTargetTransformInfo()const {
>> + return &STTI;
>> + }
>> + virtual const VectorTargetTransformInfo *getVectorTargetTransformInfo()const {
>> + return &VTTI;
>> + }
>>
>> // Pass Pipeline Configuration
>> virtual TargetPassConfig *createPassConfig(PassManagerBase &PM);
>>
>> Modified: llvm/trunk/lib/Target/Hexagon/HexagonTargetMachine.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonTargetMachine.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/Hexagon/HexagonTargetMachine.cpp (original)
>> +++ llvm/trunk/lib/Target/Hexagon/HexagonTargetMachine.cpp Wed Oct 10 17:04:55 2012
>> @@ -74,7 +74,8 @@
>> Subtarget(TT, CPU, FS), InstrInfo(Subtarget), TLInfo(*this),
>> TSInfo(*this),
>> FrameLowering(Subtarget),
>> - InstrItins(&Subtarget.getInstrItineraryData()) {
>> + InstrItins(&Subtarget.getInstrItineraryData()),
>> + STTI(&TLInfo) {
>> setMCUseCFI(false);
>> }
>>
>> @@ -87,7 +88,7 @@
>> PM.add(createDeadCodeEliminationPass());
>> PM.add(createConstantPropagationPass());
>> PM.add(createLoopUnrollPass());
>> - PM.add(createLoopStrengthReducePass(getTargetLowering()));
>> + PM.add(createLoopStrengthReducePass());
>> return true;
>> }
>>
>>
>> Modified: llvm/trunk/lib/Target/Hexagon/HexagonTargetMachine.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonTargetMachine.h?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/Hexagon/HexagonTargetMachine.h (original)
>> +++ llvm/trunk/lib/Target/Hexagon/HexagonTargetMachine.h Wed Oct 10 17:04:55 2012
>> @@ -21,6 +21,7 @@
>> #include "HexagonFrameLowering.h"
>> #include "llvm/Target/TargetMachine.h"
>> #include "llvm/DataLayout.h"
>> +#include "llvm/Target/TargetTransformImpl.h"
>>
>> namespace llvm {
>>
>> @@ -34,6 +35,8 @@
>> HexagonSelectionDAGInfo TSInfo;
>> HexagonFrameLowering FrameLowering;
>> const InstrItineraryData* InstrItins;
>> + ScalarTargetTransformImpl STTI;
>> + VectorTargetTransformImpl VTTI;
>>
>> public:
>> HexagonTargetMachine(const Target &T, StringRef TT,StringRef CPU,
>> @@ -68,6 +71,14 @@
>> return &TSInfo;
>> }
>>
>> + virtual const ScalarTargetTransformInfo *getScalarTargetTransformInfo()const {
>> + return &STTI;
>> + }
>> +
>> + virtual const VectorTargetTransformInfo *getVectorTargetTransformInfo()const {
>> + return &VTTI;
>> + }
>> +
>> virtual const DataLayout *getDataLayout() const { return &DL; }
>> static unsigned getModuleMatchQuality(const Module &M);
>>
>>
>> Modified: llvm/trunk/lib/Target/MBlaze/MBlazeTargetMachine.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/MBlaze/MBlazeTargetMachine.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/MBlaze/MBlazeTargetMachine.cpp (original)
>> +++ llvm/trunk/lib/Target/MBlaze/MBlazeTargetMachine.cpp Wed Oct 10 17:04:55 2012
>> @@ -42,7 +42,7 @@
>> InstrInfo(*this),
>> FrameLowering(Subtarget),
>> TLInfo(*this), TSInfo(*this), ELFWriterInfo(*this),
>> - InstrItins(Subtarget.getInstrItineraryData()) {
>> + InstrItins(Subtarget.getInstrItineraryData()), STTI(&TLInfo) {
>> }
>>
>> namespace {
>>
>> Modified: llvm/trunk/lib/Target/MBlaze/MBlazeTargetMachine.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/MBlaze/MBlazeTargetMachine.h?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/MBlaze/MBlazeTargetMachine.h (original)
>> +++ llvm/trunk/lib/Target/MBlaze/MBlazeTargetMachine.h Wed Oct 10 17:04:55 2012
>> @@ -25,6 +25,7 @@
>> #include "llvm/Target/TargetMachine.h"
>> #include "llvm/DataLayout.h"
>> #include "llvm/Target/TargetFrameLowering.h"
>> +#include "llvm/Target/TargetTransformImpl.h"
>>
>> namespace llvm {
>> class formatted_raw_ostream;
>> @@ -39,6 +40,8 @@
>> MBlazeIntrinsicInfo IntrinsicInfo;
>> MBlazeELFWriterInfo ELFWriterInfo;
>> InstrItineraryData InstrItins;
>> + ScalarTargetTransformImpl STTI;
>> + VectorTargetTransformImpl VTTI;
>>
>> public:
>> MBlazeTargetMachine(const Target &T, StringRef TT,
>> @@ -77,6 +80,10 @@
>> virtual const MBlazeELFWriterInfo *getELFWriterInfo() const {
>> return &ELFWriterInfo;
>> }
>> + virtual const ScalarTargetTransformInfo *getScalarTargetTransformInfo()const
>> + { return &STTI; }
>> + virtual const VectorTargetTransformInfo *getVectorTargetTransformInfo()const
>> + { return &VTTI; }
>>
>> // Pass Pipeline Configuration
>> virtual TargetPassConfig *createPassConfig(PassManagerBase &PM);
>>
>> Modified: llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.cpp (original)
>> +++ llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.cpp Wed Oct 10 17:04:55 2012
>> @@ -36,7 +36,7 @@
>> // FIXME: Check DataLayout string.
>> DL("e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16"),
>> InstrInfo(*this), TLInfo(*this), TSInfo(*this),
>> - FrameLowering(Subtarget) { }
>> + FrameLowering(Subtarget), STTI(&TLInfo) { }
>>
>> namespace {
>> /// MSP430 Code Generator Pass Configuration Options.
>>
>> Modified: llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.h?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.h (original)
>> +++ llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.h Wed Oct 10 17:04:55 2012
>> @@ -24,6 +24,7 @@
>> #include "llvm/DataLayout.h"
>> #include "llvm/Target/TargetFrameLowering.h"
>> #include "llvm/Target/TargetMachine.h"
>> +#include "llvm/Target/TargetTransformImpl.h"
>>
>> namespace llvm {
>>
>> @@ -36,6 +37,8 @@
>> MSP430TargetLowering TLInfo;
>> MSP430SelectionDAGInfo TSInfo;
>> MSP430FrameLowering FrameLowering;
>> + ScalarTargetTransformImpl STTI;
>> + VectorTargetTransformImpl VTTI;
>>
>> public:
>> MSP430TargetMachine(const Target &T, StringRef TT,
>> @@ -61,7 +64,12 @@
>> virtual const MSP430SelectionDAGInfo* getSelectionDAGInfo() const {
>> return &TSInfo;
>> }
>> -
>> + virtual const ScalarTargetTransformInfo *getScalarTargetTransformInfo()const {
>> + return &STTI;
>> + }
>> + virtual const VectorTargetTransformInfo *getVectorTargetTransformInfo()const {
>> + return &VTTI;
>> + }
>> virtual TargetPassConfig *createPassConfig(PassManagerBase &PM);
>> }; // MSP430TargetMachine.
>>
>>
>> Modified: llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp (original)
>> +++ llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp Wed Oct 10 17:04:55 2012
>> @@ -53,7 +53,7 @@
>> InstrInfo(MipsInstrInfo::create(*this)),
>> FrameLowering(MipsFrameLowering::create(*this, Subtarget)),
>> TLInfo(*this), TSInfo(*this), JITInfo(),
>> - ELFWriterInfo(false, isLittle) {
>> + ELFWriterInfo(false, isLittle), STTI(&TLInfo) {
>> }
>>
>> void MipsebTargetMachine::anchor() { }
>>
>> Modified: llvm/trunk/lib/Target/Mips/MipsTargetMachine.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsTargetMachine.h?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/Mips/MipsTargetMachine.h (original)
>> +++ llvm/trunk/lib/Target/Mips/MipsTargetMachine.h Wed Oct 10 17:04:55 2012
>> @@ -24,6 +24,7 @@
>> #include "llvm/Target/TargetMachine.h"
>> #include "llvm/DataLayout.h"
>> #include "llvm/Target/TargetFrameLowering.h"
>> +#include "llvm/Target/TargetTransformImpl.h"
>>
>> namespace llvm {
>> class formatted_raw_ostream;
>> @@ -38,6 +39,8 @@
>> MipsSelectionDAGInfo TSInfo;
>> MipsJITInfo JITInfo;
>> MipsELFWriterInfo ELFWriterInfo;
>> + ScalarTargetTransformImpl STTI;
>> + VectorTargetTransformImpl VTTI;
>
> This member was unused, causing a -Wunused-member-variable warning.
> I've removed it to cleanup the build in r165669.
>
> - David
>
>>
>> public:
>> MipsTargetMachine(const Target &T, StringRef TT,
>>
>> Modified: llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.cpp (original)
>> +++ llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.cpp Wed Oct 10 17:04:55 2012
>> @@ -72,7 +72,8 @@
>> : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
>> Subtarget(TT, CPU, FS, is64bit),
>> DL(Subtarget.getDataLayout()),
>> - InstrInfo(*this), TLInfo(*this), TSInfo(*this), FrameLowering(*this,is64bit)
>> + InstrInfo(*this), TLInfo(*this), TSInfo(*this), FrameLowering(*this,is64bit),
>> + STTI(&TLInfo)
>> /*FrameInfo(TargetFrameInfo::StackGrowsUp, 8, 0)*/ {
>> }
>>
>>
>> Modified: llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.h?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.h (original)
>> +++ llvm/trunk/lib/Target/NVPTX/NVPTXTargetMachine.h Wed Oct 10 17:04:55 2012
>> @@ -25,6 +25,7 @@
>> #include "llvm/Target/TargetFrameLowering.h"
>> #include "llvm/Target/TargetMachine.h"
>> #include "llvm/Target/TargetSelectionDAGInfo.h"
>> +#include "llvm/Target/TargetTransformImpl.h"
>>
>> namespace llvm {
>>
>> @@ -44,6 +45,9 @@
>> // Hold Strings that can be free'd all together with NVPTXTargetMachine
>> ManagedStringPool ManagedStrPool;
>>
>> + ScalarTargetTransformImpl STTI;
>> + VectorTargetTransformImpl VTTI;
>> +
>> //bool addCommonCodeGenPasses(PassManagerBase &, CodeGenOpt::Level,
>> // bool DisableVerify, MCContext *&OutCtx);
>>
>> @@ -72,6 +76,12 @@
>> virtual const TargetSelectionDAGInfo *getSelectionDAGInfo() const {
>> return &TSInfo;
>> }
>> + virtual const ScalarTargetTransformInfo *getScalarTargetTransformInfo()const {
>> + return &STTI;
>> + }
>> + virtual const VectorTargetTransformInfo *getVectorTargetTransformInfo()const {
>> + return &VTTI;
>> + }
>>
>> //virtual bool addInstSelector(PassManagerBase &PM,
>> // CodeGenOpt::Level OptLevel);
>>
>> Modified: llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.cpp (original)
>> +++ llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.cpp Wed Oct 10 17:04:55 2012
>> @@ -43,7 +43,8 @@
>> DL(Subtarget.getDataLayoutString()), InstrInfo(*this),
>> FrameLowering(Subtarget), JITInfo(*this, is64Bit),
>> TLInfo(*this), TSInfo(*this),
>> - InstrItins(Subtarget.getInstrItineraryData()) {
>> + InstrItins(Subtarget.getInstrItineraryData()),
>> + STTI(&TLInfo){
>>
>> // The binutils for the BG/P are too old for CFI.
>> if (Subtarget.isBGP())
>>
>> Modified: llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.h?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.h (original)
>> +++ llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.h Wed Oct 10 17:04:55 2012
>> @@ -21,6 +21,7 @@
>> #include "PPCISelLowering.h"
>> #include "PPCSelectionDAGInfo.h"
>> #include "llvm/Target/TargetMachine.h"
>> +#include "llvm/Target/TargetTransformImpl.h"
>> #include "llvm/DataLayout.h"
>>
>> namespace llvm {
>> @@ -36,6 +37,8 @@
>> PPCTargetLowering TLInfo;
>> PPCSelectionDAGInfo TSInfo;
>> InstrItineraryData InstrItins;
>> + ScalarTargetTransformImpl STTI;
>> + VectorTargetTransformImpl VTTI;
>>
>> public:
>> PPCTargetMachine(const Target &T, StringRef TT,
>> @@ -63,6 +66,12 @@
>> virtual const InstrItineraryData *getInstrItineraryData() const {
>> return &InstrItins;
>> }
>> + virtual const ScalarTargetTransformInfo *getScalarTargetTransformInfo()const {
>> + return &STTI;
>> + }
>> + virtual const VectorTargetTransformInfo *getVectorTargetTransformInfo()const {
>> + return &VTTI;
>> + }
>>
>> // Pass Pipeline Configuration
>> virtual TargetPassConfig *createPassConfig(PassManagerBase &PM);
>>
>> Modified: llvm/trunk/lib/Target/Sparc/SparcTargetMachine.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/SparcTargetMachine.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/Sparc/SparcTargetMachine.cpp (original)
>> +++ llvm/trunk/lib/Target/Sparc/SparcTargetMachine.cpp Wed Oct 10 17:04:55 2012
>> @@ -36,7 +36,7 @@
>> DL(Subtarget.getDataLayout()),
>> InstrInfo(Subtarget),
>> TLInfo(*this), TSInfo(*this),
>> - FrameLowering(Subtarget) {
>> + FrameLowering(Subtarget),STTI(&TLInfo) {
>> }
>>
>> namespace {
>>
>> Modified: llvm/trunk/lib/Target/Sparc/SparcTargetMachine.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/SparcTargetMachine.h?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/Sparc/SparcTargetMachine.h (original)
>> +++ llvm/trunk/lib/Target/Sparc/SparcTargetMachine.h Wed Oct 10 17:04:55 2012
>> @@ -22,6 +22,7 @@
>> #include "llvm/Target/TargetMachine.h"
>> #include "llvm/DataLayout.h"
>> #include "llvm/Target/TargetFrameLowering.h"
>> +#include "llvm/Target/TargetTransformImpl.h"
>>
>> namespace llvm {
>>
>> @@ -32,6 +33,8 @@
>> SparcTargetLowering TLInfo;
>> SparcSelectionDAGInfo TSInfo;
>> SparcFrameLowering FrameLowering;
>> + ScalarTargetTransformImpl STTI;
>> + VectorTargetTransformImpl VTTI;
>> public:
>> SparcTargetMachine(const Target &T, StringRef TT,
>> StringRef CPU, StringRef FS, const TargetOptions &Options,
>> @@ -52,6 +55,12 @@
>> virtual const SparcSelectionDAGInfo* getSelectionDAGInfo() const {
>> return &TSInfo;
>> }
>> + virtual const ScalarTargetTransformInfo *getScalarTargetTransformInfo()const {
>> + return &STTI;
>> + }
>> + virtual const VectorTargetTransformInfo *getVectorTargetTransformInfo()const {
>> + return &VTTI;
>> + }
>> virtual const DataLayout *getDataLayout() const { return &DL; }
>>
>> // Pass Pipeline Configuration
>>
>> Modified: llvm/trunk/lib/Target/Target.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Target.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/Target.cpp (original)
>> +++ llvm/trunk/lib/Target/Target.cpp Wed Oct 10 17:04:55 2012
>> @@ -26,6 +26,7 @@
>> void llvm::initializeTarget(PassRegistry &Registry) {
>> initializeDataLayoutPass(Registry);
>> initializeTargetLibraryInfoPass(Registry);
>> + initializeTargetTransformInfoPass(Registry);
>> }
>>
>> void LLVMInitializeTarget(LLVMPassRegistryRef R) {
>>
>> Added: llvm/trunk/lib/Target/TargetTransformImpl.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetTransformImpl.cpp?rev=165665&view=auto
>> ==============================================================================
>> --- llvm/trunk/lib/Target/TargetTransformImpl.cpp (added)
>> +++ llvm/trunk/lib/Target/TargetTransformImpl.cpp Wed Oct 10 17:04:55 2012
>> @@ -0,0 +1,43 @@
>> +// llvm/Target/TargetTransformImpl.cpp - Target Loop Trans Info ---*- C++ -*-=//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "llvm/Target/TargetTransformImpl.h"
>> +#include "llvm/Target/TargetLowering.h"
>> +
>> +using namespace llvm;
>> +
>> +bool ScalarTargetTransformImpl::isLegalAddImmediate(int64_t imm) const {
>> + return TLI->isLegalAddImmediate(imm);
>> +}
>> +
>> +bool ScalarTargetTransformImpl::isLegalICmpImmediate(int64_t imm) const {
>> + return TLI->isLegalICmpImmediate(imm);
>> +}
>> +
>> +bool ScalarTargetTransformImpl::isLegalAddressingMode(const AddrMode &AM,
>> + Type *Ty) const {
>> + return TLI->isLegalAddressingMode(AM, Ty);
>> +}
>> +
>> +bool ScalarTargetTransformImpl::isTruncateFree(Type *Ty1, Type *Ty2) const {
>> + return TLI->isTruncateFree(Ty1, Ty2);
>> +}
>> +
>> +bool ScalarTargetTransformImpl::isTypeLegal(Type *Ty) const {
>> + EVT T = TLI->getValueType(Ty);
>> + return TLI->isTypeLegal(T);
>> +}
>> +
>> +unsigned ScalarTargetTransformImpl::getJumpBufAlignment() const {
>> + return TLI->getJumpBufAlignment();
>> +}
>> +
>> +unsigned ScalarTargetTransformImpl::getJumpBufSize() const {
>> + return TLI->getJumpBufSize();
>> +}
>>
>> Modified: llvm/trunk/lib/Target/X86/X86TargetMachine.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetMachine.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/X86/X86TargetMachine.cpp (original)
>> +++ llvm/trunk/lib/Target/X86/X86TargetMachine.cpp Wed Oct 10 17:04:55 2012
>> @@ -48,7 +48,8 @@
>> InstrInfo(*this),
>> TSInfo(*this),
>> TLInfo(*this),
>> - JITInfo(*this) {
>> + JITInfo(*this),
>> + STTI(&TLInfo) {
>> }
>>
>> void X86_64TargetMachine::anchor() { }
>> @@ -64,7 +65,8 @@
>> InstrInfo(*this),
>> TSInfo(*this),
>> TLInfo(*this),
>> - JITInfo(*this) {
>> + JITInfo(*this),
>> + STTI(&TLInfo) {
>> }
>>
>> /// X86TargetMachine ctor - Create an X86 target.
>>
>> Modified: llvm/trunk/lib/Target/X86/X86TargetMachine.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetMachine.h?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/X86/X86TargetMachine.h (original)
>> +++ llvm/trunk/lib/Target/X86/X86TargetMachine.h Wed Oct 10 17:04:55 2012
>> @@ -25,6 +25,7 @@
>> #include "llvm/Target/TargetMachine.h"
>> #include "llvm/DataLayout.h"
>> #include "llvm/Target/TargetFrameLowering.h"
>> +#include "llvm/Target/TargetTransformImpl.h"
>>
>> namespace llvm {
>>
>> @@ -85,6 +86,8 @@
>> X86SelectionDAGInfo TSInfo;
>> X86TargetLowering TLInfo;
>> X86JITInfo JITInfo;
>> + ScalarTargetTransformImpl STTI;
>> + VectorTargetTransformImpl VTTI;
>> public:
>> X86_32TargetMachine(const Target &T, StringRef TT,
>> StringRef CPU, StringRef FS, const TargetOptions &Options,
>> @@ -103,6 +106,12 @@
>> virtual X86JITInfo *getJITInfo() {
>> return &JITInfo;
>> }
>> + virtual const ScalarTargetTransformInfo *getScalarTargetTransformInfo()const {
>> + return &STTI;
>> + }
>> + virtual const VectorTargetTransformInfo *getVectorTargetTransformInfo()const {
>> + return &VTTI;
>> + }
>> };
>>
>> /// X86_64TargetMachine - X86 64-bit target machine.
>> @@ -114,6 +123,8 @@
>> X86SelectionDAGInfo TSInfo;
>> X86TargetLowering TLInfo;
>> X86JITInfo JITInfo;
>> + ScalarTargetTransformImpl STTI;
>> + VectorTargetTransformImpl VTTI;
>> public:
>> X86_64TargetMachine(const Target &T, StringRef TT,
>> StringRef CPU, StringRef FS, const TargetOptions &Options,
>> @@ -132,6 +143,12 @@
>> virtual X86JITInfo *getJITInfo() {
>> return &JITInfo;
>> }
>> + virtual const ScalarTargetTransformInfo *getScalarTargetTransformInfo()const {
>> + return &STTI;
>> + }
>> + virtual const VectorTargetTransformInfo *getVectorTargetTransformInfo()const {
>> + return &VTTI;
>> + }
>> };
>>
>> } // End llvm namespace
>>
>> Modified: llvm/trunk/lib/Target/XCore/XCoreTargetMachine.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/XCore/XCoreTargetMachine.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/XCore/XCoreTargetMachine.cpp (original)
>> +++ llvm/trunk/lib/Target/XCore/XCoreTargetMachine.cpp Wed Oct 10 17:04:55 2012
>> @@ -32,7 +32,7 @@
>> InstrInfo(),
>> FrameLowering(Subtarget),
>> TLInfo(*this),
>> - TSInfo(*this) {
>> + TSInfo(*this), STTI(&TLInfo) {
>> }
>>
>> namespace {
>>
>> Modified: llvm/trunk/lib/Target/XCore/XCoreTargetMachine.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/XCore/XCoreTargetMachine.h?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/XCore/XCoreTargetMachine.h (original)
>> +++ llvm/trunk/lib/Target/XCore/XCoreTargetMachine.h Wed Oct 10 17:04:55 2012
>> @@ -20,6 +20,7 @@
>> #include "XCoreISelLowering.h"
>> #include "XCoreSelectionDAGInfo.h"
>> #include "llvm/Target/TargetMachine.h"
>> +#include "llvm/Target/TargetTransformImpl.h"
>> #include "llvm/DataLayout.h"
>>
>> namespace llvm {
>> @@ -31,6 +32,8 @@
>> XCoreFrameLowering FrameLowering;
>> XCoreTargetLowering TLInfo;
>> XCoreSelectionDAGInfo TSInfo;
>> + ScalarTargetTransformImpl STTI;
>> + VectorTargetTransformImpl VTTI;
>> public:
>> XCoreTargetMachine(const Target &T, StringRef TT,
>> StringRef CPU, StringRef FS, const TargetOptions &Options,
>> @@ -53,6 +56,12 @@
>> virtual const TargetRegisterInfo *getRegisterInfo() const {
>> return &InstrInfo.getRegisterInfo();
>> }
>> + virtual const ScalarTargetTransformInfo *getScalarTargetTransformInfo()const {
>> + return &STTI;
>> + }
>> + virtual const VectorTargetTransformInfo *getVectorTargetTransformInfo()const {
>> + return &VTTI;
>> + }
>> virtual const DataLayout *getDataLayout() const { return &DL; }
>>
>> // Pass Pipeline Configuration
>>
>> Modified: llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp Wed Oct 10 17:04:55 2012
>> @@ -37,7 +37,7 @@
>> //
>> // TODO: Handle multiple loops at a time.
>> //
>> -// TODO: Should TargetLowering::AddrMode::BaseGV be changed to a ConstantExpr
>> +// TODO: Should AddrMode::BaseGV be changed to a ConstantExpr
>> // instead of a GlobalValue?
>> //
>> // TODO: When truncation is free, truncate ICmp users' operands to make it a
>> @@ -67,6 +67,7 @@
>> #include "llvm/Transforms/Scalar.h"
>> #include "llvm/Transforms/Utils/BasicBlockUtils.h"
>> #include "llvm/Transforms/Utils/Local.h"
>> +#include "llvm/TargetTransformInfo.h"
>> #include "llvm/ADT/SmallBitVector.h"
>> #include "llvm/ADT/SetVector.h"
>> #include "llvm/ADT/DenseSet.h"
>> @@ -74,7 +75,6 @@
>> #include "llvm/Support/CommandLine.h"
>> #include "llvm/Support/ValueHandle.h"
>> #include "llvm/Support/raw_ostream.h"
>> -#include "llvm/Target/TargetLowering.h"
>> #include <algorithm>
>> using namespace llvm;
>>
>> @@ -1118,7 +1118,7 @@
>> enum KindType {
>> Basic, ///< A normal use, with no folding.
>> Special, ///< A special case of basic, allowing -1 scales.
>> - Address, ///< An address use; folding according to TargetLowering
>> + Address, ///< An address use; folding according to ScalarTargetTransformInfo.
>> ICmpZero ///< An equality icmp with both operands folded into one.
>> // TODO: Add a generic icmp too?
>> };
>> @@ -1272,12 +1272,12 @@
>> /// address-mode folding and special icmp tricks.
>> static bool isLegalUse(const AddrMode &AM,
>> LSRUse::KindType Kind, Type *AccessTy,
>> - const TargetLowering *TLI) {
>> + const ScalarTargetTransformInfo *STTI) {
>> switch (Kind) {
>> case LSRUse::Address:
>> // If we have low-level target information, ask the target if it can
>> // completely fold this address.
>> - if (TLI) return TLI->isLegalAddressingMode(AM, AccessTy);
>> + if (STTI) return STTI->isLegalAddressingMode(AM, AccessTy);
>>
>> // Otherwise, just guess that reg+reg addressing is legal.
>> return !AM.BaseGV && AM.BaseOffs == 0 && AM.Scale <= 1;
>> @@ -1300,7 +1300,7 @@
>> // If we have low-level target information, ask the target if it can fold an
>> // integer immediate on an icmp.
>> if (AM.BaseOffs != 0) {
>> - if (!TLI)
>> + if (!STTI)
>> return false;
>> // We have one of:
>> // ICmpZero BaseReg + Offset => ICmp BaseReg, -Offset
>> @@ -1309,7 +1309,7 @@
>> int64_t Offs = AM.BaseOffs;
>> if (AM.Scale == 0)
>> Offs = -(uint64_t)Offs; // The cast does the right thing with INT64_MIN.
>> - return TLI->isLegalICmpImmediate(Offs);
>> + return STTI->isLegalICmpImmediate(Offs);
>> }
>>
>> // ICmpZero BaseReg + -1*ScaleReg => ICmp BaseReg, ScaleReg
>> @@ -1330,20 +1330,20 @@
>> static bool isLegalUse(AddrMode AM,
>> int64_t MinOffset, int64_t MaxOffset,
>> LSRUse::KindType Kind, Type *AccessTy,
>> - const TargetLowering *TLI) {
>> + const ScalarTargetTransformInfo *LTTI) {
>> // Check for overflow.
>> if (((int64_t)((uint64_t)AM.BaseOffs + MinOffset) > AM.BaseOffs) !=
>> (MinOffset > 0))
>> return false;
>> AM.BaseOffs = (uint64_t)AM.BaseOffs + MinOffset;
>> - if (isLegalUse(AM, Kind, AccessTy, TLI)) {
>> + if (isLegalUse(AM, Kind, AccessTy, LTTI)) {
>> AM.BaseOffs = (uint64_t)AM.BaseOffs - MinOffset;
>> // Check for overflow.
>> if (((int64_t)((uint64_t)AM.BaseOffs + MaxOffset) > AM.BaseOffs) !=
>> (MaxOffset > 0))
>> return false;
>> AM.BaseOffs = (uint64_t)AM.BaseOffs + MaxOffset;
>> - return isLegalUse(AM, Kind, AccessTy, TLI);
>> + return isLegalUse(AM, Kind, AccessTy, LTTI);
>> }
>> return false;
>> }
>> @@ -1352,7 +1352,7 @@
>> GlobalValue *BaseGV,
>> bool HasBaseReg,
>> LSRUse::KindType Kind, Type *AccessTy,
>> - const TargetLowering *TLI) {
>> + const ScalarTargetTransformInfo *LTTI) {
>> // Fast-path: zero is always foldable.
>> if (BaseOffs == 0 && !BaseGV) return true;
>>
>> @@ -1371,14 +1371,14 @@
>> AM.HasBaseReg = true;
>> }
>>
>> - return isLegalUse(AM, Kind, AccessTy, TLI);
>> + return isLegalUse(AM, Kind, AccessTy, LTTI);
>> }
>>
>> static bool isAlwaysFoldable(const SCEV *S,
>> int64_t MinOffset, int64_t MaxOffset,
>> bool HasBaseReg,
>> LSRUse::KindType Kind, Type *AccessTy,
>> - const TargetLowering *TLI,
>> + const ScalarTargetTransformInfo *LTTI,
>> ScalarEvolution &SE) {
>> // Fast-path: zero is always foldable.
>> if (S->isZero()) return true;
>> @@ -1402,7 +1402,7 @@
>> AM.HasBaseReg = HasBaseReg;
>> AM.Scale = Kind == LSRUse::ICmpZero ? -1 : 1;
>>
>> - return isLegalUse(AM, MinOffset, MaxOffset, Kind, AccessTy, TLI);
>> + return isLegalUse(AM, MinOffset, MaxOffset, Kind, AccessTy, LTTI);
>> }
>>
>> namespace {
>> @@ -1502,7 +1502,7 @@
>> ScalarEvolution &SE;
>> DominatorTree &DT;
>> LoopInfo &LI;
>> - const TargetLowering *const TLI;
>> + const ScalarTargetTransformInfo *const STTI;
>> Loop *const L;
>> bool Changed;
>>
>> @@ -1638,7 +1638,7 @@
>> Pass *P);
>>
>> public:
>> - LSRInstance(const TargetLowering *tli, Loop *l, Pass *P);
>> + LSRInstance(const ScalarTargetTransformInfo *ltti, Loop *l, Pass *P);
>>
>> bool getChanged() const { return Changed; }
>>
>> @@ -1688,11 +1688,10 @@
>> }
>> if (!DestTy) continue;
>>
>> - if (TLI) {
>> + if (STTI) {
>> // If target does not support DestTy natively then do not apply
>> // this transformation.
>> - EVT DVT = TLI->getValueType(DestTy);
>> - if (!TLI->isTypeLegal(DVT)) continue;
>> + if (!STTI->isTypeLegal(DestTy)) continue;
>> }
>>
>> PHINode *PH = dyn_cast<PHINode>(ShadowUse->getOperand(0));
>> @@ -2015,18 +2014,18 @@
>> if (C->getValue().getMinSignedBits() >= 64 ||
>> C->getValue().isMinSignedValue())
>> goto decline_post_inc;
>> - // Without TLI, assume that any stride might be valid, and so any
>> + // Without STTI, assume that any stride might be valid, and so any
>> // use might be shared.
>> - if (!TLI)
>> + if (!STTI)
>> goto decline_post_inc;
>> // Check for possible scaled-address reuse.
>> Type *AccessTy = getAccessType(UI->getUser());
>> AddrMode AM;
>> AM.Scale = C->getSExtValue();
>> - if (TLI->isLegalAddressingMode(AM, AccessTy))
>> + if (STTI->isLegalAddressingMode(AM, AccessTy))
>> goto decline_post_inc;
>> AM.Scale = -AM.Scale;
>> - if (TLI->isLegalAddressingMode(AM, AccessTy))
>> + if (STTI->isLegalAddressingMode(AM, AccessTy))
>> goto decline_post_inc;
>> }
>> }
>> @@ -2097,12 +2096,12 @@
>> // Conservatively assume HasBaseReg is true for now.
>> if (NewOffset < LU.MinOffset) {
>> if (!isAlwaysFoldable(LU.MaxOffset - NewOffset, 0, HasBaseReg,
>> - Kind, AccessTy, TLI))
>> + Kind, AccessTy, STTI))
>> return false;
>> NewMinOffset = NewOffset;
>> } else if (NewOffset > LU.MaxOffset) {
>> if (!isAlwaysFoldable(NewOffset - LU.MinOffset, 0, HasBaseReg,
>> - Kind, AccessTy, TLI))
>> + Kind, AccessTy, STTI))
>> return false;
>> NewMaxOffset = NewOffset;
>> }
>> @@ -2131,7 +2130,7 @@
>> int64_t Offset = ExtractImmediate(Expr, SE);
>>
>> // Basic uses can't accept any offset, for example.
>> - if (!isAlwaysFoldable(Offset, 0, /*HasBaseReg=*/true, Kind, AccessTy, TLI)) {
>> + if (!isAlwaysFoldable(Offset, 0, /*HasBaseReg=*/true, Kind, AccessTy, STTI)) {
>> Expr = Copy;
>> Offset = 0;
>> }
>> @@ -2396,7 +2395,7 @@
>> /// TODO: Consider IVInc free if it's already used in another chains.
>> static bool
>> isProfitableChain(IVChain &Chain, SmallPtrSet<Instruction*, 4> &Users,
>> - ScalarEvolution &SE, const TargetLowering *TLI) {
>> + ScalarEvolution &SE, const ScalarTargetTransformInfo *STTI) {
>> if (StressIVChain)
>> return true;
>>
>> @@ -2654,7 +2653,7 @@
>> for (unsigned UsersIdx = 0, NChains = IVChainVec.size();
>> UsersIdx < NChains; ++UsersIdx) {
>> if (!isProfitableChain(IVChainVec[UsersIdx],
>> - ChainUsersVec[UsersIdx].FarUsers, SE, TLI))
>> + ChainUsersVec[UsersIdx].FarUsers, SE, STTI))
>> continue;
>> // Preserve the chain at UsesIdx.
>> if (ChainIdx != UsersIdx)
>> @@ -2681,7 +2680,8 @@
>>
>> /// Return true if the IVInc can be folded into an addressing mode.
>> static bool canFoldIVIncExpr(const SCEV *IncExpr, Instruction *UserInst,
>> - Value *Operand, const TargetLowering *TLI) {
>> + Value *Operand,
>> + const ScalarTargetTransformInfo *STTI) {
>> const SCEVConstant *IncConst = dyn_cast<SCEVConstant>(IncExpr);
>> if (!IncConst || !isAddressUse(UserInst, Operand))
>> return false;
>> @@ -2691,7 +2691,7 @@
>>
>> int64_t IncOffset = IncConst->getValue()->getSExtValue();
>> if (!isAlwaysFoldable(IncOffset, /*BaseGV=*/0, /*HaseBaseReg=*/false,
>> - LSRUse::Address, getAccessType(UserInst), TLI))
>> + LSRUse::Address, getAccessType(UserInst), STTI))
>> return false;
>>
>> return true;
>> @@ -2762,7 +2762,7 @@
>>
>> // If an IV increment can't be folded, use it as the next IV value.
>> if (!canFoldIVIncExpr(LeftOverExpr, IncI->UserInst, IncI->IVOperand,
>> - TLI)) {
>> + STTI)) {
>> assert(IVTy == IVOper->getType() && "inconsistent IV increment type");
>> IVSrc = IVOper;
>> LeftOverExpr = 0;
>> @@ -3108,7 +3108,7 @@
>> // into an immediate field.
>> if (isAlwaysFoldable(*J, LU.MinOffset, LU.MaxOffset,
>> Base.getNumRegs() > 1,
>> - LU.Kind, LU.AccessTy, TLI, SE))
>> + LU.Kind, LU.AccessTy, STTI, SE))
>> continue;
>>
>> // Collect all operands except *J.
>> @@ -3122,7 +3122,7 @@
>> if (InnerAddOps.size() == 1 &&
>> isAlwaysFoldable(InnerAddOps[0], LU.MinOffset, LU.MaxOffset,
>> Base.getNumRegs() > 1,
>> - LU.Kind, LU.AccessTy, TLI, SE))
>> + LU.Kind, LU.AccessTy, STTI, SE))
>> continue;
>>
>> const SCEV *InnerSum = SE.getAddExpr(InnerAddOps);
>> @@ -3132,9 +3132,9 @@
>>
>> // Add the remaining pieces of the add back into the new formula.
>> const SCEVConstant *InnerSumSC = dyn_cast<SCEVConstant>(InnerSum);
>> - if (TLI && InnerSumSC &&
>> + if (STTI && InnerSumSC &&
>> SE.getTypeSizeInBits(InnerSumSC->getType()) <= 64 &&
>> - TLI->isLegalAddImmediate((uint64_t)F.UnfoldedOffset +
>> + STTI->isLegalAddImmediate((uint64_t)F.UnfoldedOffset +
>> InnerSumSC->getValue()->getZExtValue())) {
>> F.UnfoldedOffset = (uint64_t)F.UnfoldedOffset +
>> InnerSumSC->getValue()->getZExtValue();
>> @@ -3144,8 +3144,8 @@
>>
>> // Add J as its own register, or an unfolded immediate.
>> const SCEVConstant *SC = dyn_cast<SCEVConstant>(*J);
>> - if (TLI && SC && SE.getTypeSizeInBits(SC->getType()) <= 64 &&
>> - TLI->isLegalAddImmediate((uint64_t)F.UnfoldedOffset +
>> + if (STTI && SC && SE.getTypeSizeInBits(SC->getType()) <= 64 &&
>> + STTI->isLegalAddImmediate((uint64_t)F.UnfoldedOffset +
>> SC->getValue()->getZExtValue()))
>> F.UnfoldedOffset = (uint64_t)F.UnfoldedOffset +
>> SC->getValue()->getZExtValue();
>> @@ -3205,7 +3205,7 @@
>> Formula F = Base;
>> F.AM.BaseGV = GV;
>> if (!isLegalUse(F.AM, LU.MinOffset, LU.MaxOffset,
>> - LU.Kind, LU.AccessTy, TLI))
>> + LU.Kind, LU.AccessTy, STTI))
>> continue;
>> F.BaseRegs[i] = G;
>> (void)InsertFormula(LU, LUIdx, F);
>> @@ -3230,7 +3230,7 @@
>> Formula F = Base;
>> F.AM.BaseOffs = (uint64_t)Base.AM.BaseOffs - *I;
>> if (isLegalUse(F.AM, LU.MinOffset - *I, LU.MaxOffset - *I,
>> - LU.Kind, LU.AccessTy, TLI)) {
>> + LU.Kind, LU.AccessTy, STTI)) {
>> // Add the offset to the base register.
>> const SCEV *NewG = SE.getAddExpr(SE.getConstant(G->getType(), *I), G);
>> // If it cancelled out, drop the base register, otherwise update it.
>> @@ -3250,7 +3250,7 @@
>> Formula F = Base;
>> F.AM.BaseOffs = (uint64_t)F.AM.BaseOffs + Imm;
>> if (!isLegalUse(F.AM, LU.MinOffset, LU.MaxOffset,
>> - LU.Kind, LU.AccessTy, TLI))
>> + LU.Kind, LU.AccessTy, STTI))
>> continue;
>> F.BaseRegs[i] = G;
>> (void)InsertFormula(LU, LUIdx, F);
>> @@ -3297,7 +3297,7 @@
>> F.AM.BaseOffs = NewBaseOffs;
>>
>> // Check that this scale is legal.
>> - if (!isLegalUse(F.AM, Offset, Offset, LU.Kind, LU.AccessTy, TLI))
>> + if (!isLegalUse(F.AM, Offset, Offset, LU.Kind, LU.AccessTy, STTI))
>> continue;
>>
>> // Compensate for the use having MinOffset built into it.
>> @@ -3353,12 +3353,12 @@
>> Base.AM.HasBaseReg = Base.BaseRegs.size() > 1;
>> // Check whether this scale is going to be legal.
>> if (!isLegalUse(Base.AM, LU.MinOffset, LU.MaxOffset,
>> - LU.Kind, LU.AccessTy, TLI)) {
>> + LU.Kind, LU.AccessTy, STTI)) {
>> // As a special-case, handle special out-of-loop Basic users specially.
>> // TODO: Reconsider this special case.
>> if (LU.Kind == LSRUse::Basic &&
>> isLegalUse(Base.AM, LU.MinOffset, LU.MaxOffset,
>> - LSRUse::Special, LU.AccessTy, TLI) &&
>> + LSRUse::Special, LU.AccessTy, STTI) &&
>> LU.AllFixupsOutsideLoop)
>> LU.Kind = LSRUse::Special;
>> else
>> @@ -3391,8 +3391,8 @@
>>
>> /// GenerateTruncates - Generate reuse formulae from different IV types.
>> void LSRInstance::GenerateTruncates(LSRUse &LU, unsigned LUIdx, Formula Base) {
>> - // This requires TargetLowering to tell us which truncates are free.
>> - if (!TLI) return;
>> + // This requires ScalarTargetTransformInfo to tell us which truncates are free.
>> + if (!STTI) return;
>>
>> // Don't bother truncating symbolic values.
>> if (Base.AM.BaseGV) return;
>> @@ -3405,7 +3405,7 @@
>> for (SmallSetVector<Type *, 4>::const_iterator
>> I = Types.begin(), E = Types.end(); I != E; ++I) {
>> Type *SrcTy = *I;
>> - if (SrcTy != DstTy && TLI->isTruncateFree(SrcTy, DstTy)) {
>> + if (SrcTy != DstTy && STTI->isTruncateFree(SrcTy, DstTy)) {
>> Formula F = Base;
>>
>> if (F.ScaledReg) F.ScaledReg = SE.getAnyExtendExpr(F.ScaledReg, *I);
>> @@ -3561,7 +3561,7 @@
>> Formula NewF = F;
>> NewF.AM.BaseOffs = Offs;
>> if (!isLegalUse(NewF.AM, LU.MinOffset, LU.MaxOffset,
>> - LU.Kind, LU.AccessTy, TLI))
>> + LU.Kind, LU.AccessTy, STTI))
>> continue;
>> NewF.ScaledReg = SE.getAddExpr(NegImmS, NewF.ScaledReg);
>>
>> @@ -3586,9 +3586,9 @@
>> Formula NewF = F;
>> NewF.AM.BaseOffs = (uint64_t)NewF.AM.BaseOffs + Imm;
>> if (!isLegalUse(NewF.AM, LU.MinOffset, LU.MaxOffset,
>> - LU.Kind, LU.AccessTy, TLI)) {
>> - if (!TLI ||
>> - !TLI->isLegalAddImmediate((uint64_t)NewF.UnfoldedOffset + Imm))
>> + LU.Kind, LU.AccessTy, STTI)) {
>> + if (!STTI ||
>> + !STTI->isLegalAddImmediate((uint64_t)NewF.UnfoldedOffset + Imm))
>> continue;
>> NewF = F;
>> NewF.UnfoldedOffset = (uint64_t)NewF.UnfoldedOffset + Imm;
>> @@ -3900,7 +3900,7 @@
>> Formula &F = LUThatHas->Formulae[i];
>> if (!isLegalUse(F.AM,
>> LUThatHas->MinOffset, LUThatHas->MaxOffset,
>> - LUThatHas->Kind, LUThatHas->AccessTy, TLI)) {
>> + LUThatHas->Kind, LUThatHas->AccessTy, STTI)) {
>> DEBUG(dbgs() << " Deleting "; F.print(dbgs());
>> dbgs() << '\n');
>> LUThatHas->DeleteFormula(F);
>> @@ -4589,12 +4589,12 @@
>> Changed |= DeleteTriviallyDeadInstructions(DeadInsts);
>> }
>>
>> -LSRInstance::LSRInstance(const TargetLowering *tli, Loop *l, Pass *P)
>> +LSRInstance::LSRInstance(const ScalarTargetTransformInfo *stti, Loop *l, Pass *P)
>> : IU(P->getAnalysis<IVUsers>()),
>> SE(P->getAnalysis<ScalarEvolution>()),
>> DT(P->getAnalysis<DominatorTree>()),
>> LI(P->getAnalysis<LoopInfo>()),
>> - TLI(tli), L(l), Changed(false), IVIncInsertPos(0) {
>> + STTI(stti), L(l), Changed(false), IVIncInsertPos(0) {
>>
>> // If LoopSimplify form is not available, stay out of trouble.
>> if (!L->isLoopSimplifyForm())
>> @@ -4684,7 +4684,7 @@
>> for (SmallVectorImpl<Formula>::const_iterator J = LU.Formulae.begin(),
>> JE = LU.Formulae.end(); J != JE; ++J)
>> assert(isLegalUse(J->AM, LU.MinOffset, LU.MaxOffset,
>> - LU.Kind, LU.AccessTy, TLI) &&
>> + LU.Kind, LU.AccessTy, STTI) &&
>> "Illegal formula generated!");
>> };
>> #endif
>> @@ -4757,13 +4757,13 @@
>> namespace {
>>
>> class LoopStrengthReduce : public LoopPass {
>> - /// TLI - Keep a pointer of a TargetLowering to consult for determining
>> - /// transformation profitability.
>> - const TargetLowering *const TLI;
>> + /// ScalarTargetTransformInfo provides target information that is needed
>> + /// for strength reducing loops.
>> + const ScalarTargetTransformInfo *STTI;
>>
>> public:
>> static char ID; // Pass ID, replacement for typeid
>> - explicit LoopStrengthReduce(const TargetLowering *tli = 0);
>> + LoopStrengthReduce();
>>
>> private:
>> bool runOnLoop(Loop *L, LPPassManager &LPM);
>> @@ -4783,13 +4783,12 @@
>> INITIALIZE_PASS_END(LoopStrengthReduce, "loop-reduce",
>> "Loop Strength Reduction", false, false)
>>
>> -
>> -Pass *llvm::createLoopStrengthReducePass(const TargetLowering *TLI) {
>> - return new LoopStrengthReduce(TLI);
>> +Pass *llvm::createLoopStrengthReducePass() {
>> + return new LoopStrengthReduce();
>> }
>>
>> -LoopStrengthReduce::LoopStrengthReduce(const TargetLowering *tli)
>> - : LoopPass(ID), TLI(tli) {
>> +LoopStrengthReduce::LoopStrengthReduce()
>> + : LoopPass(ID), STTI(0) {
>> initializeLoopStrengthReducePass(*PassRegistry::getPassRegistry());
>> }
>>
>> @@ -4815,8 +4814,13 @@
>> bool LoopStrengthReduce::runOnLoop(Loop *L, LPPassManager & /*LPM*/) {
>> bool Changed = false;
>>
>> + TargetTransformInfo *TTI = getAnalysisIfAvailable<TargetTransformInfo>();
>> +
>> + if (TTI)
>> + STTI = TTI->getScalarTargetTransformInfo();
>> +
>> // Run the main LSR transformation.
>> - Changed |= LSRInstance(TLI, L, this).getChanged();
>> + Changed |= LSRInstance(STTI, L, this).getChanged();
>>
>> // Remove any extra phis created by processing inner loops.
>> Changed |= DeleteDeadPHIs(L->getHeader());
>> @@ -4827,7 +4831,7 @@
>> Rewriter.setDebugType(DEBUG_TYPE);
>> #endif
>> unsigned numFolded = Rewriter.
>> - replaceCongruentIVs(L, &getAnalysis<DominatorTree>(), DeadInsts, TLI);
>> + replaceCongruentIVs(L, &getAnalysis<DominatorTree>(), DeadInsts, STTI);
>> if (numFolded) {
>> Changed = true;
>> DeleteTriviallyDeadInstructions(DeadInsts);
>>
>> Modified: llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Utils/LowerInvoke.cpp Wed Oct 10 17:04:55 2012
>> @@ -45,10 +45,10 @@
>> #include "llvm/Pass.h"
>> #include "llvm/Transforms/Utils/BasicBlockUtils.h"
>> #include "llvm/Transforms/Utils/Local.h"
>> +#include "llvm/TargetTransformInfo.h"
>> #include "llvm/ADT/SmallVector.h"
>> #include "llvm/ADT/Statistic.h"
>> #include "llvm/Support/CommandLine.h"
>> -#include "llvm/Target/TargetLowering.h"
>> #include <csetjmp>
>> #include <set>
>> using namespace llvm;
>> @@ -70,15 +70,14 @@
>> Constant *SetJmpFn, *LongJmpFn, *StackSaveFn, *StackRestoreFn;
>> bool useExpensiveEHSupport;
>>
>> - // We peek in TLI to grab the target's jmp_buf size and alignment
>> - const TargetLowering *TLI;
>> + // We peek in STTI to grab the target's jmp_buf size and alignment
>> + const ScalarTargetTransformInfo *STTI;
>>
>> public:
>> static char ID; // Pass identification, replacement for typeid
>> - explicit LowerInvoke(const TargetLowering *tli = NULL,
>> - bool useExpensiveEHSupport = ExpensiveEHSupport)
>> + explicit LowerInvoke(bool useExpensiveEHSupport = ExpensiveEHSupport)
>> : FunctionPass(ID), useExpensiveEHSupport(useExpensiveEHSupport),
>> - TLI(tli) {
>> + STTI(0) {
>> initializeLowerInvokePass(*PassRegistry::getPassRegistry());
>> }
>> bool doInitialization(Module &M);
>> @@ -108,21 +107,24 @@
>> char &llvm::LowerInvokePassID = LowerInvoke::ID;
>>
>> // Public Interface To the LowerInvoke pass.
>> -FunctionPass *llvm::createLowerInvokePass(const TargetLowering *TLI) {
>> - return new LowerInvoke(TLI, ExpensiveEHSupport);
>> +FunctionPass *llvm::createLowerInvokePass() {
>> + return new LowerInvoke(ExpensiveEHSupport);
>> }
>> -FunctionPass *llvm::createLowerInvokePass(const TargetLowering *TLI,
>> - bool useExpensiveEHSupport) {
>> - return new LowerInvoke(TLI, useExpensiveEHSupport);
>> +FunctionPass *llvm::createLowerInvokePass(bool useExpensiveEHSupport) {
>> + return new LowerInvoke(useExpensiveEHSupport);
>> }
>>
>> // doInitialization - Make sure that there is a prototype for abort in the
>> // current module.
>> bool LowerInvoke::doInitialization(Module &M) {
>> + TargetTransformInfo *TTI = getAnalysisIfAvailable<TargetTransformInfo>();
>> + if (TTI)
>> + STTI = TTI->getScalarTargetTransformInfo();
>> +
>> Type *VoidPtrTy = Type::getInt8PtrTy(M.getContext());
>> if (useExpensiveEHSupport) {
>> // Insert a type for the linked list of jump buffers.
>> - unsigned JBSize = TLI ? TLI->getJumpBufSize() : 0;
>> + unsigned JBSize = STTI ? STTI->getJumpBufSize() : 0;
>> JBSize = JBSize ? JBSize : 200;
>> Type *JmpBufTy = ArrayType::get(VoidPtrTy, JBSize);
>>
>> @@ -430,7 +432,7 @@
>> // Create an alloca for the incoming jump buffer ptr and the new jump buffer
>> // that needs to be restored on all exits from the function. This is an
>> // alloca because the value needs to be live across invokes.
>> - unsigned Align = TLI ? TLI->getJumpBufAlignment() : 0;
>> + unsigned Align = STTI ? STTI->getJumpBufAlignment() : 0;
>> AllocaInst *JmpBuf =
>> new AllocaInst(JBLinkTy, 0, Align,
>> "jblink", F.begin()->begin());
>> @@ -575,6 +577,10 @@
>> }
>>
>> bool LowerInvoke::runOnFunction(Function &F) {
>> + TargetTransformInfo *TTI = getAnalysisIfAvailable<TargetTransformInfo>();
>> + if (TTI)
>> + STTI = TTI->getScalarTargetTransformInfo();
>> +
>> if (useExpensiveEHSupport)
>> return insertExpensiveEHSupport(F);
>> else
>>
>> Modified: llvm/trunk/lib/VMCore/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/CMakeLists.txt?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/VMCore/CMakeLists.txt (original)
>> +++ llvm/trunk/lib/VMCore/CMakeLists.txt Wed Oct 10 17:04:55 2012
>> @@ -33,6 +33,7 @@
>> PrintModulePass.cpp
>> Type.cpp
>> TypeFinder.cpp
>> + TargetTransformInfo.cpp
>> Use.cpp
>> User.cpp
>> Value.cpp
>>
>> Added: llvm/trunk/lib/VMCore/TargetTransformInfo.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/TargetTransformInfo.cpp?rev=165665&view=auto
>> ==============================================================================
>> --- llvm/trunk/lib/VMCore/TargetTransformInfo.cpp (added)
>> +++ llvm/trunk/lib/VMCore/TargetTransformInfo.cpp Wed Oct 10 17:04:55 2012
>> @@ -0,0 +1,27 @@
>> +//===- llvm/VMCore/TargetTransformInfo.cpp ----------------------*- C++ -*-===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "llvm/TargetTransformInfo.h"
>> +#include "llvm/Support/ErrorHandling.h"
>> +
>> +using namespace llvm;
>> +
>> +/// Default ctor.
>> +///
>> +/// @note This has to exist, because this is a pass, but it should never be
>> +/// used.
>> +TargetTransformInfo::TargetTransformInfo() : ImmutablePass(ID) {
>> + report_fatal_error("Bad TargetTransformInfo ctor used. "
>> + "Tool did not specify a TargetTransformInfo to use?");
>> +}
>> +
>> +INITIALIZE_PASS(TargetTransformInfo, "TargetTransformInfo",
>> + "Target Transform Info", false, true)
>> +char TargetTransformInfo::ID = 0;
>> +
>>
>> Modified: llvm/trunk/tools/llc/llc.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llc/llc.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/tools/llc/llc.cpp (original)
>> +++ llvm/trunk/tools/llc/llc.cpp Wed Oct 10 17:04:55 2012
>> @@ -21,6 +21,7 @@
>> #include "llvm/ADT/Triple.h"
>> #include "llvm/Assembly/PrintModulePass.h"
>> #include "llvm/Support/IRReader.h"
>> +#include "llvm/CodeGen/CommandFlags.h"
>> #include "llvm/CodeGen/LinkAllAsmWriterComponents.h"
>> #include "llvm/CodeGen/LinkAllCodegenComponents.h"
>> #include "llvm/MC/SubtargetFeature.h"
>> @@ -62,216 +63,13 @@
>> static cl::opt<std::string>
>> TargetTriple("mtriple", cl::desc("Override target triple for module"));
>>
>> -static cl::opt<std::string>
>> -MArch("march", cl::desc("Architecture to generate code for (see --version)"));
>> -
>> -static cl::opt<std::string>
>> -MCPU("mcpu",
>> - cl::desc("Target a specific cpu type (-mcpu=help for details)"),
>> - cl::value_desc("cpu-name"),
>> - cl::init(""));
>> -
>> -static cl::list<std::string>
>> -MAttrs("mattr",
>> - cl::CommaSeparated,
>> - cl::desc("Target specific attributes (-mattr=help for details)"),
>> - cl::value_desc("a1,+a2,-a3,..."));
>> -
>> -static cl::opt<Reloc::Model>
>> -RelocModel("relocation-model",
>> - cl::desc("Choose relocation model"),
>> - cl::init(Reloc::Default),
>> - cl::values(
>> - clEnumValN(Reloc::Default, "default",
>> - "Target default relocation model"),
>> - clEnumValN(Reloc::Static, "static",
>> - "Non-relocatable code"),
>> - clEnumValN(Reloc::PIC_, "pic",
>> - "Fully relocatable, position independent code"),
>> - clEnumValN(Reloc::DynamicNoPIC, "dynamic-no-pic",
>> - "Relocatable external references, non-relocatable code"),
>> - clEnumValEnd));
>> -
>> -static cl::opt<llvm::CodeModel::Model>
>> -CMModel("code-model",
>> - cl::desc("Choose code model"),
>> - cl::init(CodeModel::Default),
>> - cl::values(clEnumValN(CodeModel::Default, "default",
>> - "Target default code model"),
>> - clEnumValN(CodeModel::Small, "small",
>> - "Small code model"),
>> - clEnumValN(CodeModel::Kernel, "kernel",
>> - "Kernel code model"),
>> - clEnumValN(CodeModel::Medium, "medium",
>> - "Medium code model"),
>> - clEnumValN(CodeModel::Large, "large",
>> - "Large code model"),
>> - clEnumValEnd));
>> -
>> -static cl::opt<bool>
>> -RelaxAll("mc-relax-all",
>> - cl::desc("When used with filetype=obj, "
>> - "relax all fixups in the emitted object file"));
>> -
>> -cl::opt<TargetMachine::CodeGenFileType>
>> -FileType("filetype", cl::init(TargetMachine::CGFT_AssemblyFile),
>> - cl::desc("Choose a file type (not all types are supported by all targets):"),
>> - cl::values(
>> - clEnumValN(TargetMachine::CGFT_AssemblyFile, "asm",
>> - "Emit an assembly ('.s') file"),
>> - clEnumValN(TargetMachine::CGFT_ObjectFile, "obj",
>> - "Emit a native object ('.o') file"),
>> - clEnumValN(TargetMachine::CGFT_Null, "null",
>> - "Emit nothing, for performance testing"),
>> - clEnumValEnd));
>> -
>> cl::opt<bool> NoVerify("disable-verify", cl::Hidden,
>> cl::desc("Do not verify input module"));
>>
>> -cl::opt<bool> DisableDotLoc("disable-dot-loc", cl::Hidden,
>> - cl::desc("Do not use .loc entries"));
>> -
>> -cl::opt<bool> DisableCFI("disable-cfi", cl::Hidden,
>> - cl::desc("Do not use .cfi_* directives"));
>> -
>> -cl::opt<bool> EnableDwarfDirectory("enable-dwarf-directory", cl::Hidden,
>> - cl::desc("Use .file directives with an explicit directory."));
>> -
>> -static cl::opt<bool>
>> -DisableRedZone("disable-red-zone",
>> - cl::desc("Do not emit code that uses the red zone."),
>> - cl::init(false));
>> -
>> -static cl::opt<bool>
>> -EnableFPMAD("enable-fp-mad",
>> - cl::desc("Enable less precise MAD instructions to be generated"),
>> - cl::init(false));
>> -
>> -static cl::opt<bool>
>> -DisableFPElim("disable-fp-elim",
>> - cl::desc("Disable frame pointer elimination optimization"),
>> - cl::init(false));
>> -
>> -static cl::opt<bool>
>> -DisableFPElimNonLeaf("disable-non-leaf-fp-elim",
>> - cl::desc("Disable frame pointer elimination optimization for non-leaf funcs"),
>> - cl::init(false));
>> -
>> -static cl::opt<bool>
>> -EnableUnsafeFPMath("enable-unsafe-fp-math",
>> - cl::desc("Enable optimizations that may decrease FP precision"),
>> - cl::init(false));
>> -
>> -static cl::opt<bool>
>> -EnableNoInfsFPMath("enable-no-infs-fp-math",
>> - cl::desc("Enable FP math optimizations that assume no +-Infs"),
>> - cl::init(false));
>> -
>> -static cl::opt<bool>
>> -EnableNoNaNsFPMath("enable-no-nans-fp-math",
>> - cl::desc("Enable FP math optimizations that assume no NaNs"),
>> - cl::init(false));
>> -
>> -static cl::opt<bool>
>> -EnableHonorSignDependentRoundingFPMath("enable-sign-dependent-rounding-fp-math",
>> - cl::Hidden,
>> - cl::desc("Force codegen to assume rounding mode can change dynamically"),
>> - cl::init(false));
>> -
>> -static cl::opt<bool>
>> -GenerateSoftFloatCalls("soft-float",
>> - cl::desc("Generate software floating point library calls"),
>> - cl::init(false));
>> -
>> -static cl::opt<llvm::FloatABI::ABIType>
>> -FloatABIForCalls("float-abi",
>> - cl::desc("Choose float ABI type"),
>> - cl::init(FloatABI::Default),
>> - cl::values(
>> - clEnumValN(FloatABI::Default, "default",
>> - "Target default float ABI type"),
>> - clEnumValN(FloatABI::Soft, "soft",
>> - "Soft float ABI (implied by -soft-float)"),
>> - clEnumValN(FloatABI::Hard, "hard",
>> - "Hard float ABI (uses FP registers)"),
>> - clEnumValEnd));
>> -
>> -static cl::opt<llvm::FPOpFusion::FPOpFusionMode>
>> -FuseFPOps("fp-contract",
>> - cl::desc("Enable aggresive formation of fused FP ops"),
>> - cl::init(FPOpFusion::Standard),
>> - cl::values(
>> - clEnumValN(FPOpFusion::Fast, "fast",
>> - "Fuse FP ops whenever profitable"),
>> - clEnumValN(FPOpFusion::Standard, "on",
>> - "Only fuse 'blessed' FP ops."),
>> - clEnumValN(FPOpFusion::Strict, "off",
>> - "Only fuse FP ops when the result won't be effected."),
>> - clEnumValEnd));
>> -
>> -static cl::opt<bool>
>> -DontPlaceZerosInBSS("nozero-initialized-in-bss",
>> - cl::desc("Don't place zero-initialized symbols into bss section"),
>> - cl::init(false));
>> -
>> -static cl::opt<bool>
>> +cl::opt<bool>
>> DisableSimplifyLibCalls("disable-simplify-libcalls",
>> - cl::desc("Disable simplify-libcalls"),
>> - cl::init(false));
>> -
>> -static cl::opt<bool>
>> -EnableGuaranteedTailCallOpt("tailcallopt",
>> - cl::desc("Turn fastcc calls into tail calls by (potentially) changing ABI."),
>> - cl::init(false));
>> -
>> -static cl::opt<bool>
>> -DisableTailCalls("disable-tail-calls",
>> - cl::desc("Never emit tail calls"),
>> - cl::init(false));
>> -
>> -static cl::opt<unsigned>
>> -OverrideStackAlignment("stack-alignment",
>> - cl::desc("Override default stack alignment"),
>> - cl::init(0));
>> -
>> -static cl::opt<bool>
>> -EnableRealignStack("realign-stack",
>> - cl::desc("Realign stack if needed"),
>> - cl::init(true));
>> -
>> -static cl::opt<std::string>
>> -TrapFuncName("trap-func", cl::Hidden,
>> - cl::desc("Emit a call to trap function rather than a trap instruction"),
>> - cl::init(""));
>> -
>> -static cl::opt<bool>
>> -EnablePIE("enable-pie",
>> - cl::desc("Assume the creation of a position independent executable."),
>> - cl::init(false));
>> -
>> -static cl::opt<bool>
>> -SegmentedStacks("segmented-stacks",
>> - cl::desc("Use segmented stacks if possible."),
>> - cl::init(false));
>> -
>> -static cl::opt<bool>
>> -UseInitArray("use-init-array",
>> - cl::desc("Use .init_array instead of .ctors."),
>> - cl::init(false));
>> -
>> -static cl::opt<std::string> StopAfter("stop-after",
>> - cl::desc("Stop compilation after a specific pass"),
>> - cl::value_desc("pass-name"),
>> - cl::init(""));
>> -static cl::opt<std::string> StartAfter("start-after",
>> - cl::desc("Resume compilation after a specific pass"),
>> - cl::value_desc("pass-name"),
>> - cl::init(""));
>> -
>> -static cl::opt<unsigned>
>> -SSPBufferSize("stack-protector-buffer-size", cl::init(8),
>> - cl::desc("Lower bound for a buffer to be considered for "
>> - "stack protection"));
>> + cl::desc("Disable simplify-libcalls"),
>> + cl::init(false));
>>
>> // GetFileNameRoot - Helper function to get the basename of a filename.
>> static inline std::string
>> @@ -505,6 +303,11 @@
>> TLI->disableAllFunctions();
>> PM.add(TLI);
>>
>> + if (target.get()) {
>> + PM.add(new TargetTransformInfo(target->getScalarTargetTransformInfo(),
>> + target->getVectorTargetTransformInfo()));
>> + }
>> +
>> // Add the target data from the target machine, if it exists, or the module.
>> if (const DataLayout *TD = Target.getDataLayout())
>> PM.add(new DataLayout(*TD));
>>
>> Modified: llvm/trunk/tools/opt/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/opt/CMakeLists.txt?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/tools/opt/CMakeLists.txt (original)
>> +++ llvm/trunk/tools/opt/CMakeLists.txt Wed Oct 10 17:04:55 2012
>> @@ -1,4 +1,4 @@
>> -set(LLVM_LINK_COMPONENTS bitreader asmparser bitwriter instrumentation scalaropts ipo vectorize)
>> +set(LLVM_LINK_COMPONENTS ${LLVM_TARGETS_TO_BUILD} bitreader asmparser bitwriter instrumentation scalaropts ipo vectorize)
>>
>> add_llvm_tool(opt
>> AnalysisWrappers.cpp
>>
>> Modified: llvm/trunk/tools/opt/LLVMBuild.txt
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/opt/LLVMBuild.txt?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/tools/opt/LLVMBuild.txt (original)
>> +++ llvm/trunk/tools/opt/LLVMBuild.txt Wed Oct 10 17:04:55 2012
>> @@ -19,4 +19,4 @@
>> type = Tool
>> name = opt
>> parent = Tools
>> -required_libraries = AsmParser BitReader BitWriter IPO Instrumentation Scalar
>> +required_libraries = AsmParser BitReader BitWriter IPO Instrumentation Scalar all-targets
>>
>> Modified: llvm/trunk/tools/opt/Makefile
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/opt/Makefile?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/tools/opt/Makefile (original)
>> +++ llvm/trunk/tools/opt/Makefile Wed Oct 10 17:04:55 2012
>> @@ -9,6 +9,6 @@
>>
>> LEVEL := ../..
>> TOOLNAME := opt
>> -LINK_COMPONENTS := bitreader bitwriter asmparser instrumentation scalaropts ipo vectorize
>> +LINK_COMPONENTS := bitreader bitwriter asmparser instrumentation scalaropts ipo vectorize all-targets
>>
>> include $(LEVEL)/Makefile.common
>>
>> Modified: llvm/trunk/tools/opt/opt.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/opt/opt.cpp?rev=165665&r1=165664&r2=165665&view=diff
>> ==============================================================================
>> --- llvm/trunk/tools/opt/opt.cpp (original)
>> +++ llvm/trunk/tools/opt/opt.cpp Wed Oct 10 17:04:55 2012
>> @@ -18,6 +18,7 @@
>> #include "llvm/Module.h"
>> #include "llvm/PassManager.h"
>> #include "llvm/CallGraphSCCPass.h"
>> +#include "llvm/CodeGen/CommandFlags.h"
>> #include "llvm/Bitcode/ReaderWriter.h"
>> #include "llvm/Assembly/PrintModulePass.h"
>> #include "llvm/Analysis/Verifier.h"
>> @@ -36,7 +37,9 @@
>> #include "llvm/Support/PluginLoader.h"
>> #include "llvm/Support/PrettyStackTrace.h"
>> #include "llvm/Support/SystemUtils.h"
>> +#include "llvm/Support/TargetRegistry.h"
>> #include "llvm/Support/ToolOutputFile.h"
>> +#include "llvm/MC/SubtargetFeature.h"
>> #include "llvm/LinkAllPasses.h"
>> #include "llvm/LinkAllVMCore.h"
>> #include "llvm/Transforms/IPO/PassManagerBuilder.h"
>> @@ -478,6 +481,75 @@
>> /*RunInliner=*/ !DisableInline);
>> }
>>
>> +//===----------------------------------------------------------------------===//
>> +// CodeGen-related helper functions.
>> +//
>> +static TargetOptions GetTargetOptions() {
>> + TargetOptions Options;
>> + Options.LessPreciseFPMADOption = EnableFPMAD;
>> + Options.NoFramePointerElim = DisableFPElim;
>> + Options.NoFramePointerElimNonLeaf = DisableFPElimNonLeaf;
>> + Options.AllowFPOpFusion = FuseFPOps;
>> + Options.UnsafeFPMath = EnableUnsafeFPMath;
>> + Options.NoInfsFPMath = EnableNoInfsFPMath;
>> + Options.NoNaNsFPMath = EnableNoNaNsFPMath;
>> + Options.HonorSignDependentRoundingFPMathOption =
>> + EnableHonorSignDependentRoundingFPMath;
>> + Options.UseSoftFloat = GenerateSoftFloatCalls;
>> + if (FloatABIForCalls != FloatABI::Default)
>> + Options.FloatABIType = FloatABIForCalls;
>> + Options.NoZerosInBSS = DontPlaceZerosInBSS;
>> + Options.GuaranteedTailCallOpt = EnableGuaranteedTailCallOpt;
>> + Options.DisableTailCalls = DisableTailCalls;
>> + Options.StackAlignmentOverride = OverrideStackAlignment;
>> + Options.RealignStack = EnableRealignStack;
>> + Options.TrapFuncName = TrapFuncName;
>> + Options.PositionIndependentExecutable = EnablePIE;
>> + Options.EnableSegmentedStacks = SegmentedStacks;
>> + Options.UseInitArray = UseInitArray;
>> + Options.SSPBufferSize = SSPBufferSize;
>> + return Options;
>> +}
>> +
>> +CodeGenOpt::Level GetCodeGenOptLevel() {
>> + if (OptLevelO1)
>> + return CodeGenOpt::Less;
>> + if (OptLevelO2)
>> + return CodeGenOpt::Default;
>> + if (OptLevelO3)
>> + return CodeGenOpt::Aggressive;
>> + return CodeGenOpt::None;
>> +}
>> +
>> +// Returns the TargetMachine instance or zero if no triple is provided.
>> +static TargetMachine* GetTargetMachine(std::string TripleStr) {
>> + if (TripleStr.empty())
>> + return 0;
>> +
>> + // Get the target specific parser.
>> + std::string Error;
>> + Triple TheTriple(Triple::normalize(TargetTriple));
>> +
>> + const Target *TheTarget = TargetRegistry::lookupTarget(MArch, TheTriple,
>> + Error);
>> + if (!TheTarget) {
>> + return 0;
>> + }
>> +
>> + // Package up features to be passed to target/subtarget
>> + std::string FeaturesStr;
>> + if (MAttrs.size()) {
>> + SubtargetFeatures Features;
>> + for (unsigned i = 0; i != MAttrs.size(); ++i)
>> + Features.AddFeature(MAttrs[i]);
>> + FeaturesStr = Features.getString();
>> + }
>> +
>> + return TheTarget->createTargetMachine(TheTriple.getTriple(),
>> + MCPU, FeaturesStr, GetTargetOptions(),
>> + RelocModel, CMModel,
>> + GetCodeGenOptLevel());
>> +}
>>
>> //===----------------------------------------------------------------------===//
>> // main for opt
>> @@ -579,6 +651,12 @@
>> if (TD)
>> Passes.add(TD);
>>
>> + std::auto_ptr<TargetMachine> TM(GetTargetMachine(TargetTriple));
>> + if (TM.get()) {
>> + Passes.add(new TargetTransformInfo(TM->getScalarTargetTransformInfo(),
>> + TM->getVectorTargetTransformInfo()));
>> + }
>> +
>> OwningPtr<FunctionPassManager> FPasses;
>> if (OptLevelO1 || OptLevelO2 || OptLevelOs || OptLevelOz || OptLevelO3) {
>> FPasses.reset(new FunctionPassManager(M.get()));
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list