[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:41:26 PDT 2012


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

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



More information about the llvm-commits mailing list