From: Richard Biener Date: Wed, 26 Jul 2017 11:35:45 +0000 (+0000) Subject: gimple-match-head.c (do_valueize): Return OP if valueize returns NULL_TREE. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4f450a2b1022124194097e39b3b1caca1d5dc2bc;p=gcc.git gimple-match-head.c (do_valueize): Return OP if valueize returns NULL_TREE. 2017-07-26 Richard Biener * gimple-match-head.c (do_valueize): Return OP if valueize returns NULL_TREE. (get_def): New helper to get at the def stmt of a SSA name if valueize allows. * genmatch.c (dt_node::gen_kids_1): Use get_def instead of do_valueize to get at the def stmt. (dt_operand::gen_gimple_expr): Simplify do_valueize calls. * gcc/testsuite/gcc.dg/pr70920-2.c: Adjust for transform already happening in ccp1. * gcc/testsuite/gcc.dg/pr70920-4.c: Likewise. From-SVN: r250565 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9bd8736ad58..ff746ffc621 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2017-07-26 Richard Biener + + * gimple-match-head.c (do_valueize): Return OP if valueize + returns NULL_TREE. + (get_def): New helper to get at the def stmt of a SSA name + if valueize allows. + * genmatch.c (dt_node::gen_kids_1): Use get_def instead of + do_valueize to get at the def stmt. + (dt_operand::gen_gimple_expr): Simplify do_valueize calls. + 2017-07-26 Wilco Dijkstra PR middle-end/46932 diff --git a/gcc/genmatch.c b/gcc/genmatch.c index 43f83723658..6564a1aa501 100644 --- a/gcc/genmatch.c +++ b/gcc/genmatch.c @@ -2646,6 +2646,7 @@ dt_operand::gen_gimple_expr (FILE *f, int indent) expr *e = static_cast (op); id_base *id = e->operation; unsigned n_ops = e->ops.length (); + unsigned n_braces = 0; for (unsigned i = 0; i < n_ops; ++i) { @@ -2678,14 +2679,15 @@ dt_operand::gen_gimple_expr (FILE *f, int indent) "if ((TREE_CODE (%s) == SSA_NAME\n", child_opname); fprintf_indent (f, indent, - " || is_gimple_min_invariant (%s))\n", + " || is_gimple_min_invariant (%s)))\n", child_opname); - fprintf_indent (f, indent, - " && (%s = do_valueize (valueize, %s)))\n", - child_opname, child_opname); fprintf_indent (f, indent, " {\n"); indent += 4; + n_braces++; + fprintf_indent (f, indent, + "%s = do_valueize (valueize, %s);\n", + child_opname, child_opname); continue; } else @@ -2698,10 +2700,8 @@ dt_operand::gen_gimple_expr (FILE *f, int indent) "tree %s = gimple_call_arg (def, %u);\n", child_opname, i); fprintf_indent (f, indent, - "if ((%s = do_valueize (valueize, %s)))\n", + "%s = do_valueize (valueize, %s);\n", child_opname, child_opname); - fprintf_indent (f, indent, " {\n"); - indent += 4; } /* While the toplevel operands are canonicalized by the caller after valueizing operands of sub-expressions we have to @@ -2726,7 +2726,7 @@ dt_operand::gen_gimple_expr (FILE *f, int indent) } } - return n_ops; + return n_braces; } /* Generate GENERIC matching code for the decision tree operand. */ @@ -2867,14 +2867,10 @@ dt_node::gen_kids_1 (FILE *f, int indent, bool gimple, fprintf_indent (f, indent, "case SSA_NAME:\n"); fprintf_indent (f, indent, - " if (do_valueize (valueize, %s) != NULL_TREE)\n", + " if (gimple *def_stmt = get_def (valueize, %s))\n", kid_opname); fprintf_indent (f, indent, " {\n"); - fprintf_indent (f, indent, - " gimple *def_stmt = SSA_NAME_DEF_STMT (%s);\n", - kid_opname); - indent += 6; if (exprs_len) { diff --git a/gcc/gimple-match-head.c b/gcc/gimple-match-head.c index 5f6aa273b96..8ad1f8c5eae 100644 --- a/gcc/gimple-match-head.c +++ b/gcc/gimple-match-head.c @@ -779,10 +779,25 @@ inline tree do_valueize (tree (*valueize)(tree), tree op) { if (valueize && TREE_CODE (op) == SSA_NAME) - return valueize (op); + { + tree tem = valueize (op); + if (tem) + return tem; + } return op; } +/* Helper for the autogenerated code, get at the definition of NAME when + VALUEIZE allows that. */ + +inline gimple * +get_def (tree (*valueize)(tree), tree name) +{ + if (valueize && ! valueize (name)) + return NULL; + return SSA_NAME_DEF_STMT (name); +} + /* Routine to determine if the types T1 and T2 are effectively the same for GIMPLE. If T1 or T2 is not a type, the test applies to their TREE_TYPE. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e7991a67d63..aaec07c0026 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2017-07-26 Richard Biener + + * gcc/testsuite/gcc.dg/pr70920-2.c: Adjust for transform already + happening in ccp1. + * gcc/testsuite/gcc.dg/pr70920-4.c: Likewise. + 2017-07-26 Wilco Dijkstra PR middle-end/46932 diff --git a/gcc/testsuite/gcc.dg/pr70920-2.c b/gcc/testsuite/gcc.dg/pr70920-2.c index 2db9897bad5..98072247e94 100644 --- a/gcc/testsuite/gcc.dg/pr70920-2.c +++ b/gcc/testsuite/gcc.dg/pr70920-2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-forwprop-details" } */ +/* { dg-options "-O2 -fdump-tree-ccp1-details" } */ #include @@ -18,4 +18,4 @@ foo (int *a) } } -/* { dg-final { scan-tree-dump "gimple_simplified to if \\(a_\[0-9\]*\\(D\\) == 0B\\)" "forwprop1" } } */ +/* { dg-final { scan-tree-dump "gimple_simplified to if \\(a_\[0-9\]*\\(D\\) == 0B\\)" "ccp1" } } */ diff --git a/gcc/testsuite/gcc.dg/pr70920-4.c b/gcc/testsuite/gcc.dg/pr70920-4.c index e9c2b9587e5..70973cb162a 100644 --- a/gcc/testsuite/gcc.dg/pr70920-4.c +++ b/gcc/testsuite/gcc.dg/pr70920-4.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-require-effective-target lp64 } */ -/* { dg-options "-O2 -fdump-tree-forwprop-details -Wno-int-to-pointer-cast" } */ +/* { dg-options "-O2 -fdump-tree-ccp1 -Wno-int-to-pointer-cast" } */ #include @@ -19,4 +19,4 @@ foo (int a) } } -/* { dg-final { scan-tree-dump "if \\(_\[0-9\]* == 0\\)" "forwprop1" } } */ +/* { dg-final { scan-tree-dump "if \\(a_\[0-9\]*\\(D\\) == 0\\)" "ccp1" } } */