[llvm-commits] [llvm] r165726 - 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/ExecutionEngine/Interpreter/ lib/ExecutionEngine/JIT/ lib/Target/ lib/Target/ARM/ lib/Target/MBlaze/ lib/Target/MSP430/ lib/Target/NVPTX/ lib/Target/PowerPC/ lib/Target/X86/ lib/Transforms/InstCombine/ lib/Transforms/Instrumentation/ lib/Transforms/Scalar/ lib/Transforms/Utils/

Argyrios Kyrtzidis kyrtzidis at apple.com
Thu Oct 11 11:23:35 PDT 2012


This broke building of clang:

> tools/clang/lib/CodeGen/TargetInfo.cpp:1125:59: error: too few arguments to function call, single argument 'AS' was not specified
>       Has64BitPointers(CGT.getDataLayout().getPointerSize() == 8) {
>                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
> /Users/argiris/proj/llvm/src/include/llvm/DataLayout.h:250:3: note: 'getPointerSize' declared here
>   unsigned getPointerSize(unsigned AS)          const {
>   ^
> 1 error generated.


Please fix soon or I'll have to revert.

-Argyrios

On Oct 11, 2012, at 10:21 AM, Micah Villmow <villmow at gmail.com> wrote:

> Author: mvillmow
> Date: Thu Oct 11 12:21:41 2012
> New Revision: 165726
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=165726&view=rev
> Log:
> Add in the first iteration of support for llvm/clang/lldb to allow variable per address space pointer sizes to be optimized correctly.
> 
> 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm-c/Target.h (original)
> +++ llvm/trunk/include/llvm-c/Target.h Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/DataLayout.h (original)
> +++ llvm/trunk/include/llvm/DataLayout.h Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Instructions.h (original)
> +++ llvm/trunk/include/llvm/Instructions.h Thu Oct 11 12:21:41 2012
> @@ -350,7 +350,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:
> @@ -3653,7 +3662,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:
> @@ -3695,7 +3712,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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Target/TargetLowering.h (original)
> +++ llvm/trunk/include/llvm/Target/TargetLowering.h Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/Utils/Local.h (original)
> +++ llvm/trunk/include/llvm/Transforms/Utils/Local.h Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
> +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/CodeMetrics.cpp (original)
> +++ llvm/trunk/lib/Analysis/CodeMetrics.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/ConstantFolding.cpp (original)
> +++ llvm/trunk/lib/Analysis/ConstantFolding.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/InlineCost.cpp (original)
> +++ llvm/trunk/lib/Analysis/InlineCost.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
> +++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
> +++ llvm/trunk/lib/Analysis/ValueTracking.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/OcamlGCPrinter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/OcamlGCPrinter.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MachineFunction.cpp (original)
> +++ llvm/trunk/lib/CodeGen/MachineFunction.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp (original)
> +++ llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp Thu Oct 11 12:21:41 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,15 @@
>     }
>     case Instruction::PtrToInt: {
>       GenericValue GV = getConstantValue(Op0);
> -      uint32_t PtrWidth = TD->getPointerSizeInBits();
> +      unsigned AS = cast<PtrToIntInst>(CE)->getPointerAddressSpace();
> +      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<IntToPtrInst>(CE)->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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/Interpreter/Execution.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/Interpreter/Execution.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMELFWriterInfo.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMELFWriterInfo.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/MBlaze/MBlazeELFWriterInfo.cpp (original)
> +++ llvm/trunk/lib/Target/MBlaze/MBlazeELFWriterInfo.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/MSP430/MSP430ISelLowering.cpp (original)
> +++ llvm/trunk/lib/Target/MSP430/MSP430ISelLowering.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.cpp Thu Oct 11 12:21:41 2012
> @@ -126,8 +126,9 @@
>       return Base;
> 
>     // Truncate/sext the offset to the pointer size.
> -    if (TD.getPointerSizeInBits() != 64) {
> -      int SExtAmount = 64-TD.getPointerSizeInBits();
> +    unsigned AS = cast<GetElementPtrInst>(CE)->getPointerAddressSpace();
> +    if (TD.getPointerSizeInBits(AS) != 64) {
> +      int SExtAmount = 64-TD.getPointerSizeInBits(AS);
>       Offset = (Offset << SExtAmount) >> SExtAmount;
>     }
> 
> @@ -1378,7 +1379,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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCRegisterInfo.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/Target.cpp (original)
> +++ llvm/trunk/lib/Target/Target.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86FrameLowering.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86FrameLowering.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Thu Oct 11 12:21:41 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);
> 
> @@ -10278,7 +10278,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(),
> @@ -10310,7 +10310,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 {
> @@ -10325,7 +10325,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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp (original)
> +++ llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp Thu Oct 11 12:21:41 2012
> @@ -742,7 +742,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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp Thu Oct 11 12:21:41 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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/SROA.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/SROA.cpp Thu Oct 11 12:21:41 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.
> @@ -2239,7 +2242,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(""));
>   }
> 
> @@ -2578,8 +2582,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=165726&r1=165725&r2=165726&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/Local.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/Local.cpp Thu Oct 11 12:21:41 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