[llvm-commits] [llvm] r69631 - /llvm/trunk/lib/Transforms/Scalar/LoopUnroll.cpp
Dale Johannesen
dalej at apple.com
Mon Apr 20 15:41:27 PDT 2009
On Apr 20, 2009, at 3:25 PMPDT, Evan Cheng wrote:
> On Apr 20, 2009, at 3:19 PM, Dale Johannesen wrote:
>> Author: johannes
>> Date: Mon Apr 20 17:19:33 2009
>> New Revision: 69631
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=69631&view=rev
>> Log:
>> Adjust loop size estimate for full unrolling;
>> GEP's don't usually become instructions.
>
> Well... That's not entirely true. Each GEP can also become a several
> instructions. Is there a test case to demonstrate the merit of this
> change?
>
> Evan
It causes several loops in openssl(aes) to become completely unrolled,
recovering 1/3 to 1/4 of the difference between llvm-gcc and gcc.
All this is used for is determining whether to completely unroll
loops, so it won't matter often. But I have no problem doing this
some other way, e.g. increasing the threshold, if you prefer. Why
don't we see how it does overnight?
> How about changing it to what InlineCost.cpp does?
>
> } else if (const GetElementPtrInst *GEPI =
> dyn_cast<GetElementPtrInst>(II)) {
> // If a GEP has all constant indices, it will probably be
> folded with
> // a load/store.
> bool AllConstant = true;
> for (unsigned i = 1, e = GEPI->getNumOperands(); i != e; ++i)
> if (!isa<ConstantInt>(GEPI->getOperand(i))) {
> AllConstant = false;
> break;
> }
> if (AllConstant) continue;
The subscripts involved are not constant (they're based off the
induction variable, as you would expect in a loop), so that won't work.
>> Modified:
>> llvm/trunk/lib/Transforms/Scalar/LoopUnroll.cpp
>>
>> Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnroll.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnroll.cpp?rev=69631&r1=69630&r2=69631&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- llvm/trunk/lib/Transforms/Scalar/LoopUnroll.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Scalar/LoopUnroll.cpp Mon Apr 20
>> 17:19:33 2009
>> @@ -89,6 +89,8 @@
>> // Ignore instructions only used by the loop terminator.
>> } else if (isa<DbgInfoIntrinsic>(I)) {
>> // Ignore debug instructions
>> + } else if (isa<GetElementPtrInst>(I) && I->hasOneUse()) {
>> + // Ignore GEP as they generally are subsumed into a load or
>> store.
>> } else if (isa<CallInst>(I)) {
>> // Estimate size overhead introduced by call instructions
>> which
>> // is higher than other instructions. Here 3 and 10 are magic
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> _______________________________________________
> 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