On Tue, 10 Jun 2014, Richard Biener wrote: > > The following fixes PR61452 - when keeping a lattice value at > VARYING we shouldn't adjust the lattice ->expr or ->has_constants.
Needs adjustments in the simplifiers, otherwise we regress ssa-fre-39.c. Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. There are cleanup opportunities now, but the match-and-simplify gets rid of all of this code so I won't bother applying TLC now. Richard. 2014-06-11 Richard Biener <rguent...@suse.de> PR tree-optimization/61452 * tree-ssa-sccvn.c (visit_phi): Remove pointless setting of expr and has_constants in case we found a leader. (simplify_binary_expression): Always valueize operands first. (simplify_unary_expression): Likewise. * gcc.dg/torture/pr61452.c: New testcase. Index: gcc/testsuite/gcc.dg/torture/pr61452.c =================================================================== *** gcc/testsuite/gcc.dg/torture/pr61452.c (revision 0) --- gcc/testsuite/gcc.dg/torture/pr61452.c (working copy) *************** *** 0 **** --- 1,31 ---- + /* { dg-do run } */ + + int a, b; + short c, d; + char e, f; + + int + fn1 (int p1, char p2) + { + return p1 || p2 ? 0 : p2; + } + + void + fn2 () + { + for (; a;) + { + int g; + g = c = e; + for (; a;) + b = fn1 (g = d = e, g); + f = g; + } + } + + int + main () + { + fn2 (); + return 0; + } Index: gcc/tree-ssa-sccvn.c =================================================================== --- gcc/tree-ssa-sccvn.c (revision 211435) +++ gcc/tree-ssa-sccvn.c (working copy) @@ -3140,35 +3140,12 @@ visit_phi (gimple phi) /* If all value numbered to the same value, the phi node has that value. */ if (allsame) - { - if (is_gimple_min_invariant (sameval)) - { - VN_INFO (PHI_RESULT (phi))->has_constants = true; - if (sameval != VN_TOP) - VN_INFO (PHI_RESULT (phi))->expr = sameval; - } - else - { - VN_INFO (PHI_RESULT (phi))->has_constants = false; - if (sameval != VN_TOP) - VN_INFO (PHI_RESULT (phi))->expr = sameval; - } - - if (TREE_CODE (sameval) == SSA_NAME) - return visit_copy (PHI_RESULT (phi), sameval); - - return set_ssa_val_to (PHI_RESULT (phi), sameval); - } + return set_ssa_val_to (PHI_RESULT (phi), sameval); /* Otherwise, see if it is equivalent to a phi node in this block. */ result = vn_phi_lookup (phi); if (result) - { - if (TREE_CODE (result) == SSA_NAME) - changed = visit_copy (PHI_RESULT (phi), result); - else - changed = set_ssa_val_to (PHI_RESULT (phi), result); - } + changed = set_ssa_val_to (PHI_RESULT (phi), result); else { vn_phi_insert (phi, PHI_RESULT (phi)); @@ -3262,24 +3239,18 @@ simplify_binary_expression (gimple stmt) catch those with constants. The goal here is to simultaneously combine constants between expressions, but avoid infinite expansion of expressions during simplification. */ - if (TREE_CODE (op0) == SSA_NAME) - { - if (VN_INFO (op0)->has_constants + op0 = vn_valueize (op0); + if (TREE_CODE (op0) == SSA_NAME + && (VN_INFO (op0)->has_constants || TREE_CODE_CLASS (code) == tcc_comparison - || code == COMPLEX_EXPR) - op0 = vn_get_expr_for (op0); - else - op0 = vn_valueize (op0); - } + || code == COMPLEX_EXPR)) + op0 = vn_get_expr_for (op0); - if (TREE_CODE (op1) == SSA_NAME) - { - if (VN_INFO (op1)->has_constants - || code == COMPLEX_EXPR) - op1 = vn_get_expr_for (op1); - else - op1 = vn_valueize (op1); - } + op1 = vn_valueize (op1); + if (TREE_CODE (op1) == SSA_NAME + && (VN_INFO (op1)->has_constants + || code == COMPLEX_EXPR)) + op1 = vn_get_expr_for (op1); /* Pointer plus constant can be represented as invariant address. Do so to allow further propatation, see also tree forwprop. */ @@ -3333,31 +3304,32 @@ simplify_unary_expression (gimple stmt) || code == BIT_FIELD_REF) op0 = TREE_OPERAND (op0, 0); - if (TREE_CODE (op0) != SSA_NAME) - return NULL_TREE; - orig_op0 = op0; - if (VN_INFO (op0)->has_constants) - op0 = vn_get_expr_for (op0); - else if (CONVERT_EXPR_CODE_P (code) - || code == REALPART_EXPR - || code == IMAGPART_EXPR - || code == VIEW_CONVERT_EXPR - || code == BIT_FIELD_REF) + op0 = vn_valueize (op0); + if (TREE_CODE (op0) == SSA_NAME) { - /* We want to do tree-combining on conversion-like expressions. - Make sure we feed only SSA_NAMEs or constants to fold though. */ - tree tem = vn_get_expr_for (op0); - if (UNARY_CLASS_P (tem) - || BINARY_CLASS_P (tem) - || TREE_CODE (tem) == VIEW_CONVERT_EXPR - || TREE_CODE (tem) == SSA_NAME - || TREE_CODE (tem) == CONSTRUCTOR - || is_gimple_min_invariant (tem)) - op0 = tem; + if (VN_INFO (op0)->has_constants) + op0 = vn_get_expr_for (op0); + else if (CONVERT_EXPR_CODE_P (code) + || code == REALPART_EXPR + || code == IMAGPART_EXPR + || code == VIEW_CONVERT_EXPR + || code == BIT_FIELD_REF) + { + /* We want to do tree-combining on conversion-like expressions. + Make sure we feed only SSA_NAMEs or constants to fold though. */ + tree tem = vn_get_expr_for (op0); + if (UNARY_CLASS_P (tem) + || BINARY_CLASS_P (tem) + || TREE_CODE (tem) == VIEW_CONVERT_EXPR + || TREE_CODE (tem) == SSA_NAME + || TREE_CODE (tem) == CONSTRUCTOR + || is_gimple_min_invariant (tem)) + op0 = tem; + } } - /* Avoid folding if nothing changed, but remember the expression. */ + /* Avoid folding if nothing changed. */ if (op0 == orig_op0) return NULL_TREE;