<div dir="ltr">On 22 August 2013 13:24, Redmond, Paul <span dir="ltr"><<a href="mailto:paul.redmond@intel.com" target="_blank">paul.redmond@intel.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
I'm trying to get the following loop to vectorize (simple reduction):<br>
<br>
unsigned int sum2(unsigned int *a, int len){<br>
  unsigned int s = 0;<br>
  for (int i = 0; i < len; i += 4)<br>
    s += *a++;<br>
  return s;<br>
}<br>
<br>
<br>
The loop fails to vectorize because SCEV could not compute the loop exit<br>
count. It appears SCEV cannot handle the non-unit increment of the loop<br>
counter. Is this a known limitation of SCEV or is there something that can<br>
be improved (and if so where should I start looking?)<br></blockquote><div><br></div><div>It's a known limitation, see ScalarEvolution.cpp:5568.</div><div><br></div><div>The fundamental problem is that len in your example could be (unsigned) -1, -2 or -3, in which case your loop is infinite.</div>

<div><br></div><div>Nick</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Here's the IR for the loop and the SCEV dump:<br>
<br>
for.body:                                         ; preds =<br>
%<a href="http://for.body.lr.ph" target="_blank">for.body.lr.ph</a>, %for.body<br>
  %i.07 = phi i32 [ 0, %<a href="http://for.body.lr.ph" target="_blank">for.body.lr.ph</a> ], [ %add1, %for.body ]<br>
  %s.06 = phi i32 [ 0, %<a href="http://for.body.lr.ph" target="_blank">for.body.lr.ph</a> ], [ %add, %for.body ]<br>
  %a.addr.05 = phi i32* [ %a, %<a href="http://for.body.lr.ph" target="_blank">for.body.lr.ph</a> ], [ %incdec.ptr, %for.body ]<br>
  %incdec.ptr = getelementptr inbounds i32* %a.addr.05, i64 1<br>
  %0 = load i32* %a.addr.05, align 4, !tbaa !0<br>
  %add = add i32 %0, %s.06<br>
  %add1 = add nsw i32 %i.07, 4<br>
  %cmp = icmp slt i32 %add1, %len<br>
  br i1 %cmp, label %for.body, label %for.cond.for.end_crit_edge<br>
<br>
<br>
Classifying expressions for: @_Z4sum2Pji<br>
%i.07 = phi i32 [ 0, %<a href="http://for.body.lr.ph" target="_blank">for.body.lr.ph</a> ], [ %add1, %for.body ]<br>
--> {0,+,4}<nuw><nsw><%for.body>         Exits: <<Unknown>><br>
%s.06 = phi i32 [ 0, %<a href="http://for.body.lr.ph" target="_blank">for.body.lr.ph</a> ], [ %add, %for.body ]<br>
--> %s.06        Exits: <<Unknown>><br>
%a.addr.05 = phi i32* [ %a, %<a href="http://for.body.lr.ph" target="_blank">for.body.lr.ph</a> ], [ %incdec.ptr, %for.body ]<br>
--> {%a,+,4}<nw><%for.body>      Exits: <<Unknown>><br>
%incdec.ptr = getelementptr inbounds i32* %a.addr.05, i64 1<br>
--> {(4 + %a),+,4}<nw><%for.body>        Exits: <<Unknown>><br>
%0 = load i32* %a.addr.05, align 4, !tbaa !0<br>
--> %0   Exits: <<Unknown>><br>
%add = add i32 %0, %s.06<br>
--> (%0 + %s.06)         Exits: <<Unknown>><br>
%add1 = add nsw i32 %i.07, 4<br>
--> {4,+,4}<nuw><nsw><%for.body>         Exits: <<Unknown>><br>
%add.lcssa = phi i32 [ %add, %for.body ]<br>
--> %add.lcssa<br>
%s.0.lcssa = phi i32 [ %add.lcssa, %for.cond.for.end_crit_edge ], [ 0,<br>
%entry ]<br>
--> %s.0.lcssa<br>
Determining loop execution counts for: @_Z4sum2Pji<br>
Loop %for.body: Unpredictable backedge-taken count.<br>
Loop %for.body: Unpredictable max backedge-taken count.<br>
<br>
<br>
<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</blockquote></div></div></div>