Tested on x86_64-unknown-linux-gnu, applied. Richard.
2012-06-14 Richard Guenther <rguent...@suse.de> * gcc.dg/tree-ssa/vrp.h: New testcase. * gcc.dg/tree-ssa/vrp68.c: Likewise. Index: gcc/testsuite/gcc.dg/tree-ssa/vrp.h =================================================================== --- gcc/testsuite/gcc.dg/tree-ssa/vrp.h (revision 0) +++ gcc/testsuite/gcc.dg/tree-ssa/vrp.h (revision 0) @@ -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) Index: gcc/testsuite/gcc.dg/tree-ssa/vrp68.c =================================================================== --- gcc/testsuite/gcc.dg/tree-ssa/vrp68.c (revision 0) +++ gcc/testsuite/gcc.dg/tree-ssa/vrp68.c (revision 0) @@ -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" } } */