[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