aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-mudflap.c
diff options
context:
space:
mode:
authorFrank Ch. Eigler <fche@redhat.com>2005-04-12 18:09:09 +0000
committerFrank Ch. Eigler <fche@gcc.gnu.org>2005-04-12 18:09:09 +0000
commita08a479fec88b963c28fc068d09f40298c5565b6 (patch)
treefa131f46b98ec3d1b41397fd52e1c6aceb8ed50a /gcc/tree-mudflap.c
parentb7d1c15e4efd1f63d19d23470b912b048cd9660b (diff)
downloadgcc-a08a479fec88b963c28fc068d09f40298c5565b6.zip
gcc-a08a479fec88b963c28fc068d09f40298c5565b6.tar.gz
gcc-a08a479fec88b963c28fc068d09f40298c5565b6.tar.bz2
re PR other/19266 ([mudflap] ICE when compiling with -fmudflap -O)
2005-04-12 Frank Ch. Eigler <fche@redhat.com> PR mudflap/19266 From Richard Henderson <rth@redhat.com>: * tree-mudflap.c (mf_build_check_statement_for): Correct block splitting logic. 2005-04-12 Frank Ch. Eigler <fche@redhat.com> PR mudflap/19266 * testsuite/libmudflap.c++/c++frags.exp: Also test -O permutation. * testsuite/libmudflap.c++/pass57-frag.cxx: New test. From-SVN: r98028
Diffstat (limited to 'gcc/tree-mudflap.c')
-rw-r--r--gcc/tree-mudflap.c33
1 files changed, 9 insertions, 24 deletions
diff --git a/gcc/tree-mudflap.c b/gcc/tree-mudflap.c
index c2e09ad..b1efae8 100644
--- a/gcc/tree-mudflap.c
+++ b/gcc/tree-mudflap.c
@@ -497,40 +497,25 @@ mf_build_check_statement_for (tree base, tree limit,
block_stmt_iterator bsi;
basic_block cond_bb, then_bb, join_bb;
edge e;
- tree cond, t, u, v, l1, l2;
+ tree cond, t, u, v;
tree mf_base;
tree mf_elem;
tree mf_limit;
/* We first need to split the current basic block, and start altering
the CFG. This allows us to insert the statements we're about to
- construct into the right basic blocks. The label l1 is the label
- of the block for the THEN clause of the conditional jump we're
- about to construct, and l2 is the ELSE clause, which is just the
- continuation of the old statement stream. */
- l1 = create_artificial_label ();
- l2 = create_artificial_label ();
+ construct into the right basic blocks. */
+
cond_bb = bb_for_stmt (bsi_stmt (*instr_bsi));
bsi = *instr_bsi;
bsi_prev (&bsi);
if (! bsi_end_p (bsi))
- {
- /* We're processing a statement in the middle of the block, so
- we need to split the block. This creates a new block and a new
- fallthrough edge. */
- e = split_block (cond_bb, bsi_stmt (bsi));
- cond_bb = e->src;
- join_bb = e->dest;
- }
+ e = split_block (cond_bb, bsi_stmt (bsi));
else
- {
- /* We're processing the first statement in the block, so we need
- to split the incoming edge. This also creates a new block
- and a new fallthrough edge. */
- join_bb = cond_bb;
- cond_bb = split_edge (find_edge (join_bb->prev_bb, join_bb));
- }
-
+ e = split_block_after_labels (cond_bb);
+ cond_bb = e->src;
+ join_bb = e->dest;
+
/* A recap at this point: join_bb is the basic block at whose head
is the gimple statement for which this check expression is being
built. cond_bb is the (possibly new, synthetic) basic block the
@@ -721,7 +706,7 @@ mf_decl_eligible_p (tree decl)
/* The decl must have its address taken. In the case of
arrays, this flag is also set if the indexes are not
compile-time known valid constants. */
- && TREE_ADDRESSABLE (decl)
+ && TREE_ADDRESSABLE (decl) /* XXX: not sufficient: return-by-value structs! */
/* The type of the variable must be complete. */
&& COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (decl))
/* The decl hasn't been decomposed somehow. */