[Bug tree-optimization/42878] "-fcompare-debug failure" at -O1 (2)
rguenth at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Wed Jan 27 11:26:00 GMT 2010
------- Comment #4 from rguenth at gcc dot gnu dot org 2010-01-27 11:26 -------
But the root cause is SSA names get out-of sync already during early inlining
via .MEMs. Which is because with debug isns we retain j_11 = 0 in
<bb 5>:
# VUSE <.MEM_12>
D.xxxx_10 = s_9->i;
# .MEM_14 = VDEF <.MEM_12>
e2 (D.xxxx_10);
# DEBUG i => i_1(D)
j_11 = 0;
# DEBUG j => j_11
# .MEM_15 = VDEF <.MEM_14>
e2 (i_1(D));
# DEBUG j => NULL
return;
while without it's gone.
<bb 5>:
# VUSE <.MEM_11>
D.xxxx_10 = s_9->i;
# .MEM_13 = VDEF <.MEM_11>
e2 (D.xxxx_10);
# .MEM_14 = VDEF <.MEM_13>
e2 (i_1(D));
return;
This is because
/* By inlining function having uninitialized variable, we might
extend the lifetime (variable might get reused). This cause
ICE in the case we end up extending lifetime of SSA name across
abnormal edge, but also increase register pressure.
We simply initialize all uninitialized vars by 0 except
for case we are inlining to very first BB. We can avoid
this for all BBs that are not inside strongly connected
regions of the CFG, but this is expensive to test. */
if (id->entry_bb
&& is_gimple_reg (SSA_NAME_VAR (name))
&& TREE_CODE (SSA_NAME_VAR (name)) != PARM_DECL
&& (id->entry_bb != EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest
|| EDGE_COUNT (id->entry_bb->preds) != 1))
{
gimple_stmt_iterator gsi = gsi_last_bb (id->entry_bb);
gimple init_stmt;
init_stmt = gimple_build_assign (new_tree,
fold_convert (TREE_TYPE
(new_tree),
integer_zero_node));
inserts this assignment also if there are only debug-uses. We come along
here from re-mapping the default-defs of decls.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42878
More information about the Gcc-bugs
mailing list