From 9745ab9d97cb007ec9ef43bfe08f33202e91da43 Mon Sep 17 00:00:00 2001 From: rguenth Date: Thu, 14 Jun 2012 09:38:47 +0000 Subject: [PATCH] 2012-06-14 Richard Guenther * gcc.dg/tree-ssa/vrp.h: New testcase. * gcc.dg/tree-ssa/vrp68.c: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@188604 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/tree-ssa/vrp.h | 27 +++++++++++++++++++++++++++ gcc/testsuite/gcc.dg/tree-ssa/vrp68.c | 24 ++++++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/vrp.h create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/vrp68.c diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 74e831447bc..2360767d0e1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-06-14 Richard Guenther + + * gcc.dg/tree-ssa/vrp.h: New testcase. + * gcc.dg/tree-ssa/vrp68.c: Likewise. + 2012-06-13 Christian Bruel PR target/53621 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp.h b/gcc/testsuite/gcc.dg/tree-ssa/vrp.h new file mode 100644 index 00000000000..079013a8101 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp.h @@ -0,0 +1,27 @@ +extern void link_error(void); + +#define RANGE(name, min, max) \ + if (name < min || name > max) \ + return; +#define ANTI_RANGE(name, min, max) \ + if (name >= min && name <= max) \ + return; +#define MERGE(cond, name1, name2) \ + if (cond) \ + name1 = name2; +#define CHECK_RANGE(expr, min, max) \ + do { \ + __typeof__ (expr) v = (expr); \ + if (v < min) link_error(); \ + if (v > max) link_error(); \ + if (v < min || v > max) link_error (); \ + } while (0) +#define CHECK_ANTI_RANGE(expr, min, max) \ + do { \ + __typeof__ (expr) v = (expr); \ + if (v >= min) \ + if (v <= max) \ + link_error(); \ + if (v >= min && v <= max) \ + link_error(); \ + } while (0) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp68.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp68.c new file mode 100644 index 00000000000..291b3763179 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp68.c @@ -0,0 +1,24 @@ +/* { dg-do link } */ +/* { dg-options "-O2 -fdump-tree-vrp1" } */ + +#include "vrp.h" + +void test1 (int i, int j, int b) +{ + RANGE(i, 2, 6); + ANTI_RANGE(j, 1, 7); + MERGE(b, i, j); + CHECK_ANTI_RANGE(i, 7, 7); + CHECK_ANTI_RANGE(i, 1, 1); + /* If we swap the anti-range tests the ~[6, 6] test is never eliminated. */ +} +int main() { } + +/* While subsequent VRP/DOM passes manage to even recognize the ~[6, 6] + test as redundant a single VRP run will arbitrarily choose ~[0, 0] when + merging [1, 5] with ~[0, 6] so the first VRP pass can only eliminate + the ~[0, 0] check as redundant. */ + +/* { dg-final { scan-tree-dump-times "vrp1" 0 "link_error" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "vrp1" 1 "link_error" } } */ +/* { dg-final { cleanup-tree-dump "vrp1" } } */ -- 2.11.4.GIT