aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorZdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>2004-09-15 09:51:33 +0200
committerZdenek Dvorak <rakdver@gcc.gnu.org>2004-09-15 07:51:33 +0000
commitb1d16eff57d17fbab7430d7098ed6ea6144d45f7 (patch)
tree9992178e81375d3aa9e5e65505d8ba88f36e9832 /gcc
parent3657919271af36945e7939b0fc8a5699960f215d (diff)
downloadgcc-b1d16eff57d17fbab7430d7098ed6ea6144d45f7.zip
gcc-b1d16eff57d17fbab7430d7098ed6ea6144d45f7.tar.gz
gcc-b1d16eff57d17fbab7430d7098ed6ea6144d45f7.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/tree-ssa.c59
-rw-r--r--gcc/tree-tailcall.c4
3 files changed, 62 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 113cda7..5432bd5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+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>
* config/mips/mips.h (POINTERS_EXTEND_UNSIGNED): Delete.
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index c1efa1a..8e09755 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -207,11 +207,15 @@ err:
arguments).
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
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;
@@ -232,6 +236,13 @@ verify_use (basic_block bb, basic_block def_bb, tree ssa_name,
def_bb->index, bb->index);
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
&& !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
@@ -281,7 +292,8 @@ verify_phi_args (tree phi, basic_block bb, basic_block *definition_block)
if (TREE_CODE (op) == SSA_NAME)
err = verify_use (e->src, definition_block[SSA_NAME_VERSION (op)], op,
phi, e->flags & EDGE_ABNORMAL,
- !is_gimple_reg (PHI_RESULT (phi)));
+ !is_gimple_reg (PHI_RESULT (phi)),
+ NULL);
if (e->dest != bb)
{
@@ -506,6 +518,7 @@ verify_ssa (void)
ssa_op_iter iter;
tree op;
enum dom_state orig_dom_state = dom_computed[CDI_DOMINATORS];
+ bitmap names_defined_in_bb = BITMAP_XMALLOC ();
timevar_push (TV_TREE_SSA_VERIFY);
@@ -578,8 +591,12 @@ verify_ssa (void)
/* Verify the arguments for every PHI node in the block. */
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. */
for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
@@ -589,17 +606,44 @@ verify_ssa (void)
FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_VIRTUAL_USES)
{
if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
- op, stmt, false, true))
+ op, stmt, false, true,
+ names_defined_in_bb))
goto err;
}
FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
{
if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
- op, stmt, false, false))
+ op, stmt, false, false,
+ names_defined_in_bb))
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. */
@@ -613,6 +657,7 @@ verify_ssa (void)
else
dom_computed[CDI_DOMINATORS] = orig_dom_state;
+ BITMAP_XFREE (names_defined_in_bb);
timevar_pop (TV_TREE_SSA_VERIFY);
return;
diff --git a/gcc/tree-tailcall.c b/gcc/tree-tailcall.c
index d6cfe4c..cfe9dfa 100644
--- a/gcc/tree-tailcall.c
+++ b/gcc/tree-tailcall.c
@@ -624,7 +624,7 @@ adjust_return_value (basic_block bb, tree m, tree a)
var = make_ssa_name (tmp, stmt);
TREE_OPERAND (stmt, 0) = var;
- bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
+ bsi_insert_before (&bsi, stmt, BSI_SAME_STMT);
}
else
var = ret_var;
@@ -639,7 +639,7 @@ adjust_return_value (basic_block bb, tree m, tree a)
var = make_ssa_name (tmp, stmt);
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;