From d30078b8e7dc6f94dbd8aa1b56f59bdf479303a8 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Mon, 10 Oct 2016 14:40:59 -0600 Subject: re PR tree-optimization/71947 (x ^ y not folded to 0 if x == y by DOM) PR tree-optimization/71947 * tree-ssa-dom.c (cprop_into_stmt): Avoid replacing A with B, then B with A within a single statement. PR tree-optimization/71947 * gcc.dg/tree-ssa/pr71947-1.c: New test. * gcc.dg/tree-ssa/pr71947-2.c: New test. * gcc.dg/tree-ssa/pr71947-3.c: New test. * gcc.dg/tree-ssa/pr71947-4.c: New test. * gcc.dg/tree-ssa/pr71947-5.c: New test. * gcc.dg/tree-ssa/pr71947-6.c: New test. From-SVN: r240947 --- gcc/tree-ssa-dom.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'gcc/tree-ssa-dom.c') diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index b007388..5376ff9 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -1731,9 +1731,26 @@ cprop_into_stmt (gimple *stmt) { use_operand_p op_p; ssa_op_iter iter; + tree last_copy_propagated_op = NULL; FOR_EACH_SSA_USE_OPERAND (op_p, stmt, iter, SSA_OP_USE) - cprop_operand (stmt, op_p); + { + tree old_op = USE_FROM_PTR (op_p); + + /* If we have A = B and B = A in the copy propagation tables + (due to an equality comparison), avoid substituting B for A + then A for B in the trivially discovered cases. This allows + optimization of statements were A and B appear as input + operands. */ + if (old_op != last_copy_propagated_op) + { + cprop_operand (stmt, op_p); + + tree new_op = USE_FROM_PTR (op_p); + if (new_op != old_op && TREE_CODE (new_op) == SSA_NAME) + last_copy_propagated_op = new_op; + } + } } /* Optimize the statement in block BB pointed to by iterator SI -- cgit v1.1