<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - -indvars regression after r346397"
   href="https://bugs.llvm.org/show_bug.cgi?id=39673">39673</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>-indvars regression after r346397
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>libraries
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>trunk
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Linux
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>enhancement
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>Scalar Optimizations
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>mikael.holmen@ericsson.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Created <span class=""><a href="attachment.cgi?id=21123" name="attach_21123" title="reproducer">attachment 21123</a> <a href="attachment.cgi?id=21123&action=edit" title="reproducer">[details]</a></span>
reproducer

The regression starts happening with r346397:

    Return "[IndVars] Smart hard uses detection"

    The patch has been reverted because it ended up prohibiting propagation
    of a constant to exit value. For such values, we should skip all checks
    related to hard uses because propagating a constant is always profitable.

    Differential Revision: <a href="https://reviews.llvm.org/D53691">https://reviews.llvm.org/D53691</a>


    git-svn-id: <a href="https://llvm.org/svn/llvm-project/llvm/trunk@346397">https://llvm.org/svn/llvm-project/llvm/trunk@346397</a>
91177308-0d34-0410-b5e6-96231b3b80d8


If I run

  opt -S -o - foo2.ll -indvars

with the patch I get

define i16 @test10() {
entry:
   br label %loop1

loop1:                                            ; preds = %loop1, %entry
   %l1 = phi i16 [ 0, %entry ], [ %l1.add, %loop1 ]
   %l1.add = add nuw nsw i16 %l1, 1
   %cmp1 = icmp ult i16 %l1.add, 2
   br i1 %cmp1, label %loop1, label %loop2.preheader

loop2.preheader:                                  ; preds = %loop1
   br label %loop2

loop2:                                            ; preds = %loop2, 
%loop2.preheader
   %k2 = phi i16 [ %k2.add, %loop2 ], [ 182, %loop2.preheader ]
   %l2 = phi i16 [ %l2.add, %loop2 ], [ 0, %loop2.preheader ]
   %l2.add = add nuw nsw i16 %l2, 1
   tail call void @foo(i16 %k2)
   %k2.add = add nuw nsw i16 %k2, 1
   %cmp2 = icmp ult i16 %l2.add, 2
   br i1 %cmp2, label %loop2, label %loop2.end

loop2.end:                                        ; preds = %loop2
   %k2.add.lcssa = phi i16 [ %k2.add, %loop2 ]
   ret i16 %k2.add.lcssa
}

and without it:

define i16 @test10() {
entry:
   br label %loop1

loop1:                                            ; preds = %loop1, %entry
   %l1 = phi i16 [ 0, %entry ], [ %l1.add, %loop1 ]
   %l1.add = add nuw nsw i16 %l1, 1
   %cmp1 = icmp ult i16 %l1.add, 2
   br i1 %cmp1, label %loop1, label %loop2.preheader

loop2.preheader:                                  ; preds = %loop1
   br label %loop2

loop2:                                            ; preds = %loop2, 
%loop2.preheader
   %k2 = phi i16 [ %k2.add, %loop2 ], [ 182, %loop2.preheader ]
   %l2 = phi i16 [ %l2.add, %loop2 ], [ 0, %loop2.preheader ]
   %l2.add = add nuw nsw i16 %l2, 1
   tail call void @foo(i16 %k2)
   %k2.add = add nuw nsw i16 %k2, 1
   %cmp2 = icmp ult i16 %l2.add, 2
   br i1 %cmp2, label %loop2, label %loop2.end

loop2.end:                                        ; preds = %loop2
   %0 = add i16 182, 2
   ret i16 %0
}

Note the difference in how the return value is calculated.

I suppose that indvars doesn't consider this to be the constant case that
should always be allowed, but I think it's quite unfortunate if this
simplification isn't done.</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>