From 31ab1cc9db34ff449b8a72a2e856b9f5edcab7fa Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Mon, 8 Jan 2007 11:20:00 +0000 Subject: [PATCH] re PR tree-optimization/23603 (VRP does not say range for a in a = b == c; is [0,1]) 2007-01-08 Richard Guenther PR tree-optimization/23603 * tree-vrp.c (set_value_range_to_truthvalue): New function. (extract_range_from_binary): Fall back to truthvalue instead of varying for TRUTH_*_EXPR. (extract_range_from_comparison): Fall back to truthvalue instead of varying. (vrp_visit_phi_node): Don't adjust new range bounds to +INF/-INF if all visited PHI values were constant. * gcc.dg/tree-ssa/vrp31.c: New testcase. * gcc.dg/tree-ssa/vrp32.c: Likewise. From-SVN: r120578 --- gcc/ChangeLog | 11 ++++++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/tree-ssa/vrp31.c | 14 +++++++++++++ gcc/testsuite/gcc.dg/tree-ssa/vrp32.c | 14 +++++++++++++ gcc/tree-vrp.c | 29 +++++++++++++++++++++++---- 5 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/vrp31.c create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/vrp32.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dae9b9c17c1..9e9f510acbe 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2007-01-08 Richard Guenther + + PR tree-optimization/23603 + * tree-vrp.c (set_value_range_to_truthvalue): New function. + (extract_range_from_binary): Fall back to truthvalue instead of + varying for TRUTH_*_EXPR. + (extract_range_from_comparison): Fall back to truthvalue instead of + varying. + (vrp_visit_phi_node): Don't adjust new range bounds to +INF/-INF + if all visited PHI values were constant. + 2007-01-08 Jan Hubicka * cgraphunit.c (cgraph_process_new_functions): Reset reachable flag. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 80eeb112759..22e47180e5b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2007-01-08 Richard Guenther + + PR tree-optimization/23603 + * gcc.dg/tree-ssa/vrp31.c: New testcase. + * gcc.dg/tree-ssa/vrp32.c: Likewise. + 2007-01-08 Mark Shinwell * gcc.target/i386/20020531-1.c: Use "char" not "unsigned char" diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp31.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp31.c new file mode 100644 index 00000000000..5b4aa5db978 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp31.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-vrp1" } */ + +int f(int i) +{ + int t = i == 1; + int g = t == 2; + int h = g == 3; + return h; +} + +/* { dg-final { scan-tree-dump "return 0;" "vrp1" } } */ +/* { dg-final { cleanup-tree-dump "vrp1" } } */ + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp32.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp32.c new file mode 100644 index 00000000000..a42b3ca279e --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp32.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-vrp1" } */ + +int f(int i) +{ + _Bool t = !i; + int g = !t && i; + int h = g == 3; + return h; +} + +/* { dg-final { scan-tree-dump "return 0;" "vrp1" } } */ +/* { dg-final { cleanup-tree-dump "vrp1" } } */ + diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 36e9a3be787..1092d176dbd 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -236,6 +236,20 @@ set_value_range_to_varying (value_range_t *vr) } +/* Set value range VR to a range of a truthvalue of type TYPE. */ + +static inline void +set_value_range_to_truthvalue (value_range_t *vr, tree type) +{ + if (TYPE_PRECISION (type) == 1) + set_value_range_to_varying (vr); + else + set_value_range (vr, VR_RANGE, + build_int_cst (type, 0), build_int_cst (type, 1), + vr->equiv); +} + + /* Set value range VR to VR_UNDEFINED. */ static inline void @@ -1439,7 +1453,8 @@ extract_range_from_binary_expr (value_range_t *vr, tree expr) } else { - set_value_range_to_varying (vr); + /* The result of a TRUTH_*_EXPR is always true or false. */ + set_value_range_to_truthvalue (vr, TREE_TYPE (expr)); return; } } @@ -1920,7 +1935,8 @@ extract_range_from_comparison (value_range_t *vr, tree expr) set_value_range (vr, VR_RANGE, val, val, vr->equiv); } else - set_value_range_to_varying (vr); + /* The result of a comparison is always true or false. */ + set_value_range_to_truthvalue (vr, TREE_TYPE (expr)); } @@ -4182,6 +4198,7 @@ vrp_visit_phi_node (tree phi) tree lhs = PHI_RESULT (phi); value_range_t *lhs_vr = get_value_range (lhs); value_range_t vr_result = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL }; + bool all_const = true; copy_value_range (&vr_result, lhs_vr); @@ -4209,7 +4226,10 @@ vrp_visit_phi_node (tree phi) value_range_t vr_arg; if (TREE_CODE (arg) == SSA_NAME) - vr_arg = *(get_value_range (arg)); + { + vr_arg = *(get_value_range (arg)); + all_const = false; + } else { vr_arg.type = VR_RANGE; @@ -4240,7 +4260,8 @@ vrp_visit_phi_node (tree phi) /* To prevent infinite iterations in the algorithm, derive ranges when the new value is slightly bigger or smaller than the previous one. */ - if (lhs_vr->type == VR_RANGE && vr_result.type == VR_RANGE) + if (lhs_vr->type == VR_RANGE && vr_result.type == VR_RANGE + && !all_const) { if (!POINTER_TYPE_P (TREE_TYPE (lhs))) {