optimization/7189: gcc -O2 -Wall does not print ``control reaches end of non-void function'' warning
Steven Bosscher
s.bosscher@student.tudelft.nl
Thu Feb 13 21:03:00 GMT 2003
http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7189
This is a bug that happens when sibcall optimizations are performed. It
does not matter what other optimizations are enabled. When you do
gcc -O0 -Wall -foptimize-sibling-calls, the warning about the non-void
function not returning anything doesn't show up. The test case in the
PR is:
extern void foo(void);
int bar(void) { foo(); }
Without sibcall optimization, the warning is issued. The warning always
shows up with gcc 2.95.3, so technically one could argue it's a
regression...
The problem seems to be that after the sibcall optimizations, the cfg
cleanup after jump optimizations also cleans up the clobber INSN for the
function result (output for -c -Wall -foptimize-sibling-calls, todays
mainline CVS):
--- c7189.c.01.sibling Thu Feb 13 16:52:05 2003
+++ c7189.c.03.jump Thu Feb 13 16:52:05 2003
@@ -1,14 +1,29 @@
--- pass specific dump info cut out ---
@@ -27,19 +42,4 @@
(barrier 11 10 14)
-(note 14 11 23 NOTE_INSN_FUNCTION_END)
-
-(note 23 14 18 1 [bb 1] NOTE_INSN_BASIC_BLOCK)
-
-(insn 18 23 19 1 (nil) (clobber (reg/i:SI 0 eax)) -1 (nil)
- (nil))
-
-(insn 19 18 17 1 (nil) (clobber (reg:SI 58 [ <result> ])) -1 (nil)
- (nil))
-
-(insn 17 19 20 1 (nil) (set (reg/i:SI 0 eax)
- (reg:SI 58 [ <result> ])) -1 (nil)
- (nil))
-
-(insn 20 17 0 1 (nil) (use (reg/i:SI 0 eax)) -1 (nil)
- (nil))
+(note 14 11 0 NOTE_INSN_FUNCTION_END)
One way to "fix" this bug is to move check_function_return_warnings() up
to before sibling call optimization in toplev.c, but maybe there's a
more correct fix?
Greetz
Steven
More information about the Gcc-bugs
mailing list