From 00d382a8ddfca7635f66bef566909f9f207e50df Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Wed, 30 Apr 2008 19:05:12 +0000 Subject: [PATCH] re PR tree-optimization/21636 (Missed ccp optimization) 2008-04-30 Richard Guenther PR tree-optimization/21636 * tree-ssa-ccp.c (ccp_fold): Handle &p->x with p being a constant address. (evaluate_stmt): Print the likely value. (ccp_visit_stmt): Avoid excessive vertical spacing. * gcc.dg/tree-ssa/ssa-ccp-19.c: New testcase. From-SVN: r134834 --- gcc/ChangeLog | 8 ++++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-19.c | 16 +++++++ gcc/tree-ssa-ccp.c | 52 +++++++++++++++++++++- 4 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-19.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 043723e06e0..9df335e62e6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2008-04-30 Richard Guenther + + PR tree-optimization/21636 + * tree-ssa-ccp.c (ccp_fold): Handle &p->x with p being a + constant address. + (evaluate_stmt): Print the likely value. + (ccp_visit_stmt): Avoid excessive vertical spacing. + 2008-04-30 Rafael Espindola * builtins.c (fold_call_expr): Return realret. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 53978ccd0f5..410b7202cb8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-04-30 Richard Guenther + + PR tree-optimization/21636 + * gcc.dg/tree-ssa/ssa-ccp-19.c: New testcase. + 2008-04-30 Thomas Koenig PR libfortran/35993 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-19.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-19.c new file mode 100644 index 00000000000..ab4182246a3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-19.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-ccp1" } */ + +struct f { int i; }; +int g() +{ + struct f a, *a1; + int *i; + a.i = 1; + a1 = &a; + i = &a1->i; + return *i; /* This should be turned into a.i */ +} + +/* { dg-final { scan-tree-dump "= a.i;" "ccp1" } } */ +/* { dg-final { cleanup-tree-dump "ccp1" } } */ diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index 6907f0b837b..c6c7a8885f5 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -975,6 +975,38 @@ ccp_fold (tree stmt) else if (kind == tcc_reference) return fold_const_aggregate_ref (rhs); + /* Handle propagating invariant addresses into address operations. + The folding we do here matches that in tree-ssa-forwprop.c. */ + else if (code == ADDR_EXPR) + { + tree *base; + base = &TREE_OPERAND (rhs, 0); + while (handled_component_p (*base)) + base = &TREE_OPERAND (*base, 0); + if (TREE_CODE (*base) == INDIRECT_REF + && TREE_CODE (TREE_OPERAND (*base, 0)) == SSA_NAME) + { + prop_value_t *val = get_value (TREE_OPERAND (*base, 0)); + if (val->lattice_val == CONSTANT + && TREE_CODE (val->value) == ADDR_EXPR + && useless_type_conversion_p (TREE_TYPE (TREE_OPERAND (*base, 0)), + TREE_TYPE (val->value)) + && useless_type_conversion_p (TREE_TYPE (*base), + TREE_TYPE (TREE_OPERAND (val->value, 0)))) + { + /* We need to return a new tree, not modify the IL or share + parts of it. So play some tricks to avoid manually + building it. */ + tree ret, save = *base; + *base = TREE_OPERAND (val->value, 0); + ret = unshare_expr (rhs); + recompute_tree_invariant_for_addr_expr (ret); + *base = save; + return ret; + } + } + } + /* We may be able to fold away calls to builtin functions if their arguments are constants. */ else if (code == CALL_EXPR @@ -1210,6 +1242,25 @@ evaluate_stmt (tree stmt) fold_undefer_overflow_warnings (is_constant, stmt, 0); + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, "which is likely "); + switch (likelyvalue) + { + case CONSTANT: + fprintf (dump_file, "CONSTANT"); + break; + case UNDEFINED: + fprintf (dump_file, "UNDEFINED"); + break; + case VARYING: + fprintf (dump_file, "VARYING"); + break; + default:; + } + fprintf (dump_file, "\n"); + } + if (is_constant) { /* The statement produced a constant value. */ @@ -1378,7 +1429,6 @@ ccp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p) { fprintf (dump_file, "\nVisiting statement:\n"); print_generic_stmt (dump_file, stmt, dump_flags); - fprintf (dump_file, "\n"); } if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT) -- 2.30.2