[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