Commit b1d16eff by Zdenek Dvorak Committed by Zdenek Dvorak

re PR tree-optimization/17468 (Java garbage collector miscompiled at -O1 and higher)

	PR tree-optimization/17468
	* tree-ssa.c (verify_use, verify_phi_args, verify_ssa):  Verify that
	definition inside a block precede uses.
	* tree-tailcall.c (adjust_return_value): Emit statements in the
	correct order.

From-SVN: r87538
parent 36579192
2004-09-15 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
PR tree-optimization/17468
* tree-ssa.c (verify_use, verify_phi_args, verify_ssa): Verify that
definition inside a block precede uses.
* tree-tailcall.c (adjust_return_value): Emit statements in the
correct order.
2004-09-15 Richard Sandiford <rsandifo@redhat.com> 2004-09-15 Richard Sandiford <rsandifo@redhat.com>
* config/mips/mips.h (POINTERS_EXTEND_UNSIGNED): Delete. * config/mips/mips.h (POINTERS_EXTEND_UNSIGNED): Delete.
......
...@@ -207,11 +207,15 @@ err: ...@@ -207,11 +207,15 @@ err:
arguments). arguments).
IS_VIRTUAL is true if SSA_NAME is created by a V_MAY_DEF or a IS_VIRTUAL is true if SSA_NAME is created by a V_MAY_DEF or a
V_MUST_DEF. */ V_MUST_DEF.
If NAMES_DEFINED_IN_BB is not NULL, it contains a bitmap of ssa names
that are defined before STMT in basic block BB. */
static bool static bool
verify_use (basic_block bb, basic_block def_bb, tree ssa_name, verify_use (basic_block bb, basic_block def_bb, tree ssa_name,
tree stmt, bool check_abnormal, bool is_virtual) tree stmt, bool check_abnormal, bool is_virtual,
bitmap names_defined_in_bb)
{ {
bool err = false; bool err = false;
...@@ -232,6 +236,13 @@ verify_use (basic_block bb, basic_block def_bb, tree ssa_name, ...@@ -232,6 +236,13 @@ verify_use (basic_block bb, basic_block def_bb, tree ssa_name,
def_bb->index, bb->index); def_bb->index, bb->index);
err = true; err = true;
} }
else if (bb == def_bb
&& names_defined_in_bb != NULL
&& !bitmap_bit_p (names_defined_in_bb, SSA_NAME_VERSION (ssa_name)))
{
error ("Definition in block %i follows the use", def_bb->index);
err = true;
}
if (check_abnormal if (check_abnormal
&& !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name)) && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
...@@ -281,7 +292,8 @@ verify_phi_args (tree phi, basic_block bb, basic_block *definition_block) ...@@ -281,7 +292,8 @@ verify_phi_args (tree phi, basic_block bb, basic_block *definition_block)
if (TREE_CODE (op) == SSA_NAME) if (TREE_CODE (op) == SSA_NAME)
err = verify_use (e->src, definition_block[SSA_NAME_VERSION (op)], op, err = verify_use (e->src, definition_block[SSA_NAME_VERSION (op)], op,
phi, e->flags & EDGE_ABNORMAL, phi, e->flags & EDGE_ABNORMAL,
!is_gimple_reg (PHI_RESULT (phi))); !is_gimple_reg (PHI_RESULT (phi)),
NULL);
if (e->dest != bb) if (e->dest != bb)
{ {
...@@ -506,6 +518,7 @@ verify_ssa (void) ...@@ -506,6 +518,7 @@ verify_ssa (void)
ssa_op_iter iter; ssa_op_iter iter;
tree op; tree op;
enum dom_state orig_dom_state = dom_computed[CDI_DOMINATORS]; enum dom_state orig_dom_state = dom_computed[CDI_DOMINATORS];
bitmap names_defined_in_bb = BITMAP_XMALLOC ();
timevar_push (TV_TREE_SSA_VERIFY); timevar_push (TV_TREE_SSA_VERIFY);
...@@ -578,8 +591,12 @@ verify_ssa (void) ...@@ -578,8 +591,12 @@ verify_ssa (void)
/* Verify the arguments for every PHI node in the block. */ /* Verify the arguments for every PHI node in the block. */
for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi)) for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
if (verify_phi_args (phi, bb, definition_block)) {
goto err; if (verify_phi_args (phi, bb, definition_block))
goto err;
bitmap_set_bit (names_defined_in_bb,
SSA_NAME_VERSION (PHI_RESULT (phi)));
}
/* Now verify all the uses and vuses in every statement of the block. */ /* Now verify all the uses and vuses in every statement of the block. */
for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi)) for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
...@@ -589,17 +606,44 @@ verify_ssa (void) ...@@ -589,17 +606,44 @@ verify_ssa (void)
FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_VIRTUAL_USES) FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_VIRTUAL_USES)
{ {
if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)], if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
op, stmt, false, true)) op, stmt, false, true,
names_defined_in_bb))
goto err; goto err;
} }
FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE) FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
{ {
if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)], if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
op, stmt, false, false)) op, stmt, false, false,
names_defined_in_bb))
goto err; goto err;
} }
FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
{
bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
}
} }
/* Verify the uses in arguments of PHI nodes at the exits from the
block. */
for (e = bb->succ; e; e = e->succ_next)
{
for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
{
bool virtual = !is_gimple_reg (PHI_RESULT (phi));
op = PHI_ARG_DEF_FROM_EDGE (phi, e);
if (TREE_CODE (op) != SSA_NAME)
continue;
if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
op, phi, false, virtual,
names_defined_in_bb))
goto err;
}
}
bitmap_clear (names_defined_in_bb);
} }
/* Finally, verify alias information. */ /* Finally, verify alias information. */
...@@ -613,6 +657,7 @@ verify_ssa (void) ...@@ -613,6 +657,7 @@ verify_ssa (void)
else else
dom_computed[CDI_DOMINATORS] = orig_dom_state; dom_computed[CDI_DOMINATORS] = orig_dom_state;
BITMAP_XFREE (names_defined_in_bb);
timevar_pop (TV_TREE_SSA_VERIFY); timevar_pop (TV_TREE_SSA_VERIFY);
return; return;
......
...@@ -624,7 +624,7 @@ adjust_return_value (basic_block bb, tree m, tree a) ...@@ -624,7 +624,7 @@ adjust_return_value (basic_block bb, tree m, tree a)
var = make_ssa_name (tmp, stmt); var = make_ssa_name (tmp, stmt);
TREE_OPERAND (stmt, 0) = var; TREE_OPERAND (stmt, 0) = var;
bsi_insert_before (&bsi, stmt, BSI_NEW_STMT); bsi_insert_before (&bsi, stmt, BSI_SAME_STMT);
} }
else else
var = ret_var; var = ret_var;
...@@ -639,7 +639,7 @@ adjust_return_value (basic_block bb, tree m, tree a) ...@@ -639,7 +639,7 @@ adjust_return_value (basic_block bb, tree m, tree a)
var = make_ssa_name (tmp, stmt); var = make_ssa_name (tmp, stmt);
TREE_OPERAND (stmt, 0) = var; TREE_OPERAND (stmt, 0) = var;
bsi_insert_before (&bsi, stmt, BSI_NEW_STMT); bsi_insert_before (&bsi, stmt, BSI_SAME_STMT);
} }
TREE_OPERAND (ret_stmt, 0) = var; TREE_OPERAND (ret_stmt, 0) = var;
......
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