Commit 412c4af7 by Jan Hubicka Committed by Jan Hubicka

re PR middle-end/63186 (Undefined .L* symbols because of fnsplit)


	PR tree-optimization/63186
	* ipa-split.c (test_nonssa_use): Skip nonforced labels.
	(mark_nonssa_use): Likewise.
	(verify_non_ssa_vars): Verify all header blocks for label
	definitions.

	* gcc.dg/pr63186.c: New testcase.

From-SVN: r215149
parent cf92ae7f
2014-09-10 Jan Hubicka <hubicka@ucw.cz>
PR tree-optimization/63186
* ipa-split.c (test_nonssa_use): Skip nonforced labels.
(mark_nonssa_use): Likewise.
(verify_non_ssa_vars): Verify all header blocks for label
definitions.
2014-09-11 Alexander Ivchenko <alexander.ivchenko@intel.com> 2014-09-11 Alexander Ivchenko <alexander.ivchenko@intel.com>
Maxim Kuznetsov <maxim.kuznetsov@intel.com> Maxim Kuznetsov <maxim.kuznetsov@intel.com>
Anna Tikhonova <anna.tikhonova@intel.com> Anna Tikhonova <anna.tikhonova@intel.com>
...@@ -167,7 +167,11 @@ test_nonssa_use (gimple, tree t, tree, void *data) ...@@ -167,7 +167,11 @@ test_nonssa_use (gimple, tree t, tree, void *data)
|| (TREE_CODE (t) == VAR_DECL || (TREE_CODE (t) == VAR_DECL
&& auto_var_in_fn_p (t, current_function_decl)) && auto_var_in_fn_p (t, current_function_decl))
|| TREE_CODE (t) == RESULT_DECL || TREE_CODE (t) == RESULT_DECL
|| TREE_CODE (t) == LABEL_DECL) /* Normal labels are part of CFG and will be handled gratefuly.
Forced labels however can be used directly by statements and
need to stay in one partition along with their uses. */
|| (TREE_CODE (t) == LABEL_DECL
&& FORCED_LABEL (t)))
return bitmap_bit_p ((bitmap)data, DECL_UID (t)); return bitmap_bit_p ((bitmap)data, DECL_UID (t));
/* For DECL_BY_REFERENCE, the return value is actually a pointer. We want /* For DECL_BY_REFERENCE, the return value is actually a pointer. We want
...@@ -213,6 +217,7 @@ verify_non_ssa_vars (struct split_point *current, bitmap non_ssa_vars, ...@@ -213,6 +217,7 @@ verify_non_ssa_vars (struct split_point *current, bitmap non_ssa_vars,
edge e; edge e;
edge_iterator ei; edge_iterator ei;
bool ok = true; bool ok = true;
basic_block bb;
FOR_EACH_EDGE (e, ei, current->entry_bb->preds) FOR_EACH_EDGE (e, ei, current->entry_bb->preds)
if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun) if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
...@@ -225,8 +230,8 @@ verify_non_ssa_vars (struct split_point *current, bitmap non_ssa_vars, ...@@ -225,8 +230,8 @@ verify_non_ssa_vars (struct split_point *current, bitmap non_ssa_vars,
while (!worklist.is_empty ()) while (!worklist.is_empty ())
{ {
gimple_stmt_iterator bsi; gimple_stmt_iterator bsi;
basic_block bb = worklist.pop ();
bb = worklist.pop ();
FOR_EACH_EDGE (e, ei, bb->preds) FOR_EACH_EDGE (e, ei, bb->preds)
if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun) if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
&& bitmap_set_bit (seen, e->src->index)) && bitmap_set_bit (seen, e->src->index))
...@@ -250,10 +255,10 @@ verify_non_ssa_vars (struct split_point *current, bitmap non_ssa_vars, ...@@ -250,10 +255,10 @@ verify_non_ssa_vars (struct split_point *current, bitmap non_ssa_vars,
if (gimple_code (stmt) == GIMPLE_LABEL if (gimple_code (stmt) == GIMPLE_LABEL
&& test_nonssa_use (stmt, gimple_label_label (stmt), && test_nonssa_use (stmt, gimple_label_label (stmt),
NULL_TREE, non_ssa_vars)) NULL_TREE, non_ssa_vars))
{ {
ok = false; ok = false;
goto done; goto done;
} }
} }
for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi)) for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
{ {
...@@ -286,6 +291,27 @@ verify_non_ssa_vars (struct split_point *current, bitmap non_ssa_vars, ...@@ -286,6 +291,27 @@ verify_non_ssa_vars (struct split_point *current, bitmap non_ssa_vars,
} }
} }
} }
/* Verify that the rest of function does not define any label
used by the split part. */
FOR_EACH_BB_FN (bb, cfun)
if (!bitmap_bit_p (current->split_bbs, bb->index)
&& !bitmap_bit_p (seen, bb->index))
{
gimple_stmt_iterator bsi;
for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
if (gimple_code (gsi_stmt (bsi)) == GIMPLE_LABEL
&& test_nonssa_use (gsi_stmt (bsi),
gimple_label_label (gsi_stmt (bsi)),
NULL_TREE, non_ssa_vars))
{
ok = false;
goto done;
}
else if (gimple_code (gsi_stmt (bsi)) != GIMPLE_LABEL)
break;
}
done: done:
BITMAP_FREE (seen); BITMAP_FREE (seen);
worklist.release (); worklist.release ();
...@@ -735,7 +761,8 @@ mark_nonssa_use (gimple, tree t, tree, void *data) ...@@ -735,7 +761,8 @@ mark_nonssa_use (gimple, tree t, tree, void *data)
if ((TREE_CODE (t) == VAR_DECL if ((TREE_CODE (t) == VAR_DECL
&& auto_var_in_fn_p (t, current_function_decl)) && auto_var_in_fn_p (t, current_function_decl))
|| TREE_CODE (t) == RESULT_DECL || TREE_CODE (t) == RESULT_DECL
|| TREE_CODE (t) == LABEL_DECL) || (TREE_CODE (t) == LABEL_DECL
&& FORCED_LABEL (t)))
bitmap_set_bit ((bitmap)data, DECL_UID (t)); bitmap_set_bit ((bitmap)data, DECL_UID (t));
/* For DECL_BY_REFERENCE, the return value is actually a pointer. We want /* For DECL_BY_REFERENCE, the return value is actually a pointer. We want
......
2014-09-10 Jan Hubicka <hubicka@ucw.cz>
PR tree-optimization/63186
* gcc.dg/pr63186.c: New testcase.
2014-09-10 Xinliang David Li <davidxl@google.com> 2014-09-10 Xinliang David Li <davidxl@google.com>
PR target/63209 PR target/63209
......
/* { dg-do link } */
/* { dg-options "-O2" } */
void *a;
int b, c, d;
void
bar ()
{
switch (c)
{
case 0:
lab:
__asm__ ("");
return;
default:
break;
}
b = 0;
d = 0;
a = &&lab;
}
void
foo ()
{
bar ();
}
main()
{
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment