[llvm-bugs] [Bug 39673] New: -indvars regression after r346397

via llvm-bugs llvm-bugs at lists.llvm.org
Thu Nov 15 01:23:18 PST 2018


https://bugs.llvm.org/show_bug.cgi?id=39673

            Bug ID: 39673
           Summary: -indvars regression after r346397
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Scalar Optimizations
          Assignee: unassignedbugs at nondot.org
          Reporter: mikael.holmen at ericsson.com
                CC: llvm-bugs at lists.llvm.org

Created attachment 21123
  --> https://bugs.llvm.org/attachment.cgi?id=21123&action=edit
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: https://reviews.llvm.org/D53691


    git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@346397
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.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20181115/7661ba51/attachment.html>


More information about the llvm-bugs mailing list