From 2bbec6d92d3c0fbba419fbc42e3153c27e9425ff Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Mon, 13 Mar 2006 09:32:34 -0700 Subject: [PATCH] tree-vrp.c (stmt_interesting_for_vrp): Some statements with virtual operands are interesting. * tree-vrp.c (stmt_interesting_for_vrp): Some statements with virtual operands are interesting. (vrp_visit_stmt): Corresponding changes. * gcc.dg/tree-ssa/20030807-2.c: No longer expected to fail. From-SVN: r112011 --- gcc/ChangeLog | 6 +++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/tree-ssa/20030807-2.c | 2 +- gcc/tree-vrp.c | 27 ++++++++++++++++++---- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 61cf790d0d6..abdc2855ac0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-03-13 Jeff Law + + * tree-vrp.c (stmt_interesting_for_vrp): Some statements with + virtual operands are interesting. + (vrp_visit_stmt): Corresponding changes. + 2006-03-13 Bernd Schmidt * config/bfin/lib1funcs.asm (___umodsi3): Use stack to save contents diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6ae2bca1e90..e998c9d1b0b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2006-03-13 Jeff Law + + * gcc.dg/tree-ssa/20030807-2.c: No longer expected to fail. + 2006-03-13 Eric Botcazou * gcc.dg/switch-9.c: New test. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20030807-2.c b/gcc/testsuite/gcc.dg/tree-ssa/20030807-2.c index a019d5550cf..29e793e3622 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/20030807-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/20030807-2.c @@ -24,5 +24,5 @@ foo(int n) /* There should be no IF conditionals. */ -/* { dg-final { scan-tree-dump-times "if " 0 "dom3" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "if " 0 "dom3" } } */ /* { dg-final { cleanup-tree-dump "dom3" } } */ diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index e126fea8d7d..278347d4d9f 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -3266,11 +3266,19 @@ stmt_interesting_for_vrp (tree stmt) else if (TREE_CODE (stmt) == MODIFY_EXPR) { tree lhs = TREE_OPERAND (stmt, 0); + tree rhs = TREE_OPERAND (stmt, 1); + /* In general, assignments with virtual operands are not useful + for deriving ranges, with the obvious exception of calls to + builtin functions. */ if (TREE_CODE (lhs) == SSA_NAME && (INTEGRAL_TYPE_P (TREE_TYPE (lhs)) || POINTER_TYPE_P (TREE_TYPE (lhs))) - && ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS)) + && ((TREE_CODE (rhs) == CALL_EXPR + && TREE_CODE (TREE_OPERAND (rhs, 0)) == ADDR_EXPR + && DECL_P (TREE_OPERAND (TREE_OPERAND (rhs, 0), 0)) + && DECL_IS_BUILTIN (TREE_OPERAND (TREE_OPERAND (rhs, 0), 0))) + || ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))) return true; } else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR) @@ -3739,9 +3747,20 @@ vrp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p) } ann = stmt_ann (stmt); - if (TREE_CODE (stmt) == MODIFY_EXPR - && ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS)) - return vrp_visit_assignment (stmt, output_p); + if (TREE_CODE (stmt) == MODIFY_EXPR) + { + tree rhs = TREE_OPERAND (stmt, 1); + + /* In general, assignments with virtual operands are not useful + for deriving ranges, with the obvious exception of calls to + builtin functions. */ + if ((TREE_CODE (rhs) == CALL_EXPR + && TREE_CODE (TREE_OPERAND (rhs, 0)) == ADDR_EXPR + && DECL_P (TREE_OPERAND (TREE_OPERAND (rhs, 0), 0)) + && DECL_IS_BUILTIN (TREE_OPERAND (TREE_OPERAND (rhs, 0), 0))) + || ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS)) + return vrp_visit_assignment (stmt, output_p); + } else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR) return vrp_visit_cond_stmt (stmt, taken_edge_p);