Command line: g++ -O1 -fcompare-debug -funroll-loops -c testcase.cpp -fno-web helps even in the nonreduced testcase Tested revisions: r155777 - crash r155680 - crash r154830 - crash r153685 - crash Output: $ /mnt/svn/gcc-trunk/binary-155777-lto/bin/g++ -O1 -fcompare-debug -funroll-loops -c testcase.cpp g++: testcase.cpp: -fcompare-debug failure Valgrind: no errors reported
Created attachment 19534 [details] reduced testcase Command line: g++ -O1 -fcompare-debug -funroll-loops -c pr42685.cpp
Could be related to pr42642
Created attachment 19566 [details] different reduced testcase I don't know if it's the same problem, but fails with the same flags. $ gcc -O1 -fcompare-debug -funroll-loops -c pr42685-2.c gcc: pr42685-2.c: -fcompare-debug failure
This still fails, even with Alexandre's patch for bug 42631. With -fno-web the failure disappears. So this is probably another issue in the webizer. Investigating -> mine for now.
Register number differences appear - again - because a USE operand of a DEBUG_INSN ends up in a web of its own: --- R1web/pr42685-2.c.167r.web 2010-01-18 11:11:38.000000000 -0800 +++ R2web/pr42685-2.c.167r.web 2010-01-18 11:11:38.000000000 -0800 @@ -7,275 +7,323 @@ df_worklist_dataflow_doublequeue:n_basic_blocks 55 n_edges 83 count 108 ( 2) df_worklist_dataflow_doublequeue:n_basic_blocks 55 n_edges 83 count 109 ( 2) Web oldreg=386 newreg=401 -Updating insn 82 (386->401) -deferring rescan insn with uid = 82. -Web oldreg=371 newreg=402 -Updating insn 63 (371->402) -deferring rescan insn with uid = 63. -Web oldreg=375 newreg=403 -Updating insn 394 (375->403) -deferring rescan insn with uid = 394. +Updating insn 96 (386->401) +deferring rescan insn with uid = 96. +Web oldreg=375 newreg=402 +Updating insn 72 (375->402) +deferring rescan insn with uid = 72. +Web oldreg=371 newreg=403 +Updating insn 75 (371->403) +deferring rescan insn with uid = 75. +Updating insn 468 (375->402) +deferring rescan insn with uid = 468. ... @@ -413,12 +474,19 @@ (label_ref #) (pc)))# {*br_true} (expr_list:REG_BR_PROB (const_int 7100 [0x1bbc]) (nil)) - -> 65) + -> 77) (note# # # 10 [bb 10] NOTE_INSN_BASIC_BLOCK) +(debug_insn# # # 10 pr42685-2.c:19 (var_location:DI D#2 (zero_extend:DI (reg/v:SI 402 [ i ])))# (nil)) + +(debug_insn# # # 10 pr42685-2.c:19 (var_location:DI D#1 (mult:DI (debug_expr:DI D#2) + (const_int 4 [0x4])))# (nil)) + +(debug_insn# # # 10 pr42685-2.c:19 (var_location:DI s (clobber (const_int 0 [0x0])))# (nil)) + (insn# # # 10 pr42685-2.c:10 (set (reg:SI 120 out0) - (mem/s/j:SI (reg:DI 402 [ ivtmp.5 ]) [0 D.1998->i+0 S4 A32]))# {movsi_internal} (nil)) + (mem/s/j:SI (reg:DI 403 [ ivtmp.5 ]) [0 D.1998->i+0 S4 A32]))# {movsi_internal} (nil)) (call_insn# # # 10 pr42685-2.c:10 (parallel [ (call (mem:DI (symbol_ref:DI ("baz") [flags 0x41] <function_decl # baz>) [0 S8 A64]) This whole compare-debug stuff makes no sense to me, so I'm not even going to try to come up with a fix. IMHO the proper fix would be to never even try to rename a web that consists of just a single USE. I don't see how that is any more "right" than no debug info at all since no DEF reaches the USE (i.e. uninitialized) so any value represented in the debug info is fair and reasonable.
*** Bug 42642 has been marked as a duplicate of this bug. ***
I have an extremely lame patch that fixes both testcases. s/INSN_P/NONDEBUG_INSN_P/
Fixed.
Subject: Bug 42685 Author: rguenth Date: Tue Jan 26 16:27:34 2010 New Revision: 156252 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=156252 Log: 2010-01-26 Richard Guenther <rguenther@suse.de> PR rtl-optimization/42685 * web.c (web_main): Ignore DEBUG_INSNs. * gcc.dg/pr42685.c: New testcase. * g++.dg/other/pr42685.C: Likewise. Added: trunk/gcc/testsuite/g++.dg/other/pr42685.C trunk/gcc/testsuite/gcc.dg/pr42685.c Modified: trunk/gcc/ChangeLog trunk/gcc/testsuite/ChangeLog trunk/gcc/web.c