[llvm] r231630 - Run LICM pass after loop unrolling pass.

James Molloy james at jamesmolloy.co.uk
Thu Jul 16 00:57:03 PDT 2015


Hi Gerolf,

This patch was one of a sequence of changes to RuntimeUnrolling. We don't
have performance data for just this change. The problem it was trying to
solve was mitigating slowdown caused by being more aggressive with Runtime
unrolling.

Without this change we still got an benefit however; of the order of
0.5-1.0% geomean improvement on the usual benchmark suites.

James

On Wed, 15 Jul 2015 at 22:51 Gerolf Hoflehner <ghoflehner at apple.com> wrote:

> What is the performance impact of this change?
>
> Thanks
> Gerolf
>
> On Mar 9, 2015, at 12:21 AM, Chandler Carruth <chandlerc at google.com>
> wrote:
>
> Essentially every bot is broken from this commit onward. It seems like you
> didn't really try bootstrapping Clang and LLVM with this patch in place?
> For me at least it crashes in numerous places during a bootstrap.
>
> I'll revert all of these patches shortly as the bots have already been red
> for an hour...
>
> On Sun, Mar 8, 2015 at 11:14 PM, Kevin Qin <Kevin.Qin at arm.com> wrote:
>
> Author: kevinqin
>> Date: Mon Mar  9 01:14:07 2015
>> New Revision: 231630
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=231630&view=rev
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D231630-26view-3Drev&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=A4JvT7geMFMtpCOFM5UexDcfCN-FhM1D2hV7dsp5dlE&s=QMVKrsnbtT1FXF7fCp236HEGNYTRLnnHM0_nf6MeIEA&e=>
>
>
>> Log:
>> Run LICM pass after loop unrolling pass.
>>
>> Runtime unrollng will introduce a runtime check in loop prologue.
>> If the unrolled loop is a inner loop, then the proglogue will be inside
>> the outer loop. LICM pass can help to promote the runtime check out if
>> the checked value is loop invariant.
>>
>> Added:
>>     llvm/trunk/test/Transforms/LoopUnroll/runtime-loop4.ll
>> Modified:
>>     llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp
>>     llvm/trunk/lib/Transforms/Utils/LoopUnrollRuntime.cpp
>>
>> Modified: llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp
>>
> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp?rev=231630&r1=231629&r2=231630&view=diff
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Transforms_IPO_PassManagerBuilder.cpp-3Frev-3D231630-26r1-3D231629-26r2-3D231630-26view-3Ddiff&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=A4JvT7geMFMtpCOFM5UexDcfCN-FhM1D2hV7dsp5dlE&s=TUci7LcLnGsM4hQfCK7ErWjVE9wkgjrTjNSsO_L38yI&e=>
>
>
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp (original)
>> +++ llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp Mon Mar  9
>> 01:14:07 2015
>> @@ -364,8 +364,14 @@ void PassManagerBuilder::populateModuleP
>>    MPM.add(createCFGSimplificationPass());
>>    MPM.add(createInstructionCombiningPass());
>>
>> -  if (!DisableUnrollLoops)
>> +  if (!DisableUnrollLoops) {
>>      MPM.add(createLoopUnrollPass());    // Unroll small loops
>> +    // Runtime unrollng will introduce runtime check in loop prologue.
>> If the
>> +    // unrolled loop is a inner loop, then the prologue will be inside
>> the
>> +    // outer loop. LICM pass can help to promote the runtime check out
>> if the
>> +    // checked value is loop invariant.
>> +    MPM.add(createLICMPass());
>> +  }
>>
>>    // After vectorization and unrolling, assume intrinsics may tell us
>> more
>>    // about pointer alignments.
>>
>> Modified: llvm/trunk/lib/Transforms/Utils/LoopUnrollRuntime.cpp
>>
> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LoopUnrollRuntime.cpp?rev=231630&r1=231629&r2=231630&view=diff
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Transforms_Utils_LoopUnrollRuntime.cpp-3Frev-3D231630-26r1-3D231629-26r2-3D231630-26view-3Ddiff&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=A4JvT7geMFMtpCOFM5UexDcfCN-FhM1D2hV7dsp5dlE&s=FSkeFBCIuoCgLT_oOmwLe5jmK3guEj7JW-wcYxtPReo&e=>
>
>
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Utils/LoopUnrollRuntime.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Utils/LoopUnrollRuntime.cpp Mon Mar  9
>> 01:14:07 2015
>> @@ -142,7 +142,7 @@ static void CloneLoopBlocks(Loop *L, Val
>>                              BasicBlock *InsertTop, BasicBlock *InsertBot,
>>                              std::vector<BasicBlock *> &NewBlocks,
>>                              LoopBlocksDFS &LoopBlocks, ValueToValueMapTy
>> &VMap,
>> -                            LoopInfo *LI) {
>> +                            LoopInfo *LI, LPPassManager *LPM) {
>>    BasicBlock *Preheader = L->getLoopPreheader();
>>    BasicBlock *Header = L->getHeader();
>>    BasicBlock *Latch = L->getLoopLatch();
>> @@ -153,10 +153,7 @@ static void CloneLoopBlocks(Loop *L, Val
>>    Loop *ParentLoop = L->getParentLoop();
>>    if (!UnrollProlog) {
>>      NewLoop = new Loop();
>> -    if (ParentLoop)
>> -      ParentLoop->addChildLoop(NewLoop);
>> -    else
>> -      LI->addTopLevelLoop(NewLoop);
>> +    LPM->insertLoop(NewLoop, ParentLoop);
>>    }
>>
>>    // For each block in the original loop, create a new copy,
>> @@ -390,7 +387,7 @@ bool llvm::UnrollRuntimeLoopProlog(Loop
>>    // the loop, otherwise we create a cloned loop to execute the extra
>>    // iterations. This function adds the appropriate CFG connections.
>>    CloneLoopBlocks(L, ModVal, UnrollPrologue, PH, PEnd, NewBlocks,
>> LoopBlocks,
>> -                  VMap, LI);
>> +                  VMap, LI, LPM);
>>
>>    // Insert the cloned blocks into function just before the original loop
>>    F->getBasicBlockList().splice(PEnd, F->getBasicBlockList(),
>> NewBlocks[0],
>>
>> Added: llvm/trunk/test/Transforms/LoopUnroll/runtime-loop4.ll
>>
> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopUnroll/runtime-loop4.ll?rev=231630&view=auto
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_Transforms_LoopUnroll_runtime-2Dloop4.ll-3Frev-3D231630-26view-3Dauto&d=AwMFAg&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=A4JvT7geMFMtpCOFM5UexDcfCN-FhM1D2hV7dsp5dlE&s=Rch6ef4mBLiV7WcmXrIY7HNhM_r4ci_7phgEXGnLD_w&e=>
>
>
>>
>> ==============================================================================
>> --- llvm/trunk/test/Transforms/LoopUnroll/runtime-loop4.ll (added)
>> +++ llvm/trunk/test/Transforms/LoopUnroll/runtime-loop4.ll Mon Mar  9
>> 01:14:07 2015
>> @@ -0,0 +1,43 @@
>> +; RUN: opt < %s -S -O2 -unroll-runtime=true | FileCheck %s
>> +
>> +; Check runtime unrolling prologue can be promoted by LICM pass.
>> +
>> +; CHECK: entry:
>> +; CHECK: %xtraiter
>> +; CHECK: %lcmp.mod
>> +; CHECK: loop1:
>> +; CHECK: br i1 %lcmp.mod
>> +; CHECK: loop2.prol:
>> +
>> +define void @unroll(i32 %iter, i32* %addr1, i32* %addr2) nounwind {
>> +entry:
>> +  br label %loop1
>> +
>> +loop1:
>> +  %iv1 = phi i32 [ 0, %entry ], [ %inc1, %loop1.latch ]
>> +  %offset1 = getelementptr i32, i32* %addr1, i32 %iv1
>> +  store i32 %iv1, i32* %offset1, align 4
>> +  br label %loop2.header
>> +
>> +loop2.header:
>> +  br label %loop2
>> +
>> +loop2:
>> +  %iv2 = phi i32 [ 0, %loop2.header ], [ %inc2, %loop2 ]
>> +  %offset2 = getelementptr i32, i32* %addr2, i32 %iv2
>> +  store i32 %iv2, i32* %offset2, align 4
>> +  %inc2 = add i32 %iv2, 1
>> +  %exitcnd2 = icmp uge i32 %inc2, %iter
>> +  br i1 %exitcnd2, label %exit2, label %loop2
>> +
>> +exit2:
>> +  br label %loop1.latch
>> +
>> +loop1.latch:
>> +  %inc1 = add i32 %iv1, 1
>> +  %exitcnd1 = icmp uge i32 %inc1, 1024
>> +  br i1 %exitcnd1, label %exit, label %loop1
>> +
>> +exit:
>> +  ret void
>> +}
>>
>>
>> _______________________________________________
>> 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
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150716/2e8a0f23/attachment.html>


More information about the llvm-commits mailing list