diff options
author | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2007-01-13 19:12:39 +0000 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2007-01-13 19:12:39 +0000 |
commit | 2a134b7364cc5b6ed52edd00702240052aa8103c (patch) | |
tree | 8446575dc0c1e9a3e001053e272f3a83237449b0 /gcc | |
parent | 8f0d85d6e81d481c61a70ec77d7f14c77c9d5921 (diff) | |
download | gcc-2a134b7364cc5b6ed52edd00702240052aa8103c.zip gcc-2a134b7364cc5b6ed52edd00702240052aa8103c.tar.gz gcc-2a134b7364cc5b6ed52edd00702240052aa8103c.tar.bz2 |
ipa-reference.c (analyze_function): Consider also addresses taken in phi nodes.
* ipa-reference.c (analyze_function): Consider also addresses taken
in phi nodes.
* gcc.dg/20070112-1.c: New test.
From-SVN: r120757
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ipa-reference.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/20070112-1.c | 24 |
4 files changed, 49 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fcaf921..e18dfd6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2007-01-13 Zdenek Dvorak <dvorakz@suse.cz> + + * ipa-reference.c (analyze_function): Consider also addresses taken + in phi nodes. + 2007-01-12 Roger Sayle <roger@eyesopen.com> * c-typeck.c (null_pointer_constant_p): Replace use of diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c index 8602afd..b1ff849 100644 --- a/gcc/ipa-reference.c +++ b/gcc/ipa-reference.c @@ -807,6 +807,21 @@ analyze_function (struct cgraph_node *fn) FOR_EACH_BB_FN (this_block, this_cfun) { block_stmt_iterator bsi; + tree phi, op; + use_operand_p use; + ssa_op_iter iter; + + /* Find the addresses taken in phi node arguments. */ + for (phi = phi_nodes (this_block); phi; phi = PHI_CHAIN (phi)) + { + FOR_EACH_PHI_ARG (use, phi, iter, SSA_OP_USE) + { + op = USE_FROM_PTR (use); + if (TREE_CODE (op) == ADDR_EXPR) + check_rhs_var (l, op); + } + } + for (bsi = bsi_start (this_block); !bsi_end_p (bsi); bsi_next (&bsi)) walk_tree (bsi_stmt_ptr (bsi), scan_for_static_refs, fn, visited_nodes); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 41ebdf2..7c3b769 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-01-13 Zdenek Dvorak <dvorakz@suse.cz> + + * gcc.dg/20070112-1.c: New test. + 2007-01-12 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR libgfortran/30435 @@ -5,7 +9,7 @@ 2007-01-12 Olga Golovanevsky <olga@il.ibm.com> - * gcc.dg/torture/pr24750-1.c: Add prototype of free. + * gcc.dg/torture/pr24750-1.c: Add prototype of free. 2007-01-12 Tom Tromey <tromey@redhat.com> diff --git a/gcc/testsuite/gcc.dg/20070112-1.c b/gcc/testsuite/gcc.dg/20070112-1.c new file mode 100644 index 0000000..bd78335 --- /dev/null +++ b/gcc/testsuite/gcc.dg/20070112-1.c @@ -0,0 +1,24 @@ +/* We used to ICE on this testcase: the address of bad_spill_regs is + only taken in a phi node, which we missed and cleared its TREE_ADDRESSABLE + flag. This gets revealed when the loop is completely unrolled, thus + exposing the addresses as ordinary statements. */ + +/* { dg-do compile } */ +/* { dg-options "-O1" } */ + + +typedef unsigned HARD_REG_SET[2]; +static HARD_REG_SET bad_spill_regs; + +void +order_regs_for_reload () +{ + register int i; + + register unsigned *scan_tp_ = bad_spill_regs; + + for (i = 0; i < 2; i++) + *scan_tp_++ = 0; + + bad_spill_regs[0] |= 1; +} |