<div dir="ltr">Fix submitted with r213414.<div><br></div><div>Mark</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jul 18, 2014 at 2:36 PM, Mark Heffernan <span dir="ltr"><<a href="mailto:meheff@google.com" target="_blank">meheff@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">This broke the build.  I have the fix out in a couple minutes.<span class="HOEnZb"><font color="#888888"><div>
<br><div>Mark</div></div></font></span></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jul 18, 2014 at 2:04 PM, Mark Heffernan <span dir="ltr"><<a href="mailto:meheff@google.com" target="_blank">meheff@google.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: meheff<br>
Date: Fri Jul 18 16:04:33 2014<br>
New Revision: 213412<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=213412&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=213412&view=rev</a><br>
Log:<br>
Remove unroll pragma metadata after it is used.<br>
<br>
Added:<br>
    llvm/trunk/test/Transforms/LoopUnroll/unroll-pragmas-disabled.ll<br>
Modified:<br>
    llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp<br>
    llvm/trunk/test/Transforms/LoopUnroll/unroll-pragmas.ll<br>
<br>
Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp?rev=213412&r1=213411&r2=213412&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp?rev=213412&r1=213411&r2=213412&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp Fri Jul 18 16:04:33 2014<br>
@@ -274,6 +274,42 @@ static unsigned UnrollCountPragmaValue(c<br>
   return 0;<br>
 }<br>
<br>
+// Remove existing unroll metadata and add unroll disable metadata to<br>
+// indicate the loop has already been unrolled.  This prevents a loop<br>
+// from being unrolled more than is directed by a pragma if the loop<br>
+// unrolling pass is run more than once (which it generally is).<br>
+static void SetLoopAlreadyUnrolled(Loop *L) {<br>
+  MDNode *LoopID = L->getLoopID();<br>
+  if (!LoopID) return;<br>
+<br>
+  // First remove any existing loop unrolling metadata.<br>
+  SmallVector<Value *, 4> Vals;<br>
+  // Reserve first location for self reference to the LoopID metadata node.<br>
+  Vals.push_back(nullptr);<br>
+  for (unsigned i = 1, ie = LoopID->getNumOperands(); i < ie; ++i) {<br>
+    bool IsUnrollMetadata = false;<br>
+    MDNode *MD = dyn_cast<MDNode>(LoopID->getOperand(i));<br>
+    if (MD) {<br>
+      const MDString *S = dyn_cast<MDString>(MD->getOperand(0));<br>
+      IsUnrollMetadata = S && S->getString().startswith("llvm.loop.unroll.");<br>
+    }<br>
+    if (!IsUnrollMetadata) Vals.push_back(LoopID->getOperand(i));<br>
+  }<br>
+<br>
+  // Add unroll(disable) metadata to disable future unrolling.<br>
+  LLVMContext &Context = L->getHeader()->getContext();<br>
+  MDNode *DisableNode =<br>
+      MDNode::get(Context, {MDString::get(Context, "llvm.loop.unroll.enable"),<br>
+                            ConstantInt::get(Type::getInt1Ty(Context), 0)});<br>
+  Vals.push_back(DisableNode);<br>
+<br>
+  MDNode *NewLoopID = MDNode::get(Context, Vals);<br>
+  // Set operand 0 to refer to the loop id itself.<br>
+  NewLoopID->replaceOperandWith(0, NewLoopID);<br>
+  L->setLoopID(NewLoopID);<br>
+  LoopID->replaceAllUsesWith(NewLoopID);<br>
+}<br>
+<br>
 unsigned LoopUnroll::selectUnrollCount(<br>
     const Loop *L, unsigned TripCount, bool HasEnablePragma,<br>
     unsigned PragmaCount, const TargetTransformInfo::UnrollingPreferences &UP,<br>
@@ -428,6 +464,10 @@ bool LoopUnroll::runOnLoop(Loop *L, LPPa<br>
   }<br>
<br>
   if (HasPragma) {<br>
+    // Mark loop as unrolled to prevent unrolling beyond that<br>
+    // requested by the pragma.<br>
+    SetLoopAlreadyUnrolled(L);<br>
+<br>
     // Emit optimization remarks if we are unable to unroll the loop<br>
     // as directed by a pragma.<br>
     DebugLoc LoopLoc = L->getStartLoc();<br>
<br>
Added: llvm/trunk/test/Transforms/LoopUnroll/unroll-pragmas-disabled.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopUnroll/unroll-pragmas-disabled.ll?rev=213412&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopUnroll/unroll-pragmas-disabled.ll?rev=213412&view=auto</a><br>


==============================================================================<br>
--- llvm/trunk/test/Transforms/LoopUnroll/unroll-pragmas-disabled.ll (added)<br>
+++ llvm/trunk/test/Transforms/LoopUnroll/unroll-pragmas-disabled.ll Fri Jul 18 16:04:33 2014<br>
@@ -0,0 +1,69 @@<br>
+; RUN: opt < %s -loop-unroll -S | FileCheck %s<br>
+;<br>
+; Verify that the unrolling pass removes existing loop unrolling metadata<br>
+; and adds a disable unrolling node after unrolling is complete.<br>
+<br>
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
+target triple = "x86_64-unknown-linux-gnu"<br>
+<br>
+; #pragma clang loop  vectorize(enable) unroll(enable) unroll_count(4) vectorize_width(8)<br>
+;<br>
+; Unroll metadata should be replaces with unroll(disable).  Vectorize<br>
+; metadata should be untouched.<br>
+;<br>
+; CHECK-LABEL: @loop1(<br>
+; CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_1:.*]]<br>
+define void @loop1(i32* nocapture %a) {<br>
+entry:<br>
+  br label %for.body<br>
+<br>
+for.body:                                         ; preds = %for.body, %entry<br>
+  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]<br>
+  %arrayidx = getelementptr inbounds i32* %a, i64 %indvars.iv<br>
+  %0 = load i32* %arrayidx, align 4<br>
+  %inc = add nsw i32 %0, 1<br>
+  store i32 %inc, i32* %arrayidx, align 4<br>
+  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1<br>
+  %exitcond = icmp eq i64 %indvars.iv.next, 64<br>
+  br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !1<br>
+<br>
+for.end:                                          ; preds = %for.body<br>
+  ret void<br>
+}<br>
+!1 = metadata !{metadata !1, metadata !2, metadata !3, metadata !4, metadata !5}<br>
+!2 = metadata !{metadata !"llvm.loop.vectorize.enable", i1 true}<br>
+!3 = metadata !{metadata !"llvm.loop.unroll.enable", i1 true}<br>
+!4 = metadata !{metadata !"llvm.loop.unroll.count", i32 4}<br>
+!5 = metadata !{metadata !"llvm.loop.vectorize.width", i32 8}<br>
+<br>
+; #pragma clang loop unroll(disable)<br>
+;<br>
+; Unroll metadata should not change.<br>
+;<br>
+; CHECK-LABEL: @loop2(<br>
+; CHECK: br i1 {{.*}}, label {{.*}}, label {{.*}}, !llvm.loop ![[LOOP_2:.*]]<br>
+define void @loop2(i32* nocapture %a) {<br>
+entry:<br>
+  br label %for.body<br>
+<br>
+for.body:                                         ; preds = %for.body, %entry<br>
+  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]<br>
+  %arrayidx = getelementptr inbounds i32* %a, i64 %indvars.iv<br>
+  %0 = load i32* %arrayidx, align 4<br>
+  %inc = add nsw i32 %0, 1<br>
+  store i32 %inc, i32* %arrayidx, align 4<br>
+  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1<br>
+  %exitcond = icmp eq i64 %indvars.iv.next, 64<br>
+  br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !6<br>
+<br>
+for.end:                                          ; preds = %for.body<br>
+  ret void<br>
+}<br>
+!6 = metadata !{metadata !6, metadata !7}<br>
+!7 = metadata !{metadata !"llvm.loop.unroll.enable", i1 false}<br>
+<br>
+; CHECK: ![[LOOP_1]] = metadata !{metadata ![[LOOP_1]], metadata ![[VEC_ENABLE:.*]], metadata ![[WIDTH_8:.*]], metadata ![[UNROLL_DISABLE:.*]]}<br>
+; CHECK: ![[VEC_ENABLE]] = metadata !{metadata !"llvm.loop.vectorize.enable", i1 true}<br>
+; CHECK: ![[WIDTH_8]] = metadata !{metadata !"llvm.loop.vectorize.width", i32 8}<br>
+; CHECK: ![[UNROLL_DISABLE]] = metadata !{metadata !"llvm.loop.unroll.enable", i1 false}<br>
+; CHECK: ![[LOOP_2]] = metadata !{metadata ![[LOOP_2]], metadata ![[UNROLL_DISABLE:.*]]}<br>
<br>
Modified: llvm/trunk/test/Transforms/LoopUnroll/unroll-pragmas.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopUnroll/unroll-pragmas.ll?rev=213412&r1=213411&r2=213412&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopUnroll/unroll-pragmas.ll?rev=213412&r1=213411&r2=213412&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/test/Transforms/LoopUnroll/unroll-pragmas.ll (original)<br>
+++ llvm/trunk/test/Transforms/LoopUnroll/unroll-pragmas.ll Fri Jul 18 16:04:33 2014<br>
@@ -1,4 +1,8 @@<br>
 ; RUN: opt < %s -loop-unroll -S | FileCheck %s<br>
+; RUN: opt < %s -loop-unroll -loop-unroll -S | FileCheck %s<br>
+;<br>
+; Run loop unrolling twice to verify that loop unrolling metadata is properly<br>
+; removed and further unrolling is disabled after the pass is run once.<br>
<br>
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
 target triple = "x86_64-unknown-linux-gnu"<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">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></div>
</div></div></blockquote></div><br></div>