summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-sccvn.c
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2012-09-13 12:43:58 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2012-09-13 12:43:58 +0000
commit024fee2c369096e6fe6cde620243df5843893004 (patch)
tree68386939ae0852a77af25150e2d0cbfe60672811 /gcc/tree-ssa-sccvn.c
parent780bedc1ccae5ae85fb99afed8a1ac1cc598121b (diff)
downloadgcc-024fee2c369096e6fe6cde620243df5843893004.tar.gz
2012-09-13 Richard Guenther <rguenther@suse.de>
* tree-ssa-sccvn.h (enum vn_kind): New. (vn_get_stmt_kind): Likewise. * tree-ssa-sccvn.c (vn_get_stmt_kind): New function, adjust ADDR_EXPR handling. (visit_use): Use it. * tree-ssa-pre.c (compute_avail): Likewise, simplify further. * gcc.dg/tree-ssa/ssa-fre-37.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@191253 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-sccvn.c')
-rw-r--r--gcc/tree-ssa-sccvn.c96
1 files changed, 61 insertions, 35 deletions
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 9a370e8ab3c..2e5ed741a02 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -287,6 +287,63 @@ vn_get_expr_for (tree name)
return expr;
}
+/* Return the vn_kind the expression computed by the stmt should be
+ associated with. */
+
+enum vn_kind
+vn_get_stmt_kind (gimple stmt)
+{
+ switch (gimple_code (stmt))
+ {
+ case GIMPLE_CALL:
+ return VN_REFERENCE;
+ case GIMPLE_PHI:
+ return VN_PHI;
+ case GIMPLE_ASSIGN:
+ {
+ enum tree_code code = gimple_assign_rhs_code (stmt);
+ tree rhs1 = gimple_assign_rhs1 (stmt);
+ switch (get_gimple_rhs_class (code))
+ {
+ case GIMPLE_UNARY_RHS:
+ case GIMPLE_BINARY_RHS:
+ case GIMPLE_TERNARY_RHS:
+ return VN_NARY;
+ case GIMPLE_SINGLE_RHS:
+ switch (TREE_CODE_CLASS (code))
+ {
+ case tcc_reference:
+ /* VOP-less references can go through unary case. */
+ if ((code == REALPART_EXPR
+ || code == IMAGPART_EXPR
+ || code == VIEW_CONVERT_EXPR
+ || code == BIT_FIELD_REF)
+ && TREE_CODE (TREE_OPERAND (rhs1, 0)) == SSA_NAME)
+ return VN_NARY;
+
+ /* Fallthrough. */
+ case tcc_declaration:
+ return VN_REFERENCE;
+
+ case tcc_constant:
+ return VN_CONSTANT;
+
+ default:
+ if (code == ADDR_EXPR)
+ return (is_gimple_min_invariant (rhs1)
+ ? VN_CONSTANT : VN_REFERENCE);
+ else if (code == CONSTRUCTOR)
+ return VN_NARY;
+ return VN_NONE;
+ }
+ default:
+ return VN_NONE;
+ }
+ }
+ default:
+ return VN_NONE;
+ }
+}
/* Free a phi operation structure VP. */
@@ -3364,44 +3421,13 @@ visit_use (tree use)
}
else
{
- switch (get_gimple_rhs_class (code))
+ switch (vn_get_stmt_kind (stmt))
{
- case GIMPLE_UNARY_RHS:
- case GIMPLE_BINARY_RHS:
- case GIMPLE_TERNARY_RHS:
+ case VN_NARY:
changed = visit_nary_op (lhs, stmt);
break;
- case GIMPLE_SINGLE_RHS:
- switch (TREE_CODE_CLASS (code))
- {
- case tcc_reference:
- /* VOP-less references can go through unary case. */
- if ((code == REALPART_EXPR
- || code == IMAGPART_EXPR
- || code == VIEW_CONVERT_EXPR
- || code == BIT_FIELD_REF)
- && TREE_CODE (TREE_OPERAND (rhs1, 0)) == SSA_NAME)
- {
- changed = visit_nary_op (lhs, stmt);
- break;
- }
- /* Fallthrough. */
- case tcc_declaration:
- changed = visit_reference_op_load (lhs, rhs1, stmt);
- break;
- default:
- if (code == ADDR_EXPR)
- {
- changed = visit_nary_op (lhs, stmt);
- break;
- }
- else if (code == CONSTRUCTOR)
- {
- changed = visit_nary_op (lhs, stmt);
- break;
- }
- changed = defs_to_varying (stmt);
- }
+ case VN_REFERENCE:
+ changed = visit_reference_op_load (lhs, rhs1, stmt);
break;
default:
changed = defs_to_varying (stmt);