[llvm-commits] [llvm] r166624 - in /llvm/trunk: lib/Transforms/Scalar/GVN.cpp test/Transforms/GVN/pr14166.ll

Chandler Carruth chandlerc at google.com
Wed Oct 24 14:54:12 PDT 2012


On Wed, Oct 24, 2012 at 2:49 PM, Hal Finkel <hfinkel at anl.gov> wrote:
> ----- 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).

Not sure... Maybe look at the other callers? If the other callers in
the tree would be happy with your definition, it may be fine to change
it.

>
>  -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