[llvm-commits] [llvm] r166624 - in /llvm/trunk: lib/Transforms/Scalar/GVN.cpp test/Transforms/GVN/pr14166.ll
Hal Finkel
hfinkel at anl.gov
Wed Oct 24 14:49:53 PDT 2012
----- Original Message -----
> From: "Chandler Carruth" <chandlerc at google.com>
> To: "Hal Finkel" <hfinkel at anl.gov>
> Cc: "Commit Messages and Patches for LLVM" <llvm-commits at cs.uiuc.edu>
> Sent: Wednesday, October 24, 2012 4:41:26 PM
> Subject: Re: [llvm-commits] [llvm] r166624 - in /llvm/trunk: lib/Transforms/Scalar/GVN.cpp
> test/Transforms/GVN/pr14166.ll
>
> On Wed, Oct 24, 2012 at 2:22 PM, Hal Finkel <hfinkel at anl.gov> wrote:
> > Author: hfinkel
> > Date: Wed Oct 24 16:22:30 2012
> > New Revision: 166624
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=166624&view=rev
> > Log:
> > Update GVN to support vectors of pointers.
> >
> > GVN will now generate ptrtoint instructions for vectors of
> > pointers.
> > Fixes PR14166.
> >
> > Added:
> > llvm/trunk/test/Transforms/GVN/pr14166.ll
> > Modified:
> > llvm/trunk/lib/Transforms/Scalar/GVN.cpp
> >
> > Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp
> > URL:
> > http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=166624&r1=166623&r2=166624&view=diff
> > ==============================================================================
> > --- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original)
> > +++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Wed Oct 24 16:22:30
> > 2012
> > @@ -746,6 +746,15 @@
> > return true;
> > }
> >
> > +/// Wrap TD.getIntPtrType, but return a vector type for vector
> > inputs.
> > +static Type *getIntPtrType(Type *Ty, const DataLayout &TD) {
>
> Why not sink this into DataLayout::getIntPtrType? We might need to
> have both interfaces available, but your wrapper seems generally
> useful...
Sure. What should we call it? (FWIW, the function in DataLayout returns a IntegerType *, and I think that is why it behaves as it currently does).
-Hal
>
> > + Type *ITy = TD.getIntPtrType(Ty);
> > + if (Ty->isVectorTy()) {
> > + ITy = VectorType::get(ITy, Ty->getVectorNumElements());
> > + }
> > +
> > + return ITy;
> > +}
> >
> > /// CoerceAvailableValueToLoadType - If we saw a store of a value
> > to memory, and
> > /// then a load from a must-aliased pointer of a different type,
> > try to coerce
> > @@ -769,24 +778,25 @@
> > // If the store and reload are the same size, we can always
> > reuse it.
> > if (StoreSize == LoadSize) {
> > // Pointer to Pointer -> use bitcast.
> > - if (StoredValTy->isPointerTy() && LoadedTy->isPointerTy())
> > + if (StoredValTy->getScalarType()->isPointerTy() &&
> > + LoadedTy->getScalarType()->isPointerTy())
> > return new BitCastInst(StoredVal, LoadedTy, "", InsertPt);
> >
> > // Convert source pointers to integers, which can be bitcast.
> > - if (StoredValTy->isPointerTy()) {
> > - StoredValTy = TD.getIntPtrType(StoredValTy);
> > + if (StoredValTy->getScalarType()->isPointerTy()) {
> > + StoredValTy = getIntPtrType(StoredValTy, TD);
> > StoredVal = new PtrToIntInst(StoredVal, StoredValTy, "",
> > InsertPt);
> > }
> >
> > Type *TypeToCastTo = LoadedTy;
> > - if (TypeToCastTo->isPointerTy())
> > - TypeToCastTo = TD.getIntPtrType(StoredValTy);
> > + if (TypeToCastTo->getScalarType()->isPointerTy())
> > + TypeToCastTo = getIntPtrType(StoredValTy, TD);
> >
> > if (StoredValTy != TypeToCastTo)
> > StoredVal = new BitCastInst(StoredVal, TypeToCastTo, "",
> > InsertPt);
> >
> > // Cast to pointer if the load needs a pointer type.
> > - if (LoadedTy->isPointerTy())
> > + if (LoadedTy->getScalarType()->isPointerTy())
> > StoredVal = new IntToPtrInst(StoredVal, LoadedTy, "",
> > InsertPt);
> >
> > return StoredVal;
> > @@ -798,8 +808,8 @@
> > assert(StoreSize >= LoadSize && "CanCoerceMustAliasedValueToLoad
> > fail");
> >
> > // Convert source pointers to integers, which can be
> > manipulated.
> > - if (StoredValTy->isPointerTy()) {
> > - StoredValTy = TD.getIntPtrType(StoredValTy);
> > + if (StoredValTy->getScalarType()->isPointerTy()) {
> > + StoredValTy = getIntPtrType(StoredValTy, TD);
> > StoredVal = new PtrToIntInst(StoredVal, StoredValTy, "",
> > InsertPt);
> > }
> >
> > @@ -824,7 +834,7 @@
> > return StoredVal;
> >
> > // If the result is a pointer, inttoptr.
> > - if (LoadedTy->isPointerTy())
> > + if (LoadedTy->getScalarType()->isPointerTy())
> > return new IntToPtrInst(StoredVal, LoadedTy, "inttoptr",
> > InsertPt);
> >
> > // Otherwise, bitcast.
> > @@ -1019,9 +1029,9 @@
> >
> > // Compute which bits of the stored value are being used by the
> > load. Convert
> > // to an integer type to start with.
> > - if (SrcVal->getType()->isPointerTy())
> > + if (SrcVal->getType()->getScalarType()->isPointerTy())
> > SrcVal = Builder.CreatePtrToInt(SrcVal,
> > - TD.getIntPtrType(SrcVal->getType()));
> > + getIntPtrType(SrcVal->getType(), TD));
> > if (!SrcVal->getType()->isIntegerTy())
> > SrcVal = Builder.CreateBitCast(SrcVal, IntegerType::get(Ctx,
> > StoreSize*8));
> >
> > @@ -1302,7 +1312,7 @@
> > Value *V = SSAUpdate.GetValueInMiddleOfBlock(LI->getParent());
> >
> > // If new PHI nodes were created, notify alias analysis.
> > - if (V->getType()->isPointerTy()) {
> > + if (V->getType()->getScalarType()->isPointerTy()) {
> > AliasAnalysis *AA = gvn.getAliasAnalysis();
> >
> > for (unsigned i = 0, e = NewPHIs.size(); i != e; ++i)
> > @@ -1499,7 +1509,7 @@
> >
> > if (isa<PHINode>(V))
> > V->takeName(LI);
> > - if (V->getType()->isPointerTy())
> > + if (V->getType()->getScalarType()->isPointerTy())
> > MD->invalidateCachedPointerInfo(V);
> > markInstructionForDeletion(LI);
> > ++NumGVNLoad;
> > @@ -1731,7 +1741,7 @@
> > LI->replaceAllUsesWith(V);
> > if (isa<PHINode>(V))
> > V->takeName(LI);
> > - if (V->getType()->isPointerTy())
> > + if (V->getType()->getScalarType()->isPointerTy())
> > MD->invalidateCachedPointerInfo(V);
> > markInstructionForDeletion(LI);
> > ++NumPRELoad;
> > @@ -1858,7 +1868,7 @@
> >
> > // Replace the load!
> > L->replaceAllUsesWith(AvailVal);
> > - if (AvailVal->getType()->isPointerTy())
> > + if (AvailVal->getType()->getScalarType()->isPointerTy())
> > MD->invalidateCachedPointerInfo(AvailVal);
> > markInstructionForDeletion(L);
> > ++NumGVNLoad;
> > @@ -1915,7 +1925,7 @@
> >
> > // Remove it!
> > L->replaceAllUsesWith(StoredVal);
> > - if (StoredVal->getType()->isPointerTy())
> > + if (StoredVal->getType()->getScalarType()->isPointerTy())
> > MD->invalidateCachedPointerInfo(StoredVal);
> > markInstructionForDeletion(L);
> > ++NumGVNLoad;
> > @@ -1944,7 +1954,7 @@
> >
> > // Remove it!
> > patchAndReplaceAllUsesWith(AvailableVal, L);
> > - if (DepLI->getType()->isPointerTy())
> > + if (DepLI->getType()->getScalarType()->isPointerTy())
> > MD->invalidateCachedPointerInfo(DepLI);
> > markInstructionForDeletion(L);
> > ++NumGVNLoad;
> > @@ -2185,7 +2195,7 @@
> > // "%z = and i32 %x, %y" becomes "%z = and i32 %x, %x" which we
> > now simplify.
> > if (Value *V = SimplifyInstruction(I, TD, TLI, DT)) {
> > I->replaceAllUsesWith(V);
> > - if (MD && V->getType()->isPointerTy())
> > + if (MD && V->getType()->getScalarType()->isPointerTy())
> > MD->invalidateCachedPointerInfo(V);
> > markInstructionForDeletion(I);
> > ++NumGVNSimpl;
> > @@ -2285,7 +2295,7 @@
> >
> > // Remove it!
> > patchAndReplaceAllUsesWith(repl, I);
> > - if (MD && repl->getType()->isPointerTy())
> > + if (MD && repl->getType()->getScalarType()->isPointerTy())
> > MD->invalidateCachedPointerInfo(repl);
> > markInstructionForDeletion(I);
> > return true;
> > @@ -2533,7 +2543,7 @@
> > addToLeaderTable(ValNo, Phi, CurrentBlock);
> > Phi->setDebugLoc(CurInst->getDebugLoc());
> > CurInst->replaceAllUsesWith(Phi);
> > - if (Phi->getType()->isPointerTy()) {
> > + if (Phi->getType()->getScalarType()->isPointerTy()) {
> > // Because we have added a PHI-use of the pointer value,
> > it has now
> > // "escaped" from alias analysis' perspective. We need to
> > inform
> > // AA of this.
> >
> > Added: llvm/trunk/test/Transforms/GVN/pr14166.ll
> > URL:
> > http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/pr14166.ll?rev=166624&view=auto
> > ==============================================================================
> > --- llvm/trunk/test/Transforms/GVN/pr14166.ll (added)
> > +++ llvm/trunk/test/Transforms/GVN/pr14166.ll Wed Oct 24 16:22:30
> > 2012
> > @@ -0,0 +1,27 @@
> > +; RUN: opt -gvn -S < %s | FileCheck %s
> > +target datalayout = "e-p:32:32:32"
> > +target triple = "i386-pc-linux-gnu"
> > +define <2 x i32> @test1() {
> > + %v1 = alloca <2 x i32>
> > + call void @anything(<2 x i32>* %v1)
> > + %v2 = load <2 x i32>* %v1
> > + %v3 = inttoptr <2 x i32> %v2 to <2 x i8*>
> > + %v4 = bitcast <2 x i32>* %v1 to <2 x i8*>*
> > + store <2 x i8*> %v3, <2 x i8*>* %v4
> > + %v5 = load <2 x i32>* %v1
> > + ret <2 x i32> %v5
> > +; CHECK: @test1
> > +; CHECK: %v1 = alloca <2 x i32>
> > +; CHECK: call void @anything(<2 x i32>* %v1)
> > +; CHECK: %v2 = load <2 x i32>* %v1
> > +; CHECK: %v3 = inttoptr <2 x i32> %v2 to <2 x i8*>
> > +; CHECK: %v4 = bitcast <2 x i32>* %v1 to <2 x i8*>*
> > +; CHECK: store <2 x i8*> %v3, <2 x i8*>* %v4
> > +; CHECK: %1 = ptrtoint <2 x i8*> %v3 to <2 x i32>
> > +; CHECK: %2 = bitcast <2 x i32> %1 to i64
> > +; CHECK: %3 = bitcast i64 %2 to <2 x i32>
> > +; CHECK: ret <2 x i32> %3
> > +}
> > +
> > +declare void @anything(<2 x i32>*)
> > +
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
--
Hal Finkel
Postdoctoral Appointee
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-commits
mailing list