From d2f3ffba9a32449f59973e11b846de08c2683583 Mon Sep 17 00:00:00 2001 From: "James A. Morrison" Date: Fri, 29 Jul 2005 15:22:07 +0000 Subject: [PATCH] tree-vrp.c (compare_range_with_value): Return true or false for ~[VAL_1... 2005-07-29 James A. Morrison * tree-vrp.c (compare_range_with_value): Return true or false for ~[VAL_1, VAL_2] OP VAL if VAL_1 <= VAL <= VAL_2 for NE_EXPR and EQ_EXPR respectively. From-SVN: r102558 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/tree-ssa/vrp19.c | 27 ++++++++++++++++++++++++++ gcc/testsuite/gcc.dg/tree-ssa/vrp20.c | 28 +++++++++++++++++++++++++++ gcc/tree-vrp.c | 5 ++--- 5 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/vrp19.c create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/vrp20.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ef9d11e897c..6ddd4325c68 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-07-29 James A. Morrison + + * tree-vrp.c (compare_range_with_value): Return true or false + for ~[VAL_1, VAL_2] OP VAL if VAL_1 <= VAL <= VAL_2 for NE_EXPR and + EQ_EXPR respectively. + 2005-07-29 Kazu Hirata * cfg.c, tree-complex.c, config/frv/frv.c, config/i386/i386.c: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index acb1606f373..cf45c8aef58 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-07-29 James A. Morrison + + * gcc.dg/tree-ssa/vrp19.c: New test. + * gcc.dg/tree-ssa-vrp20.c: New test. + 2005-07-29 Joseph S. Myers PR c/22240 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp19.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp19.c new file mode 100644 index 00000000000..45a85fafe1b --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp19.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-fwrapv -O1 -ftree-vrp -fdump-tree-vrp" } */ + +#include +extern void abort (); +extern void exit (int); + +int f (int a) { + if (a != INT_MIN) { + a = a > 0 ? a : -a; + if (a < 0) + return 1; + } + return 0; +} + +int g (int b) { + if (b != INT_MIN) { + b = b > 0 ? b : -b; + if (b >= 0) + return 0; + } + return 1; +} +/* { dg-final { scan-tree-dump "Folding predicate a_. < 0 to 0" "vrp" } } */ +/* { dg-final { scan-tree-dump "Folding predicate b_. >= 0 to 1" "vrp" } } */ +/* { dg-final { cleanup-tree-dump "vrp" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp20.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp20.c new file mode 100644 index 00000000000..91c195b3b4d --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp20.c @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-options "-fwrapv -O1 -ftree-vrp -fdump-tree-vrp" } */ + +extern void abort (); +extern void exit (int); + +int f (int a) { + if (a != 0) { + a = a > 0 ? a : -a; + if (a == 0) + return 1; + return 0; + } + return 0; +} + +int g (int b) { + if (b != 0) { + b = b > 0 ? b : -b; + if (b != 0) + return 0; + } + return 1; +} + +/* { dg-final { scan-tree-dump "Folding predicate a_. == 0 to 0" "vrp" } } */ +/* { dg-final { scan-tree-dump "Folding predicate b_. != 0 to 1" "vrp" } } */ +/* { dg-final { cleanup-tree-dump "vrp" } } */ diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 4afe4151a45..68960e547f6 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -1753,9 +1753,8 @@ compare_range_with_value (enum tree_code comp, value_range_t *vr, tree val) || comp == LE_EXPR) return NULL_TREE; - /* ~[VAL, VAL] == VAL is always false. */ - if (compare_values (vr->min, val) == 0 - && compare_values (vr->max, val) == 0) + /* ~[VAL_1, VAL_2] OP VAL is known if VAL_1 <= VAL <= VAL_2. */ + if (value_inside_range (val, vr) == 1) return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node; return NULL_TREE; -- 2.30.2