From: rguenth Date: Fri, 21 Sep 2012 12:44:07 +0000 (+0000) Subject: 2012-09-21 Richard Guenther X-Git-Tag: upstream/4.9.2~10475 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=033e1d08983deced7ef0a67d90de76ae4c1e7a3d;p=platform%2Fupstream%2Flinaro-gcc.git 2012-09-21 Richard Guenther PR tree-optimization/54647 * tree-ssa-pre.c (compute_avail): Do not put COND_EXPR or VEC_COND_EXPR into EXP_GEN again. * g++.dg/torture/pr54647.C: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@191613 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8fd0221..648eb10 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-09-21 Richard Guenther + + PR tree-optimization/54647 + * tree-ssa-pre.c (compute_avail): Do not put COND_EXPR + or VEC_COND_EXPR into EXP_GEN again. + 2012-09-21 Jakub Jelinek PR tree-optimization/54629 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9616b89..3723d6b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-09-21 Richard Guenther + + PR tree-optimization/54647 + * g++.dg/torture/pr54647.C: New testcase. + 2012-09-21 Marc Glisse PR c++/54427 diff --git a/gcc/testsuite/g++.dg/torture/pr54647.C b/gcc/testsuite/g++.dg/torture/pr54647.C new file mode 100644 index 0000000..2177ecd --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr54647.C @@ -0,0 +1,25 @@ +// { dg-do compile } + +class A +{ +}; +template struct D:A +{ + type & operator[](int); +}; +struct B +{ + typedef D Row; + struct C + { + Row *row; + }; +}; +B::C a; +B::Row & b = *a.row; +void +fn1 () +{ + while (1) + b[0] = b[0] ? (int *) -1 : 0; +} diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index ab9f2f4..d1d97b6 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -3981,9 +3981,18 @@ compute_avail (void) { case VN_NARY: { + enum tree_code code = gimple_assign_rhs_code (stmt); vn_nary_op_t nary; + + /* COND_EXPR and VEC_COND_EXPR are awkward in + that they contain an embedded complex expression. + Don't even try to shove those through PRE. */ + if (code == COND_EXPR + || code == VEC_COND_EXPR) + continue; + vn_nary_op_lookup_pieces (gimple_num_ops (stmt) - 1, - gimple_assign_rhs_code (stmt), + code, gimple_expr_type (stmt), gimple_assign_rhs1_ptr (stmt), &nary);