[llvm-commits] [llvm] r122678 - in /llvm/trunk: lib/Transforms/Scalar/LoopIdiomRecognize.cpp test/Transforms/LoopIdiom/basic.ll

Chris Lattner clattner at apple.com
Mon Jan 3 16:10:06 PST 2011


On Jan 3, 2011, at 3:43 PM, Dan Gohman wrote:

> 
> On Jan 1, 2011, at 7:37 PM, Chris Lattner wrote:
>> 
>> +  // The # stored bytes is (BECount+1)*Size.  Expand the trip count out to
>> +  // pointer size if it isn't already.
>> +  const Type *IntPtr = TD->getIntPtrType(SI->getContext());
>> +  unsigned BESize = SE->getTypeSizeInBits(BECount->getType());
>> +  if (BESize < TD->getPointerSizeInBits())
>> +    BECount = SE->getZeroExtendExpr(BECount, IntPtr);
>> +  else if (BESize > TD->getPointerSizeInBits())
>> +    BECount = SE->getTruncateExpr(BECount, IntPtr);
> 
> This code (and other instances of it) can be simplified using
> ScalarEvolution's getTruncateOrZeroExtend.
> 
> Also, truncating is surprising here, though I guess maybe it's safe
> since any loop where it would change the value would be iterating
> over the entire address space.
> 
>> +  
>> +  const SCEV *NumBytesS = SE->getAddExpr(BECount, SE->getConstant(IntPtr, 1),
>> +                                         true, true /*nooverflow*/);
> 
> Setting nuw here is surprising, but as above, overflow would mean
> the loop is iterating over the entire address space.
> 
> Setting nsw here seems incorrect, as there's no fundamental reason why
> iterating over half of the address space is invalid.

Great points, fixed in r122790, thanks for the review!

-Chris



More information about the llvm-commits mailing list