[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