[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