[llvm-commits] Patch to add address space support to getIntPtrTy
Villmow, Micah
Micah.Villmow at amd.com
Fri Oct 19 08:03:46 PDT 2012
Thanks for the review, so it looks like I should add two new
interfaces, getIntPtrTy(Type*) and getIntPtrTy(MachinePtrInfo*),
and update the patches accordingly along with the other changes.
Micah
> -----Original Message-----
> From: Eli Friedman [mailto:eli.friedman at gmail.com]
> Sent: Thursday, October 18, 2012 6:31 PM
> To: Villmow, Micah
> Cc: llvm-commits at cs.uiuc.edu
> Subject: Re: [llvm-commits] Patch to add address space support to
> getIntPtrTy
>
> On Thu, Oct 18, 2012 at 4:10 PM, Villmow, Micah <Micah.Villmow at amd.com>
> wrote:
> > Weird, ok, attached the re-updated new one.
>
> Since you mentioned it, I think getIntPtrTy(Type*) is a very good idea.
> It would simplify a bunch of changes in this patch. (I would prefer
> Type* over Value* because the meaning is more obvious.)
>
> Index: lib/Analysis/ScalarEvolution.cpp
> ===================================================================
> --- lib/Analysis/ScalarEvolution.cpp (revision 166195)
> +++ lib/Analysis/ScalarEvolution.cpp (working copy)
> @@ -2586,7 +2586,7 @@
> // constant expression and then folding it back into a ConstantInt.
> // This is just a compile-time optimization.
> if (TD)
> - return getConstant(TD->getIntPtrType(getContext()),
> + return getConstant(TD->getIntPtrType(getContext(), 0),
> TD->getTypeAllocSize(AllocTy));
>
> Constant *C = ConstantExpr::getSizeOf(AllocTy);
>
> I think this needs to take the integer type from the caller.
>
> @@ -2612,7 +2612,7 @@
> // constant expression and then folding it back into a ConstantInt.
> // This is just a compile-time optimization.
> if (TD)
> - return getConstant(TD->getIntPtrType(getContext()),
> + return getConstant(TD->getIntPtrType(getContext(), 0),
> TD->getStructLayout(STy)-
> >getElementOffset(FieldNo));
>
> Constant *C = ConstantExpr::getOffsetOf(STy, FieldNo);
>
> Same here.
>
> Index: lib/CodeGen/SelectionDAG/FastISel.cpp
> ===================================================================
> --- lib/CodeGen/SelectionDAG/FastISel.cpp (revision 166195)
> +++ lib/CodeGen/SelectionDAG/FastISel.cpp (working copy)
> @@ -100,10 +100,16 @@
> return false;
>
> // No-op casts are trivially coalesced by fast-isel.
> - if (const CastInst *Cast = dyn_cast<CastInst>(I))
> - if (Cast->isNoopCast(TD.getIntPtrType(Cast->getContext())) &&
> + if (const CastInst *Cast = dyn_cast<CastInst>(I)) {
> + unsigned AS = 0;
> + if (Cast->getOpcode() == Instruction::PtrToInt)
> + AS = Cast->getOperand(0)->getType()->getPointerAddressSpace();
> + else if (Cast->getOpcode() == Instruction::IntToPtr)
> + AS = Cast->getType()->getPointerAddressSpace();
> + if (Cast->isNoopCast(TD.getIntPtrType(Cast->getContext(), AS)) &&
> !hasTrivialKill(Cast->getOperand(0)))
> return false;
> + }
>
> Can you change isNoopCast to take a DataLayout or something like that?
> This just makes the code unreadable.
>
> Index: lib/CodeGen/SelectionDAG/SelectionDAG.cpp
> ===================================================================
> --- lib/CodeGen/SelectionDAG/SelectionDAG.cpp (revision 166195)
> +++ lib/CodeGen/SelectionDAG/SelectionDAG.cpp (working copy)
> @@ -3804,7 +3804,8 @@
> // Emit a library call.
> TargetLowering::ArgListTy Args;
> TargetLowering::ArgListEntry Entry;
> - Entry.Ty = TLI.getDataLayout()->getIntPtrType(*getContext());
> + unsigned AS = SrcPtrInfo.getAddrSpace(); Entry.Ty =
> + TLI.getDataLayout()->getIntPtrType(*getContext(), AS);
> Entry.Node = Dst; Args.push_back(Entry);
> Entry.Node = Src; Args.push_back(Entry);
> Entry.Node = Size; Args.push_back(Entry);
>
> This pattern seems common enough that you should just add a
> getIntPtrType somewhere that takes a MachinePointerInfo.
>
> Index: lib/Transforms/InstCombine/InstCombineCalls.cpp
> ===================================================================
> --- lib/Transforms/InstCombine/InstCombineCalls.cpp (revision 166195)
> +++ lib/Transforms/InstCombine/InstCombineCalls.cpp (working copy)
> @@ -996,9 +996,13 @@
> // Conversion is ok if changing from one pointer type to
> another or from
> // a pointer to an integer of the same size.
> !((OldRetTy->isPointerTy() || !TD ||
> - OldRetTy == TD->getIntPtrType(Caller->getContext())) &&
> + // FIXME: Not sure what to do here, so setting AS to 0.
> + // How can the AS for a function call be outside the
> default?
> + OldRetTy == TD->getIntPtrType(Caller->getContext(), 0)) &&
> (NewRetTy->isPointerTy() || !TD ||
> - NewRetTy == TD->getIntPtrType(Caller->getContext()))))
> + // FIXME: Not sure what to do here, so setting AS to 0.
> + // How can the AS for a function call be outside the
> default?
> + NewRetTy == TD->getIntPtrType(Caller->getContext(), 0))))
> return false; // Cannot transform this return value.
>
> if (!Caller->use_empty() &&
>
> This code is trying to compare OldRetTy and NewRetTy. So the relevant
> check is something like "OldRetTy == TD->getIntPtrType(NewRetTy)",
> assuming the new getIntPtrTy(Type*) utility.
>
> Index: lib/Transforms/InstCombine/InstructionCombining.cpp
> ===================================================================
> --- lib/Transforms/InstCombine/InstructionCombining.cpp (revision 166195)
> +++ lib/Transforms/InstCombine/InstructionCombining.cpp (working copy)
> @@ -746,7 +746,8 @@
> // Start with the index over the outer type. Note that the type size
> // might be zero (even if the offset isn't zero) if the indexed type
> // is something like [0 x {int, int}]
> - Type *IntPtrTy = TD->getIntPtrType(Ty->getContext());
> + // FIXME: Not sure what to do here, so setting address space to
> default.
> + Type *IntPtrTy = TD->getIntPtrType(Ty->getContext(), 0);
> int64_t FirstIdx = 0;
> if (int64_t TySize = TD->getTypeAllocSize(Ty)) {
> FirstIdx = Offset/TySize;
>
> The integer type needs to come from the caller.
>
> -Eli
More information about the llvm-commits
mailing list