diff options
author | Richard Biener <rguenther@suse.de> | 2016-07-14 12:15:38 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-07-14 12:15:38 +0000 |
commit | 351168fe551a792fac3dac3359de72c1bcdc651e (patch) | |
tree | e63596b59c87415b491b0e9c85ffdeff0cdb6f3d /gcc/tree-ssa-pre.c | |
parent | 8234d02aa47d9cba294b4263e47a336e9c67f5b1 (diff) | |
download | gcc-351168fe551a792fac3dac3359de72c1bcdc651e.zip gcc-351168fe551a792fac3dac3359de72c1bcdc651e.tar.gz gcc-351168fe551a792fac3dac3359de72c1bcdc651e.tar.bz2 |
re PR tree-optimization/71866 (gcc locks up after fix for PR70159)
2016-07-14 Richard Biener <rguenther@suse.de>
PR tree-optimization/71866
* tree-ssa-pre.c (get_constant_for_value_id): Remove.
(do_hoist_insertion): Avoid endless recursion when we
didn't insert anything because we managed to simplify
things down to a constant or SSA name.
(fully_constant_expression): Re-write in terms of ...
* tree-ssa-sccvn.h (vn_nary_simplify): ... this. Declare.
* tree-ssa-sccvn.c (vn_nary_simplify): New wrapper around
vn_nary_build_or_lookup_1.
(vn_nary_build_or_lookup_1): Added flag and renamed from ...
(vn_nary_build_or_lookup): ... this which now wraps it.
* gcc.dg/torture/pr71866.c: New testcase.
From-SVN: r238334
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r-- | gcc/tree-ssa-pre.c | 117 |
1 files changed, 21 insertions, 96 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index a5f3f71..518346a 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -1164,29 +1164,6 @@ get_or_alloc_expr_for_constant (tree constant) return newexpr; } -/* Given a value id V, find the actual tree representing the constant - value if there is one, and return it. Return NULL if we can't find - a constant. */ - -static tree -get_constant_for_value_id (unsigned int v) -{ - if (value_id_constant_p (v)) - { - unsigned int i; - bitmap_iterator bi; - bitmap exprset = value_expressions[v]; - - EXECUTE_IF_SET_IN_BITMAP (exprset, 0, i, bi) - { - pre_expr expr = expression_for_id (i); - if (expr->kind == CONSTANT) - return PRE_EXPR_CONSTANT (expr); - } - } - return NULL; -} - /* Get or allocate a pre_expr for a piece of GIMPLE, and return it. Currently only supports constants and SSA_NAMES. */ static pre_expr @@ -1236,76 +1213,16 @@ fully_constant_expression (pre_expr e) case NARY: { vn_nary_op_t nary = PRE_EXPR_NARY (e); - switch (TREE_CODE_CLASS (nary->opcode)) - { - case tcc_binary: - case tcc_comparison: - { - /* We have to go from trees to pre exprs to value ids to - constants. */ - tree naryop0 = nary->op[0]; - tree naryop1 = nary->op[1]; - tree result; - if (!is_gimple_min_invariant (naryop0)) - { - pre_expr rep0 = get_or_alloc_expr_for (naryop0); - unsigned int vrep0 = get_expr_value_id (rep0); - tree const0 = get_constant_for_value_id (vrep0); - if (const0) - naryop0 = fold_convert (TREE_TYPE (naryop0), const0); - } - if (!is_gimple_min_invariant (naryop1)) - { - pre_expr rep1 = get_or_alloc_expr_for (naryop1); - unsigned int vrep1 = get_expr_value_id (rep1); - tree const1 = get_constant_for_value_id (vrep1); - if (const1) - naryop1 = fold_convert (TREE_TYPE (naryop1), const1); - } - result = fold_binary (nary->opcode, nary->type, - naryop0, naryop1); - if (result && is_gimple_min_invariant (result)) - return get_or_alloc_expr_for_constant (result); - /* We might have simplified the expression to a - SSA_NAME for example from x_1 * 1. But we cannot - insert a PHI for x_1 unconditionally as x_1 might - not be available readily. */ - return e; - } - case tcc_reference: - if (nary->opcode != REALPART_EXPR - && nary->opcode != IMAGPART_EXPR - && nary->opcode != VIEW_CONVERT_EXPR) - return e; - /* Fallthrough. */ - case tcc_unary: - { - /* We have to go from trees to pre exprs to value ids to - constants. */ - tree naryop0 = nary->op[0]; - tree const0, result; - if (is_gimple_min_invariant (naryop0)) - const0 = naryop0; - else - { - pre_expr rep0 = get_or_alloc_expr_for (naryop0); - unsigned int vrep0 = get_expr_value_id (rep0); - const0 = get_constant_for_value_id (vrep0); - } - result = NULL; - if (const0) - { - tree type1 = TREE_TYPE (nary->op[0]); - const0 = fold_convert (type1, const0); - result = fold_unary (nary->opcode, nary->type, const0); - } - if (result && is_gimple_min_invariant (result)) - return get_or_alloc_expr_for_constant (result); - return e; - } - default: - return e; - } + tree res = vn_nary_simplify (nary); + if (!res) + return e; + if (is_gimple_min_invariant (res)) + return get_or_alloc_expr_for_constant (res); + /* We might have simplified the expression to a + SSA_NAME for example from x_1 * 1. But we cannot + insert a PHI for x_1 unconditionally as x_1 might + not be available readily. */ + return e; } case REFERENCE: { @@ -3618,10 +3535,18 @@ do_hoist_insertion (basic_block block) gimple_seq stmts = NULL; tree res = create_expression_by_pieces (block, expr, &stmts, get_expr_type (expr)); - if (gsi_end_p (last) || is_ctrl_stmt (gsi_stmt (last))) - gsi_insert_seq_before (&last, stmts, GSI_SAME_STMT); + + /* Do not return true if expression creation ultimately + did not insert any statements. */ + if (gimple_seq_empty_p (stmts)) + res = NULL_TREE; else - gsi_insert_seq_after (&last, stmts, GSI_NEW_STMT); + { + if (gsi_end_p (last) || is_ctrl_stmt (gsi_stmt (last))) + gsi_insert_seq_before (&last, stmts, GSI_SAME_STMT); + else + gsi_insert_seq_after (&last, stmts, GSI_NEW_STMT); + } /* Make sure to not return true if expression creation ultimately failed but also make sure to insert any stmts produced as they |