https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89905
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |wrong-debug
Status|UNCONFIRMED |NEW
Last reconfirmed| |2019-04-03
Blocks| |82738
Depends on| |89892
Ever confirmed|0 |1
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed, same issue as PR89892. DCE removes the last real stmt in a BB
which then is removed as a forwarder by CFG cleanup but that has to drop
debug stmts on the floor because there's no place for it to safely insert
them.
Applying the following
Index: gcc/tree-cfgcleanup.c
===================================================================
--- gcc/tree-cfgcleanup.c (revision 270114)
+++ gcc/tree-cfgcleanup.c (working copy)
@@ -565,14 +565,24 @@ remove_forwarder_block (basic_block bb)
}
/* Move debug statements if the destination has a single predecessor. */
- if (can_move_debug_stmts && !gsi_end_p (gsi))
+ if (!gsi_end_p (gsi))
{
+ bool informed = false;
gsi_to = gsi_after_labels (dest);
do
{
gimple *debug = gsi_stmt (gsi);
gcc_assert (is_gimple_debug (debug));
- gsi_move_before (&gsi, &gsi_to);
+ if (can_move_debug_stmts)
+ gsi_move_before (&gsi, &gsi_to);
+ else
+ {
+ if (!informed)
+ inform (gimple_location (debug),
+ "dropping (multiple) debug stmt");
+ informed = true;
+ gsi_next (&gsi);
+ }
}
while (!gsi_end_p (gsi));
}
shows this happens quite a lot :/
> ./xgcc -B. t.c -Og -g -fdump-tree-all -w
t.c: In function āiā:
t.c:13:7: note: dropping (multiple) debug stmt
13 | for (; d >= 33;) {
| ^~~
t.c:18:7: note: dropping (multiple) debug stmt
18 | j = b() || m[2];
| ~~^~~~~~~~~~~~~
t.c:17:5: note: dropping (multiple) debug stmt
17 | i++;
| ^
Doing the suggested resetting "fixes" the issue (gdb prints <optimized out>).
Index: gcc/tree-cfgcleanup.c
===================================================================
--- gcc/tree-cfgcleanup.c (revision 270114)
+++ gcc/tree-cfgcleanup.c (working copy)
@@ -564,8 +564,9 @@ remove_forwarder_block (basic_block bb)
gsi_next (&gsi);
}
- /* Move debug statements if the destination has a single predecessor. */
- if (can_move_debug_stmts && !gsi_end_p (gsi))
+ /* Move debug statements. Reset them if the destination does not
+ have a single predecessor. */
+ if (!gsi_end_p (gsi))
{
gsi_to = gsi_after_labels (dest);
do
@@ -573,6 +574,9 @@ remove_forwarder_block (basic_block bb)
gimple *debug = gsi_stmt (gsi);
gcc_assert (is_gimple_debug (debug));
gsi_move_before (&gsi, &gsi_to);
+ if (!can_move_debug_stmts
+ && gimple_debug_bind_p (debug))
+ gimple_debug_bind_reset_value (debug);
}
while (!gsi_end_p (gsi));
}
Referenced Bugs:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82738
[Bug 82738] [meta-bug] issues with the -Og optimization level
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89892
[Bug 89892] gcc generates wrong debug information at -O2