[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

Chandler Carruth chandlerc at google.com
Wed Oct 17 00:38:38 PDT 2012


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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20121017/46979967/attachment.html>


More information about the llvm-commits mailing list