http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54919
Bug #: 54919
Summary: [4.6/4.7/4.8 Regression] gcc.dg/torture/pr54877.c
FAILs with -fvariable-expansion-in-unroller
Classification: Unclassified
Product: gcc
Version: 4.8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
AssignedTo: [email protected]
ReportedBy: [email protected]
Created attachment 28439
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=28439
preprocessed source
Output:
$ gcc -O2 -ffast-math -funroll-loops -fvariable-expansion-in-unroller
testcase.c
$ ./a.out
Aborted
What happens is that foo() returns -63 instead of -64.
.L15:
movapd xmm0, xmm2 # d, tmp71
sub eax, 8 # D.1761,
subsd xmm0, xmm1 # d, tmp69
subsd xmm0, xmm1 # d, tmp69
subsd xmm0, xmm1 # d, tmp69
1==> movapd xmm2, xmm0 # tmp71, d
2==> subsd xmm2, xmm1 # tmp71, tmp69
jne .L15 #,
3==> addsd xmm0, xmm2 # d, tmp71
cvttsd2si edx, xmm0 # D.1762, d
In each loop, 4 is subtracted, and finally, the sum is multiplied by 2 at (3).
The problem is that when (3) is executed, xmm2==-32 and xmm0==-31 ; so the
final sum is -63.
If (1) and (2) are swapped (and (2) uses xmm0 instead of xmm2), the code works
fine:
.L15:
movapd xmm0, xmm2 # d, tmp71
sub eax, 8 # D.1761,
subsd xmm0, xmm1 # d, tmp69
subsd xmm0, xmm1 # d, tmp69
subsd xmm0, xmm1 # d, tmp69
2==> subsd xmm0, xmm1 # tmp71, tmp69
1==> movapd xmm2, xmm0 # tmp71, d
jne .L15 #,
3==> addsd xmm0, xmm2 # d, tmp71
cvttsd2si edx, xmm0 # D.1762, d
Note foo() is inlined into main(), so the change has to be done in main() (or
the noinline attribute has to be added).
Tested revisions:
r192420 - fail
4.7 r191640 - fail
4.6 r191640 - fail
4.5 r191640 - fail
4.4 r191640 - OK