[Bug c/52920] New: function call optimized away with ftree-loop-distribute-patterns
garfieldsk at gmail dot com
gcc-bugzilla@gcc.gnu.org
Tue Apr 10 00:31:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52920
Bug #: 52920
Summary: function call optimized away with
ftree-loop-distribute-patterns
Classification: Unclassified
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: garfieldsk@gmail.com
Created attachment 27121
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=27121
Archive of source code (temp.c), assembly (temp.s and temp2.s), preprocessed
source (temp.e), and verbose compilation logs (in case they are of use).
I've set this to critical, but I certainly acknowledge the possibility that the
fault lies somewhere on my end (so I apologize in advance if this isn't an
issue when you try to reproduce it). I searched for this issue to see if
someone else had already seen similar, but didn't find it, and, if it is a real
issue, it seems like it could be important to pass on.
I've attached a simple (16 line) test example with a loop containing a printf
(the one that prints "Hi\n") that is optimized away in the presence of the
-ftree-loop-distribute-patterns flag in GCC 4.7.0 (I've tried this on Linux,
specifically CentOS 5.6 x86_64 and Ubuntu 10.10 x86). I compiled the attached
code using the following:
gcc -O1 -ftree-loop-distribute-patterns temp.c
What I see when executable is run:
0
What I believe I should see when executable is run:
Hi
Hi
Hi
0
If the upper bound on the loop is changed to 1 (and 2 on the 32-bit Ubuntu
system), this code will work as expected, but as 3 or more (at least for the
few examples I tried), the printf is optimized away. Looking at the attached
assembly (generated from the 64-bit CentOS system) for when the loop bound is 1
and when it is 2, you can see the printf call and even the string are not
present. However, the zeros are written correctly (as evidenced by the last
printf and confirmed in the assembly). I originally noticed this when calling
a custom malloc function, so I don't believe the behavior to be specific to
printf/IO functions.
This problem also occurred for me with -O3 and I was able to whittle it down to
the -O1 -ftree-loop-distribute-patterns, but I couldn't do the same for -O1
(namely, without -O1, even when including all flags enabled in gcc -Q
--help=optimizers, the problem doesn't show up). Also, the previous compiler I
had was GCC 4.5.3, which doesn't have the -ftree-loop-distribute-patterns, and
this issue doesn't occur, even when compiling with -O3.
I tried removing the "A[i] = 0" or "B[i] = 0" lines...removing either one makes
the loop work as expected (no issue). Similarly, removing the "int * test = A"
lines (and printing the value using A[0] instead of *test) works fine (no
issue). However, just changing the "*test" to "A[0]" doesn't fix the issue.
I also attached the pre-processed source as well as the output of compiling
with -v in case these are of interest.
More information about the Gcc-bugs
mailing list