diff options
author | Sebastian Pop <sebastian.pop@amd.com> | 2011-01-25 14:51:23 +0000 |
---|---|---|
committer | Sebastian Pop <spop@gcc.gnu.org> | 2011-01-25 14:51:23 +0000 |
commit | db963b528702d92bb843ff50f8d7a3d7fb34257d (patch) | |
tree | a0d39d42e2fe0300dd15f8f54888f83ac348c280 /gcc | |
parent | bcddd3b99ca8aecbe9fe7afbf53548f9adc1498c (diff) | |
download | gcc-db963b528702d92bb843ff50f8d7a3d7fb34257d.zip gcc-db963b528702d92bb843ff50f8d7a3d7fb34257d.tar.gz gcc-db963b528702d92bb843ff50f8d7a3d7fb34257d.tar.bz2 |
Fix PR47271: only if-convert full writes.
2011-01-25 Sebastian Pop <sebastian.pop@amd.com>
Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/47271
* tree-if-conv.c (bb_postdominates_preds): New.
(if_convertible_bb_p): Call bb_postdominates_preds.
(if_convertible_loop_p_1): Compute CDI_POST_DOMINATORS.
(predicate_scalar_phi): Call bb_postdominates_preds.
* gcc.dg/tree-ssa/ifc-pr47271.c: New.
Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
From-SVN: r169233
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ifc-pr47271.c | 49 | ||||
-rw-r--r-- | gcc/tree-if-conv.c | 23 |
4 files changed, 87 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 18f0f5f..ac51239 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2011-01-25 Sebastian Pop <sebastian.pop@amd.com> + Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/47271 + * tree-if-conv.c (bb_postdominates_preds): New. + (if_convertible_bb_p): Call bb_postdominates_preds. + (if_convertible_loop_p_1): Compute CDI_POST_DOMINATORS. + (predicate_scalar_phi): Call bb_postdominates_preds. + 2011-01-25 Nick Clifton <nickc@redhat.com> * config/rx/rx.h (LIBCALL_VALUE): Do not promote complex types. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index edce298..7b5efca 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-01-25 Sebastian Pop <sebastian.pop@amd.com> + Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/47271 + * gcc.dg/tree-ssa/ifc-pr47271.c: New. + 2011-01-25 Nick Clifton <nickc@redhat.com> * gcc.target/rx/builtins.c: Allow -fipa-cp-clone. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ifc-pr47271.c b/gcc/testsuite/gcc.dg/tree-ssa/ifc-pr47271.c new file mode 100644 index 0000000..bf36079 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ifc-pr47271.c @@ -0,0 +1,49 @@ +/* { dg-options "-O3" } */ +/* { dg-do run } */ + +extern void abort (void); + +void func (void) +{ + int i; + int nops; + char *codestr = + "|\000\000Ee\000\000Z\001\000d\000\000Z\002\000d\025\000Z\003\000" + "\t\t\t\t\t\t\t\t\t\t\t\td\026\000Z\004\000d\005\000\204\000\000Z" + "\005\000e\006\000e\a\000j\005\000e\b\000d\006\000\204\002\000\203" + "\001\000Z\t\000d\a\000\204\000\000Z\n\000d\b\000\204\000\000Z\v\000d" + "\t\000\204\000\000Z\f\000d\n\000\204\000\000Z\r\000e\016\000e\017\000d" + "\v\000\203\001\000d\f\000d\r\000\203\001\001Z\020\000e\016\000e\017" + "\000d\016\000\203\001\000d\f\000d\017\000\203\001\001Z\021\000e\016" + "\000e\017\000d\020\000\203\001\000d\f\000d\021\000\203\001\001Z\022" + "\000e\016\000e\017\000d\022\000\203\001\000d\f\000d\023\000\203\001" + "\001Z\023\000d\024\000S"; + int codelen = 209; + int addrmap[500]; + + for (i=0, nops=0 ; i<codelen ; i += ((codestr[i] >= 90) ? 3 : 1)) + { + addrmap[i] = i - nops; + if (codestr[i] == 9) + nops++; + } + + if (addrmap[0] != 0 + || addrmap[3] != 3 + || addrmap[4] != 4 + || addrmap[7] != 7 + || addrmap[10] != 10 + || addrmap[13] != 13 + || addrmap[16] != 16 + || addrmap[19] != 19 + || addrmap[22] != 22 + || addrmap[23] != 22 + || addrmap[24] != 22) + abort (); +} + +int main () +{ + func (); + return 0; +} diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index 46b20c2..ca8f84a 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -716,6 +716,20 @@ if_convertible_stmt_p (gimple stmt, VEC (data_reference_p, heap) *refs) return true; } +/* Return true when BB post-dominates all its predecessors. */ + +static bool +bb_postdominates_preds (basic_block bb) +{ + unsigned i; + + for (i = 0; i < EDGE_COUNT (bb->preds); i++) + if (!dominated_by_p (CDI_POST_DOMINATORS, EDGE_PRED (bb, i)->src, bb)) + return false; + + return true; +} + /* Return true when BB is if-convertible. This routine does not check basic block's statements and phis. @@ -774,6 +788,11 @@ if_convertible_bb_p (struct loop *loop, basic_block bb, basic_block exit_bb) return false; } + if (EDGE_COUNT (bb->preds) == 2 + && bb != loop->header + && !bb_postdominates_preds (bb)) + return false; + return true; } @@ -992,6 +1011,7 @@ if_convertible_loop_p_1 (struct loop *loop, return false; calculate_dominance_info (CDI_DOMINATORS); + calculate_dominance_info (CDI_POST_DOMINATORS); /* Allow statements that can be handled during if-conversion. */ ifc_bbs = get_loop_body_in_if_conv_order (loop); @@ -1262,6 +1282,9 @@ predicate_scalar_phi (gimple phi, tree cond, arg_1 = gimple_phi_arg_def (phi, 1); } + gcc_checking_assert (bb == bb->loop_father->header + || bb_postdominates_preds (bb)); + /* Build new RHS using selected condition and arguments. */ rhs = build3 (COND_EXPR, TREE_TYPE (res), unshare_expr (cond), arg_0, arg_1); |