<div dir="ltr">Hi,<div><br></div><div><br></div><div>I found this commit cause troubles when self-build llvm. I'm trying to solve this right now, if it's not easy to fix by today, I will revert it hours later.</div><div><br></div><div>Sorry about that,</div><div>Kevin</div></div><div class="gmail_extra"><br><div class="gmail_quote">2015-03-09 14:14 GMT+08:00 Kevin Qin <span dir="ltr"><<a href="mailto:Kevin.Qin@arm.com" target="_blank">Kevin.Qin@arm.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: kevinqin<br>
Date: Mon Mar  9 01:14:07 2015<br>
New Revision: 231630<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=231630&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=231630&view=rev</a><br>
Log:<br>
Run LICM pass after loop unrolling pass.<br>
<br>
Runtime unrollng will introduce a runtime check in loop prologue.<br>
If the unrolled loop is a inner loop, then the proglogue will be inside<br>
the outer loop. LICM pass can help to promote the runtime check out if<br>
the checked value is loop invariant.<br>
<br>
Added:<br>
    llvm/trunk/test/Transforms/LoopUnroll/runtime-loop4.ll<br>
Modified:<br>
    llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp<br>
    llvm/trunk/lib/Transforms/Utils/LoopUnrollRuntime.cpp<br>
<br>
Modified: llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp?rev=231630&r1=231629&r2=231630&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp?rev=231630&r1=231629&r2=231630&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp Mon Mar  9 01:14:07 2015<br>
@@ -364,8 +364,14 @@ void PassManagerBuilder::populateModuleP<br>
   MPM.add(createCFGSimplificationPass());<br>
   MPM.add(createInstructionCombiningPass());<br>
<br>
-  if (!DisableUnrollLoops)<br>
+  if (!DisableUnrollLoops) {<br>
     MPM.add(createLoopUnrollPass());    // Unroll small loops<br>
+    // Runtime unrollng will introduce runtime check in loop prologue. If the<br>
+    // unrolled loop is a inner loop, then the prologue will be inside the<br>
+    // outer loop. LICM pass can help to promote the runtime check out if the<br>
+    // checked value is loop invariant.<br>
+    MPM.add(createLICMPass());<br>
+  }<br>
<br>
   // After vectorization and unrolling, assume intrinsics may tell us more<br>
   // about pointer alignments.<br>
<br>
Modified: llvm/trunk/lib/Transforms/Utils/LoopUnrollRuntime.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LoopUnrollRuntime.cpp?rev=231630&r1=231629&r2=231630&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LoopUnrollRuntime.cpp?rev=231630&r1=231629&r2=231630&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Utils/LoopUnrollRuntime.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Utils/LoopUnrollRuntime.cpp Mon Mar  9 01:14:07 2015<br>
@@ -142,7 +142,7 @@ static void CloneLoopBlocks(Loop *L, Val<br>
                             BasicBlock *InsertTop, BasicBlock *InsertBot,<br>
                             std::vector<BasicBlock *> &NewBlocks,<br>
                             LoopBlocksDFS &LoopBlocks, ValueToValueMapTy &VMap,<br>
-                            LoopInfo *LI) {<br>
+                            LoopInfo *LI, LPPassManager *LPM) {<br>
   BasicBlock *Preheader = L->getLoopPreheader();<br>
   BasicBlock *Header = L->getHeader();<br>
   BasicBlock *Latch = L->getLoopLatch();<br>
@@ -153,10 +153,7 @@ static void CloneLoopBlocks(Loop *L, Val<br>
   Loop *ParentLoop = L->getParentLoop();<br>
   if (!UnrollProlog) {<br>
     NewLoop = new Loop();<br>
-    if (ParentLoop)<br>
-      ParentLoop->addChildLoop(NewLoop);<br>
-    else<br>
-      LI->addTopLevelLoop(NewLoop);<br>
+    LPM->insertLoop(NewLoop, ParentLoop);<br>
   }<br>
<br>
   // For each block in the original loop, create a new copy,<br>
@@ -390,7 +387,7 @@ bool llvm::UnrollRuntimeLoopProlog(Loop<br>
   // the loop, otherwise we create a cloned loop to execute the extra<br>
   // iterations. This function adds the appropriate CFG connections.<br>
   CloneLoopBlocks(L, ModVal, UnrollPrologue, PH, PEnd, NewBlocks, LoopBlocks,<br>
-                  VMap, LI);<br>
+                  VMap, LI, LPM);<br>
<br>
   // Insert the cloned blocks into function just before the original loop<br>
   F->getBasicBlockList().splice(PEnd, F->getBasicBlockList(), NewBlocks[0],<br>
<br>
Added: llvm/trunk/test/Transforms/LoopUnroll/runtime-loop4.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopUnroll/runtime-loop4.ll?rev=231630&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopUnroll/runtime-loop4.ll?rev=231630&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Transforms/LoopUnroll/runtime-loop4.ll (added)<br>
+++ llvm/trunk/test/Transforms/LoopUnroll/runtime-loop4.ll Mon Mar  9 01:14:07 2015<br>
@@ -0,0 +1,43 @@<br>
+; RUN: opt < %s -S -O2 -unroll-runtime=true | FileCheck %s<br>
+<br>
+; Check runtime unrolling prologue can be promoted by LICM pass.<br>
+<br>
+; CHECK: entry:<br>
+; CHECK: %xtraiter<br>
+; CHECK: %lcmp.mod<br>
+; CHECK: loop1:<br>
+; CHECK: br i1 %lcmp.mod<br>
+; CHECK: loop2.prol:<br>
+<br>
+define void @unroll(i32 %iter, i32* %addr1, i32* %addr2) nounwind {<br>
+entry:<br>
+  br label %loop1<br>
+<br>
+loop1:<br>
+  %iv1 = phi i32 [ 0, %entry ], [ %inc1, %loop1.latch ]<br>
+  %offset1 = getelementptr i32, i32* %addr1, i32 %iv1<br>
+  store i32 %iv1, i32* %offset1, align 4<br>
+  br label %loop2.header<br>
+<br>
+loop2.header:<br>
+  br label %loop2<br>
+<br>
+loop2:<br>
+  %iv2 = phi i32 [ 0, %loop2.header ], [ %inc2, %loop2 ]<br>
+  %offset2 = getelementptr i32, i32* %addr2, i32 %iv2<br>
+  store i32 %iv2, i32* %offset2, align 4<br>
+  %inc2 = add i32 %iv2, 1<br>
+  %exitcnd2 = icmp uge i32 %inc2, %iter<br>
+  br i1 %exitcnd2, label %exit2, label %loop2<br>
+<br>
+exit2:<br>
+  br label %loop1.latch<br>
+<br>
+loop1.latch:<br>
+  %inc1 = add i32 %iv1, 1<br>
+  %exitcnd1 = icmp uge i32 %inc1, 1024<br>
+  br i1 %exitcnd1, label %exit, label %loop1<br>
+<br>
+exit:<br>
+  ret void<br>
+}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr">Best Regards,<div><br></div><div>Kevin Qin</div></div></div>
</div>