[llvm-commits] [llvm] r165941 - in /llvm/trunk: include/llvm-c/ include/llvm/ include/llvm/Target/ include/llvm/Transforms/Utils/ lib/Analysis/ lib/CodeGen/ lib/CodeGen/AsmPrinter/ lib/CodeGen/SelectionDAG/ lib/ExecutionEngine/ lib/ExecutionEngin

Micah Villmow villmow at gmail.com
Wed Oct 17 08:31:57 PDT 2012


Thanks for the review chandler, I'll see what I can do to clean it up
and get some tests cases.

Micah

On Wed, Oct 17, 2012 at 12:38 AM, Chandler Carruth <chandlerc at google.com> wrote:
> Micah, this patch is causing me some serious anxiety. A few meta level
> points:
>
> 1) The style of code you're introducing isn't terribly clean. It adds
> trailing white space, inconsistent spacing and indenting, as well as
> extraordinarily long expressions that are essentially unreadable. There are
> a lot of ternary operators and binary operators that span 2 and 3 lines now.
>
> 2) Partially causing #1 I suspect, you've ended up with really verbose and
> awkward API patterns. There is a lot of code which is comparing or using the
> size of a pointer. You ended up writing code that introduces some variation
> on
> "TD->getPointerSizeInBits(cast<PointerType>(PointerValue->getType())->getAddressSpace())".
> This can't be the best API. ;] In fact, why not just
> "TD->getTypeSizeInBits(PointerValue->getType())"? Maybe add
> "TD->getValueSizeInBits(PointerValue)"? That would simplify much of this
> awkward code.
>
> 3) I'm unconvinced that you have consistently made the correct decision
> about address spaces here. For example, it was very wrong in SROA, which I
> fixed here: r166091.
>
> I think the root cause of #3 is that this change introduced no tests which
> actually demonstrate we can handle differently sized pointers across
> different address spaces. Without such tests, these changes are essentially
> speculative. Nothing will break, because nothing changes the behavior, but
> that doesn't mean these won't contain serious errors.
>
> To a certain extent, I almost wonder if it would have been better to use
> address space '0' everywhere, and to update them only as we march through
> the optimizations adding tests to ensure that they behave correctly. That
> way, every time we change a '0' to an actual address space, we'll have a
> test that goes in with that change to ensure we don't lose it. If we're
> unable to write such a test, that can indicate that this is either dead code
> or that there is no pointer with an address space involved.
>
> Since we've come a different way, I wonder if you could really prioritize at
> least adding testing infrastructure to LLVM such that we can demonstrate
> incorrect address space usages with regression tests, and further if you
> could try to go through the optimization passes you've changed here and add
> test cases to cover most if not all of them so that we know these passes are
> actually passing the *right* address space in addition to passing *some*
> address space. Does that seem reasonable? I'm not sure how else to check
> that these changes are actually working, and I know that you actually have a
> motivating use case, and so I don't want us to discover problems later....
>
> -Chandler
>
>
> On Mon, Oct 15, 2012 at 9:24 AM, Micah Villmow <villmow at gmail.com> wrote:
>>
>> Author: mvillmow
>> Date: Mon Oct 15 11:24:29 2012
>> New Revision: 165941
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=165941&view=rev
>> Log:
>> Resubmit the changes to llvm core to update the functions to support
>> different pointer sizes on a per address space basis.
>>
>> Modified:
>>     llvm/trunk/include/llvm-c/Target.h
>>     llvm/trunk/include/llvm/DataLayout.h
>>     llvm/trunk/include/llvm/Instructions.h
>>     llvm/trunk/include/llvm/Target/TargetLowering.h
>>     llvm/trunk/include/llvm/Transforms/Utils/Local.h
>>     llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
>>     llvm/trunk/lib/Analysis/CodeMetrics.cpp
>>     llvm/trunk/lib/Analysis/ConstantFolding.cpp
>>     llvm/trunk/lib/Analysis/InlineCost.cpp
>>     llvm/trunk/lib/Analysis/InstructionSimplify.cpp
>>     llvm/trunk/lib/Analysis/ValueTracking.cpp
>>     llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
>>     llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp
>>     llvm/trunk/lib/CodeGen/AsmPrinter/OcamlGCPrinter.cpp
>>     llvm/trunk/lib/CodeGen/MachineFunction.cpp
>>     llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
>>     llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
>>     llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp
>>     llvm/trunk/lib/ExecutionEngine/Interpreter/Execution.cpp
>>     llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
>>     llvm/trunk/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp
>>     llvm/trunk/lib/Target/ARM/ARMELFWriterInfo.cpp
>>     llvm/trunk/lib/Target/MBlaze/MBlazeELFWriterInfo.cpp
>>     llvm/trunk/lib/Target/MSP430/MSP430ISelLowering.cpp
>>     llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
>>     llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp
>>     llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp
>>     llvm/trunk/lib/Target/Target.cpp
>>     llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp
>>     llvm/trunk/lib/Target/X86/X86FrameLowering.cpp
>>     llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
>>     llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp
>>     llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
>>     llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
>>     llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp
>>     llvm/trunk/lib/Transforms/Scalar/SROA.cpp
>>     llvm/trunk/lib/Transforms/Utils/Local.cpp
>>
>> Modified: llvm/trunk/include/llvm-c/Target.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Target.h?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm-c/Target.h (original)
>> +++ llvm/trunk/include/llvm-c/Target.h Mon Oct 15 11:24:29 2012
>> @@ -172,10 +172,20 @@
>>      See the method llvm::DataLayout::getPointerSize. */
>>  unsigned LLVMPointerSize(LLVMTargetDataRef);
>>
>> +/** Returns the pointer size in bytes for a target for a specified
>> +    address space.
>> +    See the method llvm::DataLayout::getPointerSize. */
>> +unsigned LLVMPointerSizeForAS(LLVMTargetDataRef, unsigned AS);
>> +
>>  /** Returns the integer type that is the same size as a pointer on a
>> target.
>>      See the method llvm::DataLayout::getIntPtrType. */
>>  LLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef);
>>
>> +/** Returns the integer type that is the same size as a pointer on a
>> target.
>> +    This version allows the address space to be specified.
>> +    See the method llvm::DataLayout::getIntPtrType. */
>> +LLVMTypeRef LLVMIntPtrTypeForAS(LLVMTargetDataRef, unsigned AS);
>> +
>>  /** Computes the size of a type in bytes for a target.
>>      See the method llvm::DataLayout::getTypeSizeInBits. */
>>  unsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef, LLVMTypeRef);
>>
>> Modified: llvm/trunk/include/llvm/DataLayout.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DataLayout.h?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/DataLayout.h (original)
>> +++ llvm/trunk/include/llvm/DataLayout.h Mon Oct 15 11:24:29 2012
>> @@ -231,9 +231,7 @@
>>    }
>>
>>    /// Layout pointer alignment
>> -  /// FIXME: The defaults need to be removed once all of
>> -  /// the backends/clients are updated.
>> -  unsigned getPointerABIAlignment(unsigned AS = 0)  const {
>> +  unsigned getPointerABIAlignment(unsigned AS)  const {
>>      DenseMap<unsigned, PointerAlignElem>::const_iterator val =
>> Pointers.find(AS);
>>      if (val == Pointers.end()) {
>>        val = Pointers.find(0);
>> @@ -241,9 +239,7 @@
>>      return val->second.ABIAlign;
>>    }
>>    /// Return target's alignment for stack-based pointers
>> -  /// FIXME: The defaults need to be removed once all of
>> -  /// the backends/clients are updated.
>> -  unsigned getPointerPrefAlignment(unsigned AS = 0) const {
>> +  unsigned getPointerPrefAlignment(unsigned AS) const {
>>      DenseMap<unsigned, PointerAlignElem>::const_iterator val =
>> Pointers.find(AS);
>>      if (val == Pointers.end()) {
>>        val = Pointers.find(0);
>> @@ -251,9 +247,7 @@
>>      return val->second.PrefAlign;
>>    }
>>    /// Layout pointer size
>> -  /// FIXME: The defaults need to be removed once all of
>> -  /// the backends/clients are updated.
>> -  unsigned getPointerSize(unsigned AS = 0)          const {
>> +  unsigned getPointerSize(unsigned AS)          const {
>>      DenseMap<unsigned, PointerAlignElem>::const_iterator val =
>> Pointers.find(AS);
>>      if (val == Pointers.end()) {
>>        val = Pointers.find(0);
>> @@ -261,9 +255,7 @@
>>      return val->second.TypeBitWidth;
>>    }
>>    /// Layout pointer size, in bits
>> -  /// FIXME: The defaults need to be removed once all of
>> -  /// the backends/clients are updated.
>> -  unsigned getPointerSizeInBits(unsigned AS = 0)    const {
>> +  unsigned getPointerSizeInBits(unsigned AS)    const {
>>      DenseMap<unsigned, PointerAlignElem>::const_iterator val =
>> Pointers.find(AS);
>>      if (val == Pointers.end()) {
>>        val = Pointers.find(0);
>>
>> Modified: llvm/trunk/include/llvm/Instructions.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Instructions.h?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Instructions.h (original)
>> +++ llvm/trunk/include/llvm/Instructions.h Mon Oct 15 11:24:29 2012
>> @@ -348,7 +348,16 @@
>>    static unsigned getPointerOperandIndex() { return 1U; }
>>
>>    unsigned getPointerAddressSpace() const {
>> -    return
>> cast<PointerType>(getPointerOperand()->getType())->getAddressSpace();
>> +    if (getPointerOperand()->getType()->isPointerTy())
>> +      return cast<PointerType>(getPointerOperand()->getType())
>> +        ->getAddressSpace();
>> +    if (getPointerOperand()->getType()->isVectorTy()
>> +        &&
>> cast<VectorType>(getPointerOperand()->getType())->isPointerTy())
>> +      return cast<PointerType>(cast<VectorType>(
>> +            getPointerOperand()->getType())->getElementType())
>> +        ->getAddressSpace();
>> +    llvm_unreachable("Only a vector of pointers or pointers can be
>> used!");
>> +    return 0;
>>    }
>>
>>    // Methods for support type inquiry through isa, cast, and dyn_cast:
>> @@ -3618,7 +3627,15 @@
>>
>>    /// @brief return the address space of the pointer.
>>    unsigned getAddressSpace() const {
>> -    return cast<PointerType>(getType())->getAddressSpace();
>> +    if (getType()->isPointerTy())
>> +      return cast<PointerType>(getType())->getAddressSpace();
>> +    if (getType()->isVectorTy() &&
>> +        cast<VectorType>(getType())->getElementType()->isPointerTy())
>> +      return cast<PointerType>(
>> +          cast<VectorType>(getType())->getElementType())
>> +        ->getAddressSpace();
>> +    llvm_unreachable("Must be a pointer or a vector of pointers.");
>> +    return 0;
>>    }
>>
>>    // Methods for support type inquiry through isa, cast, and dyn_cast:
>> @@ -3659,7 +3676,16 @@
>>
>>    /// @brief return the address space of the pointer.
>>    unsigned getPointerAddressSpace() const {
>> -    return
>> cast<PointerType>(getOperand(0)->getType())->getAddressSpace();
>> +    Type *Ty = getOperand(0)->getType();
>> +    if (Ty->isPointerTy())
>> +      return cast<PointerType>(Ty)->getAddressSpace();
>> +    if (Ty->isVectorTy()
>> +        && cast<VectorType>(Ty)->getElementType()->isPointerTy())
>> +      return cast<PointerType>(
>> +          cast<VectorType>(Ty)->getElementType())
>> +        ->getAddressSpace();
>> +    llvm_unreachable("Must be a pointer or a vector of pointers.");
>> +    return 0;
>>    }
>>
>>    // Methods for support type inquiry through isa, cast, and dyn_cast:
>>
>> Modified: llvm/trunk/include/llvm/Target/TargetLowering.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetLowering.h?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Target/TargetLowering.h (original)
>> +++ llvm/trunk/include/llvm/Target/TargetLowering.h Mon Oct 15 11:24:29
>> 2012
>> @@ -146,7 +146,7 @@
>>    // Return the pointer type for the given address space, defaults to
>>    // the pointer type from the data layout.
>>    // FIXME: The default needs to be removed once all the code is updated.
>> -  virtual MVT getPointerTy(uint32_t addrspace = 0) const { return
>> PointerTy; }
>> +  virtual MVT getPointerTy(uint32_t AS = 0) const { return PointerTy; }
>>    virtual MVT getShiftAmountTy(EVT LHSTy) const;
>>
>>    /// isSelectExpensive - Return true if the select operation is
>> expensive for
>>
>> Modified: llvm/trunk/include/llvm/Transforms/Utils/Local.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/Local.h?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Transforms/Utils/Local.h (original)
>> +++ llvm/trunk/include/llvm/Transforms/Utils/Local.h Mon Oct 15 11:24:29
>> 2012
>> @@ -186,7 +186,8 @@
>>    bool isInBounds = cast<GEPOperator>(GEP)->isInBounds() &&
>> !NoAssumptions;
>>
>>    // Build a mask for high order bits.
>> -  unsigned IntPtrWidth = TD.getPointerSizeInBits();
>> +  unsigned AS = cast<GEPOperator>(GEP)->getPointerAddressSpace();
>> +  unsigned IntPtrWidth = TD.getPointerSizeInBits(AS);
>>    uint64_t PtrSizeMask = ~0ULL >> (64-IntPtrWidth);
>>
>>    for (User::op_iterator i = GEP->op_begin() + 1, e = GEP->op_end(); i !=
>> e;
>>
>> Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
>> +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Mon Oct 15 11:24:29
>> 2012
>> @@ -286,7 +286,8 @@
>>        V = GEPOp->getOperand(0);
>>        continue;
>>      }
>> -
>> +
>> +    unsigned AS = GEPOp->getPointerAddressSpace();
>>      // Walk the indices of the GEP, accumulating them into
>> BaseOff/VarIndices.
>>      gep_type_iterator GTI = gep_type_begin(GEPOp);
>>      for (User::const_op_iterator I = GEPOp->op_begin()+1,
>> @@ -315,7 +316,7 @@
>>        // If the integer type is smaller than the pointer size, it is
>> implicitly
>>        // sign extended to pointer size.
>>        unsigned Width =
>> cast<IntegerType>(Index->getType())->getBitWidth();
>> -      if (TD->getPointerSizeInBits() > Width)
>> +      if (TD->getPointerSizeInBits(AS) > Width)
>>          Extension = EK_SignExt;
>>
>>        // Use GetLinearExpression to decompose the index into a C1*V+C2
>> form.
>> @@ -344,7 +345,7 @@
>>
>>        // Make sure that we have a scale that makes sense for this
>> target's
>>        // pointer size.
>> -      if (unsigned ShiftBits = 64-TD->getPointerSizeInBits()) {
>> +      if (unsigned ShiftBits = 64-TD->getPointerSizeInBits(AS)) {
>>          Scale <<= ShiftBits;
>>          Scale = (int64_t)Scale >> ShiftBits;
>>        }
>>
>> Modified: llvm/trunk/lib/Analysis/CodeMetrics.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CodeMetrics.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/CodeMetrics.cpp (original)
>> +++ llvm/trunk/lib/Analysis/CodeMetrics.cpp Mon Oct 15 11:24:29 2012
>> @@ -91,14 +91,16 @@
>>      // which doesn't contain values outside the range of a pointer.
>>      if (isa<IntToPtrInst>(CI) && TD &&
>>          TD->isLegalInteger(Op->getType()->getScalarSizeInBits()) &&
>> -        Op->getType()->getScalarSizeInBits() <=
>> TD->getPointerSizeInBits())
>> +        Op->getType()->getScalarSizeInBits() <= TD->getPointerSizeInBits(
>> +          cast<IntToPtrInst>(CI)->getAddressSpace()))
>>        return true;
>>
>>      // A ptrtoint cast is free so long as the result is large enough to
>> store
>>      // the pointer, and a legal integer type.
>>      if (isa<PtrToIntInst>(CI) && TD &&
>>          TD->isLegalInteger(Op->getType()->getScalarSizeInBits()) &&
>> -        Op->getType()->getScalarSizeInBits() >=
>> TD->getPointerSizeInBits())
>> +        Op->getType()->getScalarSizeInBits() >= TD->getPointerSizeInBits(
>> +          cast<PtrToIntInst>(CI)->getPointerAddressSpace()))
>>        return true;
>>
>>      // trunc to a native type is free (assuming the target has compare
>> and
>>
>> Modified: llvm/trunk/lib/Analysis/ConstantFolding.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ConstantFolding.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/ConstantFolding.cpp (original)
>> +++ llvm/trunk/lib/Analysis/ConstantFolding.cpp Mon Oct 15 11:24:29 2012
>> @@ -916,10 +916,11 @@
>>        if (TD && CE->getOpcode() == Instruction::IntToPtr) {
>>          Constant *Input = CE->getOperand(0);
>>          unsigned InWidth = Input->getType()->getScalarSizeInBits();
>> -        if (TD->getPointerSizeInBits() < InWidth) {
>> +        unsigned AS =
>> cast<PointerType>(CE->getType())->getAddressSpace();
>> +        if (TD->getPointerSizeInBits(AS) < InWidth) {
>>            Constant *Mask =
>>              ConstantInt::get(CE->getContext(),
>> APInt::getLowBitsSet(InWidth,
>> -
>> TD->getPointerSizeInBits()));
>> +
>> TD->getPointerSizeInBits(AS)));
>>            Input = ConstantExpr::getAnd(Input, Mask);
>>          }
>>          // Do a zext or trunc to get to the dest size.
>> @@ -932,9 +933,10 @@
>>      // the int size is >= the ptr size.  This requires knowing the width
>> of a
>>      // pointer, so it can't be done in ConstantExpr::getCast.
>>      if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Ops[0]))
>> -      if (TD &&
>> -          TD->getPointerSizeInBits() <=
>> CE->getType()->getScalarSizeInBits() &&
>> -          CE->getOpcode() == Instruction::PtrToInt)
>> +      if (TD && CE->getOpcode() == Instruction::PtrToInt &&
>> +          TD->getPointerSizeInBits(
>> +
>> cast<PointerType>(CE->getOperand(0)->getType())->getAddressSpace())
>> +          <= CE->getType()->getScalarSizeInBits())
>>          return FoldBitCast(CE->getOperand(0), DestTy, *TD);
>>
>>      return ConstantExpr::getCast(Opcode, Ops[0], DestTy);
>>
>> Modified: llvm/trunk/lib/Analysis/InlineCost.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InlineCost.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/InlineCost.cpp (original)
>> +++ llvm/trunk/lib/Analysis/InlineCost.cpp Mon Oct 15 11:24:29 2012
>> @@ -243,7 +243,8 @@
>>    if (!TD)
>>      return false;
>>
>> -  unsigned IntPtrWidth = TD->getPointerSizeInBits();
>> +  unsigned AS = GEP.getPointerAddressSpace();
>> +  unsigned IntPtrWidth = TD->getPointerSizeInBits(AS);
>>    assert(IntPtrWidth == Offset.getBitWidth());
>>
>>    for (gep_type_iterator GTI = gep_type_begin(GEP), GTE =
>> gep_type_end(GEP);
>> @@ -391,7 +392,8 @@
>>    // Track base/offset pairs when converted to a plain integer provided
>> the
>>    // integer is large enough to represent the pointer.
>>    unsigned IntegerSize = I.getType()->getScalarSizeInBits();
>> -  if (TD && IntegerSize >= TD->getPointerSizeInBits()) {
>> +  unsigned AS = I.getPointerAddressSpace();
>> +  if (TD && IntegerSize >= TD->getPointerSizeInBits(AS)) {
>>      std::pair<Value *, APInt> BaseAndOffset
>>        = ConstantOffsetPtrs.lookup(I.getOperand(0));
>>      if (BaseAndOffset.first)
>> @@ -425,7 +427,8 @@
>>    // modifications provided the integer is not too large.
>>    Value *Op = I.getOperand(0);
>>    unsigned IntegerSize = Op->getType()->getScalarSizeInBits();
>> -  if (TD && IntegerSize <= TD->getPointerSizeInBits()) {
>> +  unsigned AS = I.getAddressSpace();
>> +  if (TD && IntegerSize <= TD->getPointerSizeInBits(AS)) {
>>      std::pair<Value *, APInt> BaseAndOffset =
>> ConstantOffsetPtrs.lookup(Op);
>>      if (BaseAndOffset.first)
>>        ConstantOffsetPtrs[&I] = BaseAndOffset;
>> @@ -760,7 +763,8 @@
>>    if (!TD || !V->getType()->isPointerTy())
>>      return 0;
>>
>> -  unsigned IntPtrWidth = TD->getPointerSizeInBits();
>> +  unsigned AS = cast<PointerType>(V->getType())->getAddressSpace();;
>> +  unsigned IntPtrWidth = TD->getPointerSizeInBits(AS);
>>    APInt Offset = APInt::getNullValue(IntPtrWidth);
>>
>>    // Even though we don't look through PHI nodes, we could be called on
>> an
>> @@ -824,7 +828,8 @@
>>          // size of the byval type by the target's pointer size.
>>          PointerType *PTy =
>> cast<PointerType>(CS.getArgument(I)->getType());
>>          unsigned TypeSize = TD->getTypeSizeInBits(PTy->getElementType());
>> -        unsigned PointerSize = TD->getPointerSizeInBits();
>> +        unsigned AS = PTy->getAddressSpace();
>> +        unsigned PointerSize = TD->getPointerSizeInBits(AS);
>>          // Ceiling division.
>>          unsigned NumStores = (TypeSize + PointerSize - 1) / PointerSize;
>>
>>
>> Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
>> +++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Mon Oct 15 11:24:29
>> 2012
>> @@ -666,7 +666,8 @@
>>  /// 'Offset' APInt must be the bitwidth of the target's pointer size.
>>  static bool accumulateGEPOffset(const DataLayout &TD, GEPOperator *GEP,
>>                                  APInt &Offset) {
>> -  unsigned IntPtrWidth = TD.getPointerSizeInBits();
>> +  unsigned AS = GEP->getPointerAddressSpace();
>> +  unsigned IntPtrWidth = TD.getPointerSizeInBits(AS);
>>    assert(IntPtrWidth == Offset.getBitWidth());
>>
>>    gep_type_iterator GTI = gep_type_begin(GEP);
>> @@ -696,12 +697,14 @@
>>  /// accumulates the total constant offset applied in the returned
>> constant. It
>>  /// returns 0 if V is not a pointer, and returns the constant '0' if
>> there are
>>  /// no constant offsets applied.
>> +/// FIXME: This function also exists in InlineCost.cpp.
>>  static Constant *stripAndComputeConstantOffsets(const DataLayout &TD,
>>                                                  Value *&V) {
>>    if (!V->getType()->isPointerTy())
>>      return 0;
>>
>> -  unsigned IntPtrWidth = TD.getPointerSizeInBits();
>> +  unsigned AS = cast<PointerType>(V->getType())->getAddressSpace();;
>> +  unsigned IntPtrWidth = TD.getPointerSizeInBits(AS);
>>    APInt Offset = APInt::getNullValue(IntPtrWidth);
>>
>>    // Even though we don't look through PHI nodes, we could be called on
>> an
>> @@ -1877,7 +1880,9 @@
>>      // Turn icmp (ptrtoint x), (ptrtoint/constant) into a compare of the
>> input
>>      // if the integer type is the same size as the pointer type.
>>      if (MaxRecurse && Q.TD && isa<PtrToIntInst>(LI) &&
>> -        Q.TD->getPointerSizeInBits() == DstTy->getPrimitiveSizeInBits())
>> {
>> +        Q.TD->getPointerSizeInBits(
>> +          cast<PtrToIntInst>(LI)->getPointerAddressSpace()) ==
>> +        DstTy->getPrimitiveSizeInBits()) {
>>        if (Constant *RHSC = dyn_cast<Constant>(RHS)) {
>>          // Transfer the cast to the constant.
>>          if (Value *V = SimplifyICmpInst(Pred, SrcOp,
>>
>> Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
>> +++ llvm/trunk/lib/Analysis/ValueTracking.cpp Mon Oct 15 11:24:29 2012
>> @@ -40,7 +40,8 @@
>>    if (unsigned BitWidth = Ty->getScalarSizeInBits())
>>      return BitWidth;
>>    assert(isa<PointerType>(Ty) && "Expected a pointer type!");
>> -  return TD ? TD->getPointerSizeInBits() : 0;
>> +  return TD ?
>> +    TD->getPointerSizeInBits(cast<PointerType>(Ty)->getAddressSpace()) :
>> 0;
>>  }
>>
>>  static void ComputeMaskedBitsAddSub(bool Add, Value *Op0, Value *Op1,
>> bool NSW,
>> @@ -1621,7 +1622,8 @@
>>
>>    // Re-sign extend from the pointer size if needed to get overflow edge
>> cases
>>    // right.
>> -  unsigned PtrSize = TD.getPointerSizeInBits();
>> +  unsigned AS = GEP->getPointerAddressSpace();
>> +  unsigned PtrSize = TD.getPointerSizeInBits(AS);
>>    if (PtrSize < 64)
>>      Offset = SignExtend64(Offset, PtrSize);
>>
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Mon Oct 15 11:24:29
>> 2012
>> @@ -385,7 +385,8 @@
>>      //   - __tlv_bootstrap - used to make sure support exists
>>      //   - spare pointer, used when mapped by the runtime
>>      //   - pointer to mangled symbol above with initializer
>> -    unsigned PtrSize = TD->getPointerSizeInBits()/8;
>> +    unsigned AS = GV->getType()->getAddressSpace();
>> +    unsigned PtrSize = TD->getPointerSizeInBits(AS)/8;
>>
>> OutStreamer.EmitSymbolValue(GetExternalSymbolSymbol("_tlv_bootstrap"),
>>                            PtrSize, 0);
>>      OutStreamer.EmitIntValue(0, PtrSize, 0);
>> @@ -1299,7 +1300,7 @@
>>
>>    // Emit the function pointers in the target-specific order
>>    const DataLayout *TD = TM.getDataLayout();
>> -  unsigned Align = Log2_32(TD->getPointerPrefAlignment());
>> +  unsigned Align = Log2_32(TD->getPointerPrefAlignment(0));
>>    std::stable_sort(Structors.begin(), Structors.end(), priority_order);
>>    for (unsigned i = 0, e = Structors.size(); i != e; ++i) {
>>      const MCSection *OutputSection =
>> @@ -1480,8 +1481,9 @@
>>      if (Offset == 0)
>>        return Base;
>>
>> +    unsigned AS = cast<PointerType>(CE->getType())->getAddressSpace();
>>      // Truncate/sext the offset to the pointer size.
>> -    unsigned Width = TD.getPointerSizeInBits();
>> +    unsigned Width = TD.getPointerSizeInBits(AS);
>>      if (Width < 64)
>>        Offset = SignExtend64(Offset, Width);
>>
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp Mon Oct 15
>> 11:24:29 2012
>> @@ -112,7 +112,7 @@
>>
>>    switch (Encoding & 0x07) {
>>    default: llvm_unreachable("Invalid encoded value.");
>> -  case dwarf::DW_EH_PE_absptr: return
>> TM.getDataLayout()->getPointerSize();
>> +  case dwarf::DW_EH_PE_absptr: return
>> TM.getDataLayout()->getPointerSize(0);
>>    case dwarf::DW_EH_PE_udata2: return 2;
>>    case dwarf::DW_EH_PE_udata4: return 4;
>>    case dwarf::DW_EH_PE_udata8: return 8;
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp Mon Oct 15 11:24:29 2012
>> @@ -200,7 +200,7 @@
>>    case dwarf::DW_FORM_udata: Asm->EmitULEB128(Integer); return;
>>    case dwarf::DW_FORM_sdata: Asm->EmitSLEB128(Integer); return;
>>    case dwarf::DW_FORM_addr:
>> -    Size = Asm->getDataLayout().getPointerSize(); break;
>> +    Size = Asm->getDataLayout().getPointerSize(0); break;
>>    default: llvm_unreachable("DIE Value form not supported yet");
>>    }
>>    Asm->OutStreamer.EmitIntValue(Integer, Size, 0/*addrspace*/);
>> @@ -222,7 +222,7 @@
>>    case dwarf::DW_FORM_data8: return sizeof(int64_t);
>>    case dwarf::DW_FORM_udata: return MCAsmInfo::getULEB128Size(Integer);
>>    case dwarf::DW_FORM_sdata: return MCAsmInfo::getSLEB128Size(Integer);
>> -  case dwarf::DW_FORM_addr:  return AP->getDataLayout().getPointerSize();
>> +  case dwarf::DW_FORM_addr:  return
>> AP->getDataLayout().getPointerSize(0);
>>    default: llvm_unreachable("DIE Value form not supported yet");
>>    }
>>  }
>> @@ -249,7 +249,7 @@
>>  unsigned DIELabel::SizeOf(AsmPrinter *AP, unsigned Form) const {
>>    if (Form == dwarf::DW_FORM_data4) return 4;
>>    if (Form == dwarf::DW_FORM_strp) return 4;
>> -  return AP->getDataLayout().getPointerSize();
>> +  return AP->getDataLayout().getPointerSize(0);
>>  }
>>
>>  #ifndef NDEBUG
>> @@ -273,7 +273,7 @@
>>  unsigned DIEDelta::SizeOf(AsmPrinter *AP, unsigned Form) const {
>>    if (Form == dwarf::DW_FORM_data4) return 4;
>>    if (Form == dwarf::DW_FORM_strp) return 4;
>> -  return AP->getDataLayout().getPointerSize();
>> +  return AP->getDataLayout().getPointerSize(0);
>>  }
>>
>>  #ifndef NDEBUG
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Mon Oct 15 11:24:29
>> 2012
>> @@ -384,7 +384,7 @@
>>      // DW_AT_ranges appropriately.
>>      TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
>>                     DebugRangeSymbols.size()
>> -                   * Asm->getDataLayout().getPointerSize());
>> +                   * Asm->getDataLayout().getPointerSize(0));
>>      for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
>>           RE = Ranges.end(); RI != RE; ++RI) {
>>        DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
>> @@ -450,7 +450,7 @@
>>      // DW_AT_ranges appropriately.
>>      TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
>>                     DebugRangeSymbols.size()
>> -                   * Asm->getDataLayout().getPointerSize());
>> +                   * Asm->getDataLayout().getPointerSize(0));
>>      for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
>>           RE = Ranges.end(); RI != RE; ++RI) {
>>        DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
>> @@ -1765,7 +1765,7 @@
>>      Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
>>                             DwarfAbbrevSectionSym);
>>      Asm->OutStreamer.AddComment("Address Size (in bytes)");
>> -    Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
>> +    Asm->EmitInt8(Asm->getDataLayout().getPointerSize(0));
>>
>>      emitDIE(Die);
>>      Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end",
>> TheCU->getID()));
>> @@ -1811,14 +1811,14 @@
>>    Asm->EmitInt8(0);
>>
>>    Asm->OutStreamer.AddComment("Op size");
>> -  Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
>> +  Asm->EmitInt8(Asm->getDataLayout().getPointerSize(0) + 1);
>>    Asm->OutStreamer.AddComment("DW_LNE_set_address");
>>    Asm->EmitInt8(dwarf::DW_LNE_set_address);
>>
>>    Asm->OutStreamer.AddComment("Section end label");
>>
>>
>> Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
>> -                                   Asm->getDataLayout().getPointerSize(),
>> +
>> Asm->getDataLayout().getPointerSize(0),
>>                                     0/*AddrSpace*/);
>>
>>    // Mark end of matrix.
>> @@ -2047,7 +2047,7 @@
>>    // Start the dwarf loc section.
>>    Asm->OutStreamer.SwitchSection(
>>      Asm->getObjFileLowering().getDwarfLocSection());
>> -  unsigned char Size = Asm->getDataLayout().getPointerSize();
>> +  unsigned char Size = Asm->getDataLayout().getPointerSize(0);
>>    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
>>    unsigned index = 1;
>>    for (SmallVector<DotDebugLocEntry, 4>::iterator
>> @@ -2144,7 +2144,7 @@
>>    // Start the dwarf ranges section.
>>    Asm->OutStreamer.SwitchSection(
>>      Asm->getObjFileLowering().getDwarfRangesSection());
>> -  unsigned char Size = Asm->getDataLayout().getPointerSize();
>> +  unsigned char Size = Asm->getDataLayout().getPointerSize(0);
>>    for (SmallVector<const MCSymbol *, 8>::iterator
>>           I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
>>         I != E; ++I) {
>> @@ -2202,7 +2202,7 @@
>>    Asm->OutStreamer.AddComment("Dwarf Version");
>>    Asm->EmitInt16(dwarf::DWARF_VERSION);
>>    Asm->OutStreamer.AddComment("Address Size (in bytes)");
>> -  Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
>> +  Asm->EmitInt8(Asm->getDataLayout().getPointerSize(0));
>>
>>    for (SmallVector<const MDNode *, 4>::iterator I =
>> InlinedSPNodes.begin(),
>>           E = InlinedSPNodes.end(); I != E; ++I) {
>> @@ -2233,7 +2233,7 @@
>>
>>        if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
>>        Asm->OutStreamer.EmitSymbolValue(LI->first,
>> -
>> Asm->getDataLayout().getPointerSize(),0);
>> +
>> Asm->getDataLayout().getPointerSize(0),0);
>>      }
>>    }
>>
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp Mon Oct 15
>> 11:24:29 2012
>> @@ -417,7 +417,7 @@
>>      // that we're omitting that bit.
>>      TTypeEncoding = dwarf::DW_EH_PE_omit;
>>      // dwarf::DW_EH_PE_absptr
>> -    TypeFormatSize = Asm->getDataLayout().getPointerSize();
>> +    TypeFormatSize = Asm->getDataLayout().getPointerSize(0);
>>    } else {
>>      // Okay, we have actual filters or typeinfos to emit.  As such, we
>> need to
>>      // pick a type encoding for them.  We're about to emit a list of
>> pointers to
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/OcamlGCPrinter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/OcamlGCPrinter.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/OcamlGCPrinter.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/OcamlGCPrinter.cpp Mon Oct 15
>> 11:24:29 2012
>> @@ -91,7 +91,7 @@
>>  /// either condition is detected in a function which uses the GC.
>>  ///
>>  void OcamlGCMetadataPrinter::finishAssembly(AsmPrinter &AP) {
>> -  unsigned IntPtrSize = AP.TM.getDataLayout()->getPointerSize();
>> +  unsigned IntPtrSize = AP.TM.getDataLayout()->getPointerSize(0);
>>
>>    AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getTextSection());
>>    EmitCamlGlobal(getModule(), AP, "code_end");
>>
>> Modified: llvm/trunk/lib/CodeGen/MachineFunction.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineFunction.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/MachineFunction.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/MachineFunction.cpp Mon Oct 15 11:24:29 2012
>> @@ -550,7 +550,7 @@
>>    // address of a block, in which case it is the pointer size.
>>    switch (getEntryKind()) {
>>    case MachineJumpTableInfo::EK_BlockAddress:
>> -    return TD.getPointerSize();
>> +    return TD.getPointerSize(0);
>>    case MachineJumpTableInfo::EK_GPRel64BlockAddress:
>>      return 8;
>>    case MachineJumpTableInfo::EK_GPRel32BlockAddress:
>> @@ -570,7 +570,7 @@
>>    // alignment.
>>    switch (getEntryKind()) {
>>    case MachineJumpTableInfo::EK_BlockAddress:
>> -    return TD.getPointerABIAlignment();
>> +    return TD.getPointerABIAlignment(0);
>>    case MachineJumpTableInfo::EK_GPRel64BlockAddress:
>>      return TD.getABIIntegerTypeAlignment(64);
>>    case MachineJumpTableInfo::EK_GPRel32BlockAddress:
>>
>> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Mon Oct 15
>> 11:24:29 2012
>> @@ -3449,9 +3449,12 @@
>>    EVT VT = TLI.getOptimalMemOpType(Size, DstAlign, SrcAlign,
>>                                     IsZeroVal, MemcpyStrSrc,
>>                                     DAG.getMachineFunction());
>> +  Type *vtType = VT.isExtended() ? VT.getTypeForEVT(*DAG.getContext()) :
>> NULL;
>> +  unsigned AS = (vtType && vtType->isPointerTy()) ?
>> +    cast<PointerType>(vtType)->getAddressSpace() : 0;
>>
>>    if (VT == MVT::Other) {
>> -    if (DstAlign >= TLI.getDataLayout()->getPointerPrefAlignment() ||
>> +    if (DstAlign >= TLI.getDataLayout()->getPointerPrefAlignment(AS) ||
>>          TLI.allowsUnalignedMemoryAccesses(VT)) {
>>        VT = TLI.getPointerTy();
>>      } else {
>>
>> Modified: llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp Mon Oct 15
>> 11:24:29 2012
>> @@ -77,9 +77,9 @@
>>                                                      Flags,
>>
>> SectionKind::getDataRel(),
>>                                                      0, Label->getName());
>> -  unsigned Size = TM.getDataLayout()->getPointerSize();
>> +  unsigned Size = TM.getDataLayout()->getPointerSize(0);
>>    Streamer.SwitchSection(Sec);
>> -
>> Streamer.EmitValueToAlignment(TM.getDataLayout()->getPointerABIAlignment());
>> +
>> Streamer.EmitValueToAlignment(TM.getDataLayout()->getPointerABIAlignment(0));
>>    Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject);
>>    const MCExpr *E = MCConstantExpr::Create(Size, getContext());
>>    Streamer.EmitELFSize(Label, E);
>>
>> Modified: llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp (original)
>> +++ llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp Mon Oct 15 11:24:29
>> 2012
>> @@ -17,6 +17,7 @@
>>
>>  #include "llvm/Constants.h"
>>  #include "llvm/DerivedTypes.h"
>> +#include "llvm/Instructions.h"
>>  #include "llvm/Module.h"
>>  #include "llvm/ExecutionEngine/GenericValue.h"
>>  #include "llvm/ADT/SmallString.h"
>> @@ -267,7 +268,7 @@
>>  void *ArgvArray::reset(LLVMContext &C, ExecutionEngine *EE,
>>                         const std::vector<std::string> &InputArgv) {
>>    clear();  // Free the old contents.
>> -  unsigned PtrSize = EE->getDataLayout()->getPointerSize();
>> +  unsigned PtrSize = EE->getDataLayout()->getPointerSize(0);
>>    Array = new char[(InputArgv.size()+1)*PtrSize];
>>
>>    DEBUG(dbgs() << "JIT: ARGV = " << (void*)Array << "\n");
>> @@ -342,7 +343,7 @@
>>  #ifndef NDEBUG
>>  /// isTargetNullPtr - Return whether the target pointer stored at Loc is
>> null.
>>  static bool isTargetNullPtr(ExecutionEngine *EE, void *Loc) {
>> -  unsigned PtrSize = EE->getDataLayout()->getPointerSize();
>> +  unsigned PtrSize = EE->getDataLayout()->getPointerSize(0);
>>    for (unsigned i = 0; i < PtrSize; ++i)
>>      if (*(i + (uint8_t*)Loc))
>>        return false;
>> @@ -644,13 +645,16 @@
>>      }
>>      case Instruction::PtrToInt: {
>>        GenericValue GV = getConstantValue(Op0);
>> -      uint32_t PtrWidth = TD->getPointerSizeInBits();
>> +      unsigned AS = cast<PointerType>(CE->getOperand(1)->getType())
>> +        ->getAddressSpace();
>> +      uint32_t PtrWidth = TD->getPointerSizeInBits(AS);
>>        GV.IntVal = APInt(PtrWidth, uintptr_t(GV.PointerVal));
>>        return GV;
>>      }
>>      case Instruction::IntToPtr: {
>>        GenericValue GV = getConstantValue(Op0);
>> -      uint32_t PtrWidth = TD->getPointerSizeInBits();
>> +      unsigned AS = cast<PointerType>(CE->getType())->getAddressSpace();
>> +      uint32_t PtrWidth = TD->getPointerSizeInBits(AS);
>>        if (PtrWidth != GV.IntVal.getBitWidth())
>>          GV.IntVal = GV.IntVal.zextOrTrunc(PtrWidth);
>>        assert(GV.IntVal.getBitWidth() <= 64 && "Bad pointer width");
>>
>> Modified: llvm/trunk/lib/ExecutionEngine/Interpreter/Execution.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Interpreter/Execution.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/ExecutionEngine/Interpreter/Execution.cpp (original)
>> +++ llvm/trunk/lib/ExecutionEngine/Interpreter/Execution.cpp Mon Oct 15
>> 11:24:29 2012
>> @@ -1054,7 +1054,8 @@
>>    GenericValue Dest, Src = getOperandValue(SrcVal, SF);
>>    assert(DstTy->isPointerTy() && "Invalid PtrToInt instruction");
>>
>> -  uint32_t PtrSize = TD.getPointerSizeInBits();
>> +  unsigned AS = cast<PointerType>(DstTy)->getAddressSpace();
>> +  uint32_t PtrSize = TD.getPointerSizeInBits(AS);
>>    if (PtrSize != Src.IntVal.getBitWidth())
>>      Src.IntVal = Src.IntVal.zextOrTrunc(PtrSize);
>>
>>
>> Modified: llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
>> (original)
>> +++ llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp Mon
>> Oct 15 11:24:29 2012
>> @@ -376,7 +376,7 @@
>>        case 'x': case 'X':
>>          if (HowLong >= 1) {
>>            if (HowLong == 1 &&
>> -              TheInterpreter->getDataLayout()->getPointerSizeInBits() ==
>> 64 &&
>> +              TheInterpreter->getDataLayout()->getPointerSizeInBits(0) ==
>> 64 &&
>>                sizeof(long) < sizeof(int64_t)) {
>>              // Make sure we use %lld with a 64 bit argument because we
>> might be
>>              // compiling LLI on a 32 bit compiler.
>>
>> Modified: llvm/trunk/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp (original)
>> +++ llvm/trunk/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp Mon Oct 15
>> 11:24:29 2012
>> @@ -14,7 +14,9 @@
>>
>>  #include "JIT.h"
>>  #include "JITDwarfEmitter.h"
>> +#include "llvm/DerivedTypes.h"
>>  #include "llvm/Function.h"
>> +#include "llvm/GlobalVariable.h"
>>  #include "llvm/ADT/DenseMap.h"
>>  #include "llvm/CodeGen/JITCodeEmitter.h"
>>  #include "llvm/CodeGen/MachineFunction.h"
>> @@ -66,7 +68,7 @@
>>  void
>>  JITDwarfEmitter::EmitFrameMoves(intptr_t BaseLabelPtr,
>>                                  const std::vector<MachineMove> &Moves)
>> const {
>> -  unsigned PointerSize = TD->getPointerSize();
>> +  unsigned PointerSize = TD->getPointerSize(0);
>>    int stackGrowth = stackGrowthDirection ==
>> TargetFrameLowering::StackGrowsUp ?
>>            PointerSize : -PointerSize;
>>    MCSymbol *BaseLabel = 0;
>> @@ -378,7 +380,7 @@
>>    for (unsigned i = 0, e = CallSites.size(); i < e; ++i)
>>      SizeSites += MCAsmInfo::getULEB128Size(CallSites[i].Action);
>>
>> -  unsigned SizeTypes = TypeInfos.size() * TD->getPointerSize();
>> +  unsigned SizeTypes = TypeInfos.size() * TD->getPointerSize(0);
>>
>>    unsigned TypeOffset = sizeof(int8_t) + // Call site format
>>                          // Call-site table length
>> @@ -454,12 +456,12 @@
>>      const GlobalVariable *GV = TypeInfos[M - 1];
>>
>>      if (GV) {
>> -      if (TD->getPointerSize() == sizeof(int32_t))
>> +      if (TD->getPointerSize(GV->getType()->getAddressSpace()) ==
>> sizeof(int32_t))
>>          JCE->emitInt32((intptr_t)Jit.getOrEmitGlobalVariable(GV));
>>        else
>>          JCE->emitInt64((intptr_t)Jit.getOrEmitGlobalVariable(GV));
>>      } else {
>> -      if (TD->getPointerSize() == sizeof(int32_t))
>> +      if (TD->getPointerSize(0) == sizeof(int32_t))
>>          JCE->emitInt32(0);
>>        else
>>          JCE->emitInt64(0);
>> @@ -481,7 +483,7 @@
>>
>>  unsigned char*
>>  JITDwarfEmitter::EmitCommonEHFrame(const Function* Personality) const {
>> -  unsigned PointerSize = TD->getPointerSize();
>> +  unsigned PointerSize = TD->getPointerSize(0);
>>    int stackGrowth = stackGrowthDirection ==
>> TargetFrameLowering::StackGrowsUp ?
>>            PointerSize : -PointerSize;
>>
>> @@ -541,7 +543,7 @@
>>                               unsigned char* StartFunction,
>>                               unsigned char* EndFunction,
>>                               unsigned char* ExceptionTable) const {
>> -  unsigned PointerSize = TD->getPointerSize();
>> +  unsigned PointerSize = TD->getPointerSize(0);
>>
>>    // EH frame header.
>>    unsigned char* StartEHPtr = (unsigned char*)JCE->getCurrentPCValue();
>>
>> Modified: llvm/trunk/lib/Target/ARM/ARMELFWriterInfo.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMELFWriterInfo.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMELFWriterInfo.cpp (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMELFWriterInfo.cpp Mon Oct 15 11:24:29
>> 2012
>> @@ -26,7 +26,7 @@
>>
>> //===----------------------------------------------------------------------===//
>>
>>  ARMELFWriterInfo::ARMELFWriterInfo(TargetMachine &TM)
>> -  : TargetELFWriterInfo(TM.getDataLayout()->getPointerSizeInBits() == 64,
>> +  : TargetELFWriterInfo(TM.getDataLayout()->getPointerSizeInBits(0) ==
>> 64,
>>                          TM.getDataLayout()->isLittleEndian()) {
>>  }
>>
>>
>> Modified: llvm/trunk/lib/Target/MBlaze/MBlazeELFWriterInfo.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/MBlaze/MBlazeELFWriterInfo.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/MBlaze/MBlazeELFWriterInfo.cpp (original)
>> +++ llvm/trunk/lib/Target/MBlaze/MBlazeELFWriterInfo.cpp Mon Oct 15
>> 11:24:29 2012
>> @@ -26,7 +26,7 @@
>>
>> //===----------------------------------------------------------------------===//
>>
>>  MBlazeELFWriterInfo::MBlazeELFWriterInfo(TargetMachine &TM)
>> -  : TargetELFWriterInfo(TM.getDataLayout()->getPointerSizeInBits() == 64,
>> +  : TargetELFWriterInfo(TM.getDataLayout()->getPointerSizeInBits(0) ==
>> 64,
>>                          TM.getDataLayout()->isLittleEndian()) {
>>  }
>>
>>
>> Modified: llvm/trunk/lib/Target/MSP430/MSP430ISelLowering.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/MSP430/MSP430ISelLowering.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/MSP430/MSP430ISelLowering.cpp (original)
>> +++ llvm/trunk/lib/Target/MSP430/MSP430ISelLowering.cpp Mon Oct 15
>> 11:24:29 2012
>> @@ -881,7 +881,7 @@
>>
>>    if (ReturnAddrIndex == 0) {
>>      // Set up a frame object for the return address.
>> -    uint64_t SlotSize = TD->getPointerSize();
>> +    uint64_t SlotSize = TD->getPointerSize(0);
>>      ReturnAddrIndex = MF.getFrameInfo()->CreateFixedObject(SlotSize,
>> -SlotSize,
>>                                                             true);
>>      FuncInfo->setRAIndex(ReturnAddrIndex);
>> @@ -901,7 +901,7 @@
>>    if (Depth > 0) {
>>      SDValue FrameAddr = LowerFRAMEADDR(Op, DAG);
>>      SDValue Offset =
>> -      DAG.getConstant(TD->getPointerSize(), MVT::i16);
>> +      DAG.getConstant(TD->getPointerSize(0), MVT::i16);
>>      return DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(),
>>                         DAG.getNode(ISD::ADD, dl, getPointerTy(),
>>                                     FrameAddr, Offset),
>>
>> Modified: llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.cpp (original)
>> +++ llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.cpp Mon Oct 15 11:24:29
>> 2012
>> @@ -126,8 +126,10 @@
>>        return Base;
>>
>>      // Truncate/sext the offset to the pointer size.
>> -    if (TD.getPointerSizeInBits() != 64) {
>> -      int SExtAmount = 64-TD.getPointerSizeInBits();
>> +    unsigned AS = PtrVal->getType()->isPointerTy() ?
>> +      cast<PointerType>(PtrVal->getType())->getAddressSpace() : 0;
>> +    if (TD.getPointerSizeInBits(AS) != 64) {
>> +      int SExtAmount = 64-TD.getPointerSizeInBits(AS);
>>        Offset = (Offset << SExtAmount) >> SExtAmount;
>>      }
>>
>> @@ -1378,7 +1380,7 @@
>>
>>    const FunctionType *FTy = dyn_cast<FunctionType>(Ty);
>>    if (FTy)
>> -    return TD->getPointerPrefAlignment();
>> +    return TD->getPointerPrefAlignment(0);
>>    return TD->getPrefTypeAlignment(Ty);
>>  }
>>
>>
>> Modified: llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp (original)
>> +++ llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp Mon Oct 15 11:24:29
>> 2012
>> @@ -439,7 +439,7 @@
>>  bool PPCLinuxAsmPrinter::doFinalization(Module &M) {
>>    const DataLayout *TD = TM.getDataLayout();
>>
>> -  bool isPPC64 = TD->getPointerSizeInBits() == 64;
>> +  bool isPPC64 = TD->getPointerSizeInBits(0) == 64;
>>
>>    if (isPPC64 && !TOC.empty()) {
>>      const MCSectionELF *Section =
>> OutStreamer.getContext().getELFSection(".toc",
>> @@ -545,7 +545,7 @@
>>
>>  void PPCDarwinAsmPrinter::
>>  EmitFunctionStubs(const MachineModuleInfoMachO::SymbolListTy &Stubs) {
>> -  bool isPPC64 = TM.getDataLayout()->getPointerSizeInBits() == 64;
>> +  bool isPPC64 = TM.getDataLayout()->getPointerSizeInBits(0) == 64;
>>
>>    const TargetLoweringObjectFileMachO &TLOFMacho =
>>      static_cast<const TargetLoweringObjectFileMachO
>> &>(getObjFileLowering());
>> @@ -640,7 +640,7 @@
>>
>>
>>  bool PPCDarwinAsmPrinter::doFinalization(Module &M) {
>> -  bool isPPC64 = TM.getDataLayout()->getPointerSizeInBits() == 64;
>> +  bool isPPC64 = TM.getDataLayout()->getPointerSizeInBits(0) == 64;
>>
>>    // Darwin/PPC always uses mach-o.
>>    const TargetLoweringObjectFileMachO &TLOFMacho =
>>
>> Modified: llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp (original)
>> +++ llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp Mon Oct 15 11:24:29
>> 2012
>> @@ -498,7 +498,7 @@
>>      } else if (CRSpillFrameIdx) {
>>        FrameIdx = CRSpillFrameIdx;
>>      } else {
>> -      MachineFrameInfo *MFI = ((MachineFunction &)MF).getFrameInfo();
>> +      MachineFrameInfo *MFI = (const_cast<MachineFunction
>> &>(MF)).getFrameInfo();
>>        FrameIdx = MFI->CreateFixedObject((uint64_t)4, (int64_t)-4, true);
>>        CRSpillFrameIdx = FrameIdx;
>>      }
>>
>> Modified: llvm/trunk/lib/Target/Target.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Target.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/Target.cpp (original)
>> +++ llvm/trunk/lib/Target/Target.cpp Mon Oct 15 11:24:29 2012
>> @@ -56,13 +56,21 @@
>>  }
>>
>>  unsigned LLVMPointerSize(LLVMTargetDataRef TD) {
>> -  return unwrap(TD)->getPointerSize();
>> +  return unwrap(TD)->getPointerSize(0);
>> +}
>> +
>> +unsigned LLVMPointerSizeForAS(LLVMTargetDataRef TD, unsigned AS) {
>> +  return unwrap(TD)->getPointerSize(AS);
>>  }
>>
>>  LLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD) {
>>    return wrap(unwrap(TD)->getIntPtrType(getGlobalContext()));
>>  }
>>
>> +LLVMTypeRef LLVMIntPtrTypeForAS(LLVMTargetDataRef TD, unsigned AS) {
>> +  return wrap(unwrap(TD)->getIntPtrType(getGlobalContext(), AS));
>> +}
>> +
>>  unsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef TD, LLVMTypeRef
>> Ty) {
>>    return unwrap(TD)->getTypeSizeInBits(unwrap(Ty));
>>  }
>>
>> Modified: llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp (original)
>> +++ llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp Mon Oct 15 11:24:29 2012
>> @@ -693,7 +693,7 @@
>>        for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
>>          OutStreamer.EmitLabel(Stubs[i].first);
>>          OutStreamer.EmitSymbolValue(Stubs[i].second.getPointer(),
>> -                                    TD->getPointerSize(), 0);
>> +                                    TD->getPointerSize(0), 0);
>>        }
>>        Stubs.clear();
>>      }
>>
>> Modified: llvm/trunk/lib/Target/X86/X86FrameLowering.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FrameLowering.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/X86/X86FrameLowering.cpp (original)
>> +++ llvm/trunk/lib/Target/X86/X86FrameLowering.cpp Mon Oct 15 11:24:29
>> 2012
>> @@ -317,7 +317,7 @@
>>    bool HasFP = hasFP(MF);
>>
>>    // Calculate amount of bytes used for return address storing.
>> -  int stackGrowth = -TD->getPointerSize();
>> +  int stackGrowth = -TD->getPointerSize(0);
>>
>>    // FIXME: This is dirty hack. The code itself is pretty mess right now.
>>    // It should be rewritten from scratch and generalized sometimes.
>> @@ -717,7 +717,7 @@
>>    std::vector<MachineMove> &Moves = MMI.getFrameMoves();
>>    const DataLayout *TD = MF.getTarget().getDataLayout();
>>    uint64_t NumBytes = 0;
>> -  int stackGrowth = -TD->getPointerSize();
>> +  int stackGrowth = -TD->getPointerSize(0);
>>
>>    if (HasFP) {
>>      // Calculate required stack adjustment.
>>
>> Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
>> +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Mon Oct 15 11:24:29 2012
>> @@ -2652,7 +2652,7 @@
>>    unsigned StackAlignment = TFI.getStackAlignment();
>>    uint64_t AlignMask = StackAlignment - 1;
>>    int64_t Offset = StackSize;
>> -  uint64_t SlotSize = TD->getPointerSize();
>> +  uint64_t SlotSize = TD->getPointerSize(0);
>>    if ( (Offset & AlignMask) <= (StackAlignment - SlotSize) ) {
>>      // Number smaller than 12 so just add the difference.
>>      Offset += ((StackAlignment - SlotSize) - (Offset & AlignMask));
>> @@ -3020,7 +3020,7 @@
>>
>>    if (ReturnAddrIndex == 0) {
>>      // Set up a frame object for the return address.
>> -    uint64_t SlotSize = TD->getPointerSize();
>> +    uint64_t SlotSize = TD->getPointerSize(0);
>>      ReturnAddrIndex = MF.getFrameInfo()->CreateFixedObject(SlotSize,
>> -SlotSize,
>>                                                             false);
>>      FuncInfo->setRAIndex(ReturnAddrIndex);
>> @@ -7643,7 +7643,7 @@
>>        IDX = DAG.getLoad(getPointerTy(), dl, Chain, IDX,
>> MachinePointerInfo(),
>>                          false, false, false, 0);
>>
>> -    SDValue Scale = DAG.getConstant(Log2_64_Ceil(TD->getPointerSize()),
>> +    SDValue Scale = DAG.getConstant(Log2_64_Ceil(TD->getPointerSize(0)),
>>                                      getPointerTy());
>>      IDX = DAG.getNode(ISD::SHL, dl, getPointerTy(), IDX, Scale);
>>
>> @@ -10293,7 +10293,7 @@
>>    if (Depth > 0) {
>>      SDValue FrameAddr = LowerFRAMEADDR(Op, DAG);
>>      SDValue Offset =
>> -      DAG.getConstant(TD->getPointerSize(),
>> +      DAG.getConstant(TD->getPointerSize(0),
>>                        Subtarget->is64Bit() ? MVT::i64 : MVT::i32);
>>      return DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(),
>>                         DAG.getNode(ISD::ADD, dl, getPointerTy(),
>> @@ -10325,7 +10325,7 @@
>>
>>  SDValue X86TargetLowering::LowerFRAME_TO_ARGS_OFFSET(SDValue Op,
>>                                                       SelectionDAG &DAG)
>> const {
>> -  return DAG.getIntPtrConstant(2*TD->getPointerSize());
>> +  return DAG.getIntPtrConstant(2*TD->getPointerSize(0));
>>  }
>>
>>  SDValue X86TargetLowering::LowerEH_RETURN(SDValue Op, SelectionDAG &DAG)
>> const {
>> @@ -10340,7 +10340,7 @@
>>    unsigned StoreAddrReg = (Subtarget->is64Bit() ? X86::RCX : X86::ECX);
>>
>>    SDValue StoreAddr = DAG.getNode(ISD::ADD, dl, getPointerTy(), Frame,
>> -
>> DAG.getIntPtrConstant(TD->getPointerSize()));
>> +
>> DAG.getIntPtrConstant(TD->getPointerSize(0)));
>>    StoreAddr = DAG.getNode(ISD::ADD, dl, getPointerTy(), StoreAddr,
>> Offset);
>>    Chain = DAG.getStore(Chain, dl, Handler, StoreAddr,
>> MachinePointerInfo(),
>>                         false, false, 0);
>>
>> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp (original)
>> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Mon Oct 15
>> 11:24:29 2012
>> @@ -1293,15 +1293,16 @@
>>    // If the source integer type is not the intptr_t type for this target,
>> do a
>>    // trunc or zext to the intptr_t type, then inttoptr of it.  This
>> allows the
>>    // cast to be exposed to other transforms.
>> +  unsigned AS = CI.getAddressSpace();
>>    if (TD) {
>>      if (CI.getOperand(0)->getType()->getScalarSizeInBits() >
>> -        TD->getPointerSizeInBits()) {
>> +        TD->getPointerSizeInBits(AS)) {
>>        Value *P = Builder->CreateTrunc(CI.getOperand(0),
>>
>> TD->getIntPtrType(CI.getContext()));
>>        return new IntToPtrInst(P, CI.getType());
>>      }
>>      if (CI.getOperand(0)->getType()->getScalarSizeInBits() <
>> -        TD->getPointerSizeInBits()) {
>> +        TD->getPointerSizeInBits(AS)) {
>>        Value *P = Builder->CreateZExt(CI.getOperand(0),
>>                                       TD->getIntPtrType(CI.getContext()));
>>        return new IntToPtrInst(P, CI.getType());
>> @@ -1368,13 +1369,14 @@
>>    // If the destination integer type is not the intptr_t type for this
>> target,
>>    // do a ptrtoint to intptr_t then do a trunc or zext.  This allows the
>> cast
>>    // to be exposed to other transforms.
>> +  unsigned AS = CI.getPointerAddressSpace();
>>    if (TD) {
>> -    if (CI.getType()->getScalarSizeInBits() < TD->getPointerSizeInBits())
>> {
>> +    if (CI.getType()->getScalarSizeInBits() <
>> TD->getPointerSizeInBits(AS)) {
>>        Value *P = Builder->CreatePtrToInt(CI.getOperand(0),
>>
>> TD->getIntPtrType(CI.getContext()));
>>        return new TruncInst(P, CI.getType());
>>      }
>> -    if (CI.getType()->getScalarSizeInBits() > TD->getPointerSizeInBits())
>> {
>> +    if (CI.getType()->getScalarSizeInBits() >
>> TD->getPointerSizeInBits(AS)) {
>>        Value *P = Builder->CreatePtrToInt(CI.getOperand(0),
>>
>> TD->getIntPtrType(CI.getContext()));
>>        return new ZExtInst(P, CI.getType());
>>
>> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
>> (original)
>> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Mon Oct
>> 15 11:24:29 2012
>> @@ -365,11 +365,12 @@
>>    // order the state machines in complexity of the generated code.
>>    Value *Idx = GEP->getOperand(2);
>>
>> +  unsigned AS = GEP->getPointerAddressSpace();
>>    // If the index is larger than the pointer size of the target, truncate
>> the
>>    // index down like the GEP would do implicitly.  We don't have to do
>> this for
>>    // an inbounds GEP because the index can't be out of range.
>>    if (!GEP->isInBounds() &&
>> -      Idx->getType()->getPrimitiveSizeInBits() >
>> TD->getPointerSizeInBits())
>> +      Idx->getType()->getPrimitiveSizeInBits() >
>> TD->getPointerSizeInBits(AS))
>>      Idx = Builder->CreateTrunc(Idx,
>> TD->getIntPtrType(Idx->getContext()));
>>
>>    // If the comparison is only true for one or two elements, emit direct
>> @@ -528,10 +529,11 @@
>>      }
>>    }
>>
>> +  unsigned AS = cast<GetElementPtrInst>(GEP)->getPointerAddressSpace();
>>    // Okay, we know we have a single variable index, which must be a
>>    // pointer/array/vector index.  If there is no offset, life is simple,
>> return
>>    // the index.
>> -  unsigned IntPtrWidth = TD.getPointerSizeInBits();
>> +  unsigned IntPtrWidth = TD.getPointerSizeInBits(AS);
>>    if (Offset == 0) {
>>      // Cast to intptrty in case a truncation occurs.  If an extension is
>> needed,
>>      // we don't need to bother extending: the extension won't affect
>> where the
>> @@ -1552,7 +1554,8 @@
>>    // Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if
>> the
>>    // integer type is the same size as the pointer type.
>>    if (TD && LHSCI->getOpcode() == Instruction::PtrToInt &&
>> -      TD->getPointerSizeInBits() ==
>> +      TD->getPointerSizeInBits(
>> +        cast<PtrToIntInst>(LHSCI)->getPointerAddressSpace()) ==
>>           cast<IntegerType>(DestTy)->getBitWidth()) {
>>      Value *RHSOp = 0;
>>      if (Constant *RHSC = dyn_cast<Constant>(ICI.getOperand(1))) {
>>
>> Modified: llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
>> (original)
>> +++ llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp Mon Oct
>> 15 11:24:29 2012
>> @@ -735,7 +735,7 @@
>>    BL.reset(new BlackList(ClBlackListFile));
>>
>>    C = &(M.getContext());
>> -  LongSize = TD->getPointerSizeInBits();
>> +  LongSize = TD->getPointerSizeInBits(0);
>>    IntptrTy = Type::getIntNTy(*C, LongSize);
>>    IntptrPtrTy = PointerType::get(IntptrTy, 0);
>>
>>
>> Modified: llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp Mon Oct 15
>> 11:24:29 2012
>> @@ -174,10 +174,11 @@
>>    // this width can be stored.  If so, check to see whether we will end
>> up
>>    // actually reducing the number of stores used.
>>    unsigned Bytes = unsigned(End-Start);
>> -  unsigned NumPointerStores = Bytes/TD.getPointerSize();
>> +  unsigned AS = cast<StoreInst>(TheStores[0])->getPointerAddressSpace();
>> +  unsigned NumPointerStores = Bytes/TD.getPointerSize(AS);
>>
>>    // Assume the remaining bytes if any are done a byte at a time.
>> -  unsigned NumByteStores = Bytes - NumPointerStores*TD.getPointerSize();
>> +  unsigned NumByteStores = Bytes -
>> NumPointerStores*TD.getPointerSize(AS);
>>
>>    // If we will reduce the # stores (according to this heuristic), do the
>>    // transformation.  This encourages merging 4 x i8 -> i32 and 2 x i16
>> -> i32
>>
>> Modified: llvm/trunk/lib/Transforms/Scalar/SROA.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SROA.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Scalar/SROA.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Scalar/SROA.cpp Mon Oct 15 11:24:29 2012
>> @@ -447,6 +447,7 @@
>>
>>    bool computeConstantGEPOffset(GetElementPtrInst &GEPI, int64_t
>> &GEPOffset) {
>>      GEPOffset = Offset;
>> +    unsigned int AS = GEPI.getPointerAddressSpace();
>>      for (gep_type_iterator GTI = gep_type_begin(GEPI), GTE =
>> gep_type_end(GEPI);
>>           GTI != GTE; ++GTI) {
>>        ConstantInt *OpC = dyn_cast<ConstantInt>(GTI.getOperand());
>> @@ -476,7 +477,7 @@
>>          continue;
>>        }
>>
>> -      APInt Index =
>> OpC->getValue().sextOrTrunc(TD.getPointerSizeInBits());
>> +      APInt Index =
>> OpC->getValue().sextOrTrunc(TD.getPointerSizeInBits(AS));
>>        Index *= APInt(Index.getBitWidth(),
>>                       TD.getTypeAllocSize(GTI.getIndexedType()));
>>        Index += APInt(Index.getBitWidth(), (uint64_t)GEPOffset,
>> @@ -1784,7 +1785,9 @@
>>        break;
>>      if (SequentialType *SeqTy = dyn_cast<SequentialType>(ElementTy)) {
>>        ElementTy = SeqTy->getElementType();
>> -      Indices.push_back(IRB.getInt(APInt(TD.getPointerSizeInBits(), 0)));
>> +      Indices.push_back(IRB.getInt(APInt(TD.getPointerSizeInBits(
>> +                ElementTy->isPointerTy() ?
>> +                cast<PointerType>(ElementTy)->getAddressSpace(): 0),
>> 0)));
>>      } else if (StructType *STy = dyn_cast<StructType>(ElementTy)) {
>>        if (STy->element_begin() == STy->element_end())
>>          break; // Nothing left to descend into.
>> @@ -2322,7 +2325,8 @@
>>
>>    Value *getAdjustedAllocaPtr(IRBuilder<> &IRB, Type *PointerTy) {
>>      assert(BeginOffset >= NewAllocaBeginOffset);
>> -    APInt Offset(TD.getPointerSizeInBits(), BeginOffset -
>> NewAllocaBeginOffset);
>> +    unsigned AS = cast<PointerType>(PointerTy)->getAddressSpace();
>> +    APInt Offset(TD.getPointerSizeInBits(AS), BeginOffset -
>> NewAllocaBeginOffset);
>>      return getAdjustedPtr(IRB, TD, &NewAI, Offset, PointerTy,
>> getName(""));
>>    }
>>
>> @@ -2677,8 +2681,10 @@
>>      const AllocaPartitioning::MemTransferOffsets &MTO
>>        = P.getMemTransferOffsets(II);
>>
>> +    assert(OldPtr->getType()->isPointerTy() && "Must be a pointer
>> type!");
>> +    unsigned AS =
>> cast<PointerType>(OldPtr->getType())->getAddressSpace();
>>      // Compute the relative offset within the transfer.
>> -    unsigned IntPtrWidth = TD.getPointerSizeInBits();
>> +    unsigned IntPtrWidth = TD.getPointerSizeInBits(AS);
>>      APInt RelOffset(IntPtrWidth, BeginOffset - (IsDest ? MTO.DestBegin
>>                                                         :
>> MTO.SourceBegin));
>>
>>
>> Modified: llvm/trunk/lib/Transforms/Utils/Local.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=165941&r1=165940&r2=165941&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Utils/Local.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Utils/Local.cpp Mon Oct 15 11:24:29 2012
>> @@ -806,7 +806,8 @@
>>                                            const DataLayout *TD) {
>>    assert(V->getType()->isPointerTy() &&
>>           "getOrEnforceKnownAlignment expects a pointer!");
>> -  unsigned BitWidth = TD ? TD->getPointerSizeInBits() : 64;
>> +  unsigned AS = cast<PointerType>(V->getType())->getAddressSpace();
>> +  unsigned BitWidth = TD ? TD->getPointerSizeInBits(AS) : 64;
>>    APInt KnownZero(BitWidth, 0), KnownOne(BitWidth, 0);
>>    ComputeMaskedBits(V, KnownZero, KnownOne, TD);
>>    unsigned TrailZ = KnownZero.countTrailingOnes();
>>
>>
>> _______________________________________________
>> 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