From 3c53c488e52b15c45d2b81053b680e8c22b4c7ba Mon Sep 17 00:00:00 2001 From: rguenth Date: Mon, 22 Sep 2008 11:53:29 +0000 Subject: [PATCH] 2008-09-22 Richard Guenther PR tree-optimization/37145 * tree-ssa-pre.c (fully_constant_expression): Simplify builtin calls. (phi_translate_1): Constant fold references. * gcc.dg/tree-ssa/ssa-pre-15.c: Remove XFAIL. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@140547 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 +++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-15.c | 2 +- gcc/tree-ssa-pre.c | 60 +++++++++++++++++++++++++++++- 4 files changed, 70 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0987ef03723..d7d57c99f30 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-09-22 Richard Guenther + + PR tree-optimization/37145 + * tree-ssa-pre.c (fully_constant_expression): Simplify builtin calls. + (phi_translate_1): Constant fold references. + 2008-09-22 Ira Rosen PR tree-optimization/37482 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9029ec549ab..d7100035090 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-09-22 Richard Guenther + + PR tree-optimization/37145 + * gcc.dg/tree-ssa/ssa-pre-15.c: Remove XFAIL. + 2008-09-22 Janus Weil PR fortran/37486 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-15.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-15.c index f080989d1de..518fda854e6 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-15.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-15.c @@ -12,5 +12,5 @@ __SIZE_TYPE__ mystrlen (const char *s) return strlen(s); } -/* { dg-final { scan-tree-dump "= 0;" "optimized" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump "= 0;" "optimized" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 053616d32af..dd61349a3d3 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -1155,6 +1155,52 @@ fully_constant_expression (pre_expr e) return e; } } + case REFERENCE: + { + vn_reference_t ref = PRE_EXPR_REFERENCE (e); + VEC (vn_reference_op_s, heap) *operands = ref->operands; + vn_reference_op_t op; + + /* Try to simplify the translated expression if it is + a call to a builtin function with at most two arguments. */ + op = VEC_index (vn_reference_op_s, operands, 0); + if (op->opcode == CALL_EXPR + && TREE_CODE (op->op0) == ADDR_EXPR + && TREE_CODE (TREE_OPERAND (op->op0, 0)) == FUNCTION_DECL + && DECL_BUILT_IN (TREE_OPERAND (op->op0, 0)) + && VEC_length (vn_reference_op_s, operands) >= 2 + && VEC_length (vn_reference_op_s, operands) <= 3) + { + vn_reference_op_t arg0, arg1 = NULL; + bool anyconst = false; + arg0 = VEC_index (vn_reference_op_s, operands, 1); + if (VEC_length (vn_reference_op_s, operands) > 2) + arg1 = VEC_index (vn_reference_op_s, operands, 2); + if (TREE_CODE_CLASS (arg0->opcode) == tcc_constant + || (arg0->opcode == ADDR_EXPR + && is_gimple_min_invariant (arg0->op0))) + anyconst = true; + if (arg1 + && (TREE_CODE_CLASS (arg1->opcode) == tcc_constant + || (arg1->opcode == ADDR_EXPR + && is_gimple_min_invariant (arg1->op0)))) + anyconst = true; + if (anyconst) + { + tree folded = build_call_expr (TREE_OPERAND (op->op0, 0), + arg1 ? 2 : 1, + arg0->op0, + arg1 ? arg1->op0 : NULL); + if (folded + && TREE_CODE (folded) == NOP_EXPR) + folded = TREE_OPERAND (folded, 0); + if (folded + && is_gimple_min_invariant (folded)) + return get_or_alloc_expr_for_constant (folded); + } + } + return e; + } default: return e; } @@ -1469,6 +1515,7 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, return expr; } break; + case REFERENCE: { vn_reference_t ref = PRE_EXPR_REFERENCE (expr); @@ -1570,11 +1617,12 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, if (changed) { + unsigned int new_val_id; + pre_expr constant; + tree result = vn_reference_lookup_pieces (newvuses, newoperands, &newref, true); - unsigned int new_val_id; - if (newref) VEC_free (vn_reference_op_s, heap, newoperands); @@ -1591,6 +1639,10 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, if (newref) { PRE_EXPR_REFERENCE (expr) = newref; + constant = fully_constant_expression (expr); + if (constant != expr) + return constant; + new_val_id = newref->value_id; get_or_alloc_expression_id (expr); } @@ -1604,6 +1656,9 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, result, new_val_id); newoperands = NULL; PRE_EXPR_REFERENCE (expr) = newref; + constant = fully_constant_expression (expr); + if (constant != expr) + return constant; get_or_alloc_expression_id (expr); } add_to_value (new_val_id, expr); @@ -1613,6 +1668,7 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, return expr; } break; + case NAME: { gimple phi = NULL; -- 2.11.4.GIT