When compiling the bug.c code below with -O2, the floating point argument to the fprintf does not get reloaded for the second fprintf() call, so the second call prints junk. At -O1 the arguments (r23/r24) are properly reloaded. Release: 3.3 20030309 (Debian prerelease) (Debian testing/unstable) [and others] Environment: System: Linux gsyprf11.external.hp.com 2.4.20-pa18-UP #1 Sat Jan 4 22:06:52 PST 2 003 parisc64 unknown unknown GNU/Linux Architecture: parisc64 <machine, os, target, libraries (multiple lines)> host: hppa-unknown-linux-gnu build: hppa-unknown-linux-gnu target: hppa-unknown-linux-gnu configured with: ../src/configure -v --enable-languages=c,c++,f77,objc,ada,treela ng --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-gxx-inc lude-dir=/usr/include/c++/3.3 --enable-shared --with-system-zlib --enable-nls --w ithout-included-gettext --enable-__cxa_atexit --enable-sjlj-exceptions --enable-c locale=gnu --enable-debug --enable-objc-gc hppa-linux How-To-Repeat: Compile with gcc -O2 -o bug bug.c -lm $ ./bug nan 1.422968e-309 With -O1 $ ./bug nan nan ------8< bug.c 8<-------- #include <stdio.h> #include <math.h> void doprint(double dval) { fprintf(stdout, "%e\n", dval); fprintf(stdout, "%e\n", dval); } int main(int argc, char **argv) { doprint(log(-8)); /* nan */ return 0; }
Responsible-Changed-From-To: unassigned->danglin Responsible-Changed-Why: Assignment.
State-Changed-From-To: open->analyzed State-Changed-Why: Confirmed. There is a problem with the usage notes for argument registers in sibling calls when an argument needs to be passed in both general and floating point registers. The usage notes appear correct in the initial rtl but the note for the general general register for the third argument of the fprintf call is being dropped. This causes the insns which load these argument registers to be deleted. Correct code is generated if the -fno-optimize-sibling-calls option is specified. The first fprintf call behaves correctly because it isn't a sibling call. More analysis is needed to determine why usage notes are being dropped in sibling calls. This is a regression as sibcalls were first enabled on this port in 3.1 branch.
State-Changed-From-To: analyzed->closed State-Changed-Why: Fixed. <http://gcc.gnu.org/ml/gcc-patches/2003-04/msg01236.html>.