diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-11-02 15:26:04 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-11-02 15:26:04 +0000 |
commit | e02d609e6b86451631f33ee35c6aca717a0bbaa3 (patch) | |
tree | 7d774c5ca44289be14a3e90d232870e60aa071e5 /gcc/tree-ssa-sccvn.c | |
parent | 8f14d2e0c3164dda5a23908e102c984d3e771199 (diff) | |
download | gcc-e02d609e6b86451631f33ee35c6aca717a0bbaa3.tar.gz |
2008-11-02 Richard Guenther <rguenther@suse.de>
PR tree-optimization/37542
* tree-ssa-pre.c (fully_constant_expression): Handle more cases.
* tree-ssa-sccvn.c (vn_get_expr_for): Fix typo.
(vn_nary_op_lookup_stmt): Adjust for unary reference trees.
(vn_nary_op_insert_stmt): Likewise.
(visit_use): Likewise.
* gcc.dg/tree-ssa/ssa-pre-22.c: New testcase.
* gcc.c-torture/compile/20081101-1.c: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@141534 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-sccvn.c')
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index e255411fe6a..80f7a92c3dc 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -258,8 +258,8 @@ vn_get_expr_for (tree name) { case tcc_reference: if (gimple_assign_rhs_code (def_stmt) == VIEW_CONVERT_EXPR - && gimple_assign_rhs_code (def_stmt) == REALPART_EXPR - && gimple_assign_rhs_code (def_stmt) == IMAGPART_EXPR) + || gimple_assign_rhs_code (def_stmt) == REALPART_EXPR + || gimple_assign_rhs_code (def_stmt) == IMAGPART_EXPR) expr = fold_build1 (gimple_assign_rhs_code (def_stmt), gimple_expr_type (def_stmt), TREE_OPERAND (gimple_assign_rhs1 (def_stmt), 0)); @@ -1281,6 +1281,10 @@ vn_nary_op_lookup_stmt (gimple stmt, vn_nary_op_t *vnresult) vno1.type = TREE_TYPE (gimple_assign_lhs (stmt)); for (i = 0; i < vno1.length; ++i) vno1.op[i] = gimple_op (stmt, i + 1); + if (vno1.opcode == REALPART_EXPR + || vno1.opcode == IMAGPART_EXPR + || vno1.opcode == VIEW_CONVERT_EXPR) + vno1.op[0] = TREE_OPERAND (vno1.op[0], 0); vno1.hashcode = vn_nary_op_compute_hash (&vno1); slot = htab_find_slot_with_hash (current_info->nary, &vno1, vno1.hashcode, NO_INSERT); @@ -1385,6 +1389,10 @@ vn_nary_op_insert_stmt (gimple stmt, tree result) vno1->type = TREE_TYPE (gimple_assign_lhs (stmt)); for (i = 0; i < vno1->length; ++i) vno1->op[i] = gimple_op (stmt, i + 1); + if (vno1->opcode == REALPART_EXPR + || vno1->opcode == IMAGPART_EXPR + || vno1->opcode == VIEW_CONVERT_EXPR) + vno1->op[0] = TREE_OPERAND (vno1->op[0], 0); vno1->result = result; vno1->hashcode = vn_nary_op_compute_hash (vno1); slot = htab_find_slot_with_hash (current_info->nary, vno1, vno1->hashcode, @@ -2380,8 +2388,18 @@ visit_use (tree use) case GIMPLE_SINGLE_RHS: switch (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt))) { - case tcc_declaration: case tcc_reference: + /* VOP-less references can go through unary case. */ + if ((gimple_assign_rhs_code (stmt) == REALPART_EXPR + || gimple_assign_rhs_code (stmt) == IMAGPART_EXPR + || gimple_assign_rhs_code (stmt) == VIEW_CONVERT_EXPR ) + && TREE_CODE (TREE_OPERAND (gimple_assign_rhs1 (stmt), 0)) == SSA_NAME) + { + changed = visit_unary_op (lhs, stmt); + break; + } + /* Fallthrough. */ + case tcc_declaration: changed = visit_reference_op_load (lhs, gimple_assign_rhs1 (stmt), stmt); break; |