[llvm-commits] [llvm] r48940 - /llvm/trunk/lib/Transforms/Scalar/GVN.cpp

Owen Anderson resistor at mac.com
Sat Mar 29 00:13:59 PDT 2008


Chris,

What's the threshold for splitting this and other memory optzns into a  
separate pass?  The core functionality of GVN is starting to get  
overwhelmed by the volume of extra things we've tacked onto it?

--Owen

On Mar 29, 2008, at 12:15 AM, Chris Lattner wrote:

> Author: lattner
> Date: Sat Mar 29 00:15:47 2008
> New Revision: 48940
>
> URL: http://llvm.org/viewvc/llvm-project?rev=48940&view=rev
> Log:
> change iterator invalidation avoidance to just move the iterator  
> backward
> when something changes, instead of moving forward.  This allows us to
> simplify memset lowering, inserting the memset at the end of the  
> range of
> stuff we're touching instead of at the start.
>
> This, in turn, allows us to make use of the addressing instructions  
> already
> used in the function instead of inserting our own.  For example, we  
> now
> codegen:
>
> 	%tmp41 = getelementptr [8 x i8]* %ref_idx, i32 0, i32 0		; <i8*>  
> [#uses=2]
> 	call void @llvm.memset.i64( i8* %tmp41, i8 -1, i64 8, i32 1 )
>
> instead of:
>
> 	%tmp20 = getelementptr [8 x i8]* %ref_idx, i32 0, i32 7		; <i8*>  
> [#uses=1]
> 	%ptroffset = getelementptr i8* %tmp20, i64 -7		; <i8*> [#uses=1]
> 	call void @llvm.memset.i64( i8* %ptroffset, i8 -1, i64 8, i32 1 )
>
>
> 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=48940&r1=48939&r2=48940&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Sat Mar 29 00:15:47 2008
> @@ -1232,8 +1232,10 @@
>   // See if the range extends the start of the range.  In this case,  
> it couldn't
>   // possibly cause it to join the prior range, because otherwise we  
> would have
>   // stopped on *it*.
> -  if (Start < I->Start)
> +  if (Start < I->Start) {
>     I->Start = Start;
> +    I->StartPtr = SI->getPointerOperand();
> +  }
>
>   // Now we know that Start <= I->End and Start >= I->Start (so the  
> startpoint
>   // is in or right at the end of I), and that End >= I->Start.   
> Extend I out to
> @@ -1345,18 +1347,17 @@
>       continue;
>
>     // Otherwise, we do want to transform this!  Create a new  
> memset.  We put
> -    // the memset right after the first store that we found in this  
> block.  This
> -    // ensures that the caller will increment the iterator to the  
> memset before
> -    // it deletes all the stores.
> -    BasicBlock::iterator InsertPt = SI; ++InsertPt;
> +    // the memset right before the first instruction that isn't  
> part of this
> +    // memset block.  This ensure that the memset is dominated by  
> any addressing
> +    // instruction needed by the start of the block.
> +    BasicBlock::iterator InsertPt = BI;
>
>     if (MemSetF == 0)
>       MemSetF = Intrinsic::getDeclaration(SI->getParent()->getParent()
>                                           ->getParent(),  
> Intrinsic::memset_i64);
>
> -    // StartPtr may not dominate the starting point.  Instead of  
> using it, base
> -    // the destination pointer off the input to the first store in  
> the block.
> -    StartPtr = SI->getPointerOperand();
> +    // Get the starting pointer of the block.
> +    StartPtr = Range.StartPtr;
>
>     // Cast the start ptr to be i8* as memset requires.
>     const Type *i8Ptr = PointerType::getUnqual(Type::Int8Ty);
> @@ -1364,12 +1365,6 @@
>       StartPtr = new BitCastInst(StartPtr, i8Ptr, StartPtr- 
> >getNameStart(),
>                                  InsertPt);
>
> -    // Offset the pointer if needed.
> -    if (Range.Start)
> -      StartPtr = new GetElementPtrInst(StartPtr,  
> ConstantInt::get(Type::Int64Ty,
> -                                                                   
> Range.Start),
> -                                       "ptroffset", InsertPt);
> -
>     Value *Ops[] = {
>       StartPtr, ByteVal,   // Start, value
>       ConstantInt::get(Type::Int64Ty, Range.End-Range.Start),  // size
> @@ -1695,7 +1690,7 @@
>
>   DominatorTree &DT = getAnalysis<DominatorTree>();
>
> -  SmallVector<Instruction*, 4> toErase;
> +  SmallVector<Instruction*, 8> toErase;
>   DenseMap<Value*, LoadInst*> lastSeenLoad;
>
>   // Top-down walk of the dominator tree
> @@ -1713,19 +1708,31 @@
>       currAvail = availableOut[DI->getIDom()->getBlock()];
>
>     for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
> -         BI != BE; ) {
> +         BI != BE;) {
>       changed_function |= processInstruction(BI, currAvail,
>                                              lastSeenLoad, toErase);
> +      if (toErase.empty()) {
> +        ++BI;
> +        continue;
> +      }
>
> +      // If we need some instructions deleted, do it now.
>       NumGVNInstr += toErase.size();
>
> -      // Avoid iterator invalidation
> -      ++BI;
> +      // Avoid iterator invalidation.
> +      bool AtStart = BI == BB->begin();
> +      if (!AtStart)
> +        --BI;
>
>       for (SmallVector<Instruction*, 4>::iterator I = toErase.begin(),
>            E = toErase.end(); I != E; ++I)
>         (*I)->eraseFromParent();
>
> +      if (AtStart)
> +        BI = BB->begin();
> +      else
> +        ++BI;
> +
>       toErase.clear();
>     }
>   }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2555 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20080329/cf281343/attachment.bin>


More information about the llvm-commits mailing list