[3/3] Tests --
gcc/testsuite/ChangeLog: 2017-07-05 Robin Dapp <rd...@linux.vnet.ibm.com> * gcc.dg/wrapped-binop-simplify-signed-1.c: New test. * gcc.dg/wrapped-binop-simplify-signed-2.c: New test. * gcc.dg/wrapped-binop-simplify-unsigned-1.c: New test. * gcc.dg/wrapped-binop-simplify-unsigned-2.c: New test.
diff --git a/gcc/testsuite/gcc.dg/wrapped-binop-simplify-signed-1.c b/gcc/testsuite/gcc.dg/wrapped-binop-simplify-signed-1.c new file mode 100644 index 0000000..2571a07 --- /dev/null +++ b/gcc/testsuite/gcc.dg/wrapped-binop-simplify-signed-1.c @@ -0,0 +1,65 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-ccp1-details" } */ +/* { dg-final { scan-tree-dump-times "gimple_simplified to" 12 "ccp1" } } */ + +#include <limits.h> + +long foo(int a) +{ + return (long)(a - 2) + 1; +} + +long bar(int a) +{ + return (long)(a + 3) - 1; +} + +long baz(int a) +{ + return (long)(a - 1) + 2; +} + +long baf(int a) +{ + return (long)(a + 1) - 2; +} + +long bak(int a) +{ + return (long)(a + 1) + 3; +} + +long bal(int a) +{ + return (long)(a - 7) - 4; +} + +long bam(int a) +{ + return (long)(a - 1) - INT_MAX; +} + +long bam2(int a) +{ + return (long)(a + 1) + INT_MAX; +} + +long ban(int a) +{ + return (long)(a - 1) + INT_MIN; +} + +long ban2(int a) +{ + return (long)(a + 1) - INT_MIN; +} + +unsigned long baq(int a) +{ + return (unsigned long)(a + 1) - 1; +} + +unsigned long baq2(int a) +{ + return (unsigned long)(a - 2) + 1; +} diff --git a/gcc/testsuite/gcc.dg/wrapped-binop-simplify-signed-2.c b/gcc/testsuite/gcc.dg/wrapped-binop-simplify-signed-2.c new file mode 100644 index 0000000..5c897ba --- /dev/null +++ b/gcc/testsuite/gcc.dg/wrapped-binop-simplify-signed-2.c @@ -0,0 +1,39 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +#include <assert.h> +#include <limits.h> + +int aa = -3; + +__attribute__((noinline)) +long foo (int a) +{ + return (long)(a - INT_MIN) + 1; +} + +__attribute__((noinline)) +long foo2 (int a) +{ + if (a > -10 && a < 10) + return (long)(a + 2) - 1; +} + +__attribute__((noinline)) +long foo3 (int a) +{ + if (a > -10 && a < 10) + return (long)(a) - 3; +} + +int main() +{ + volatile long h = foo (aa); + assert (h == 2147483646); + + volatile long i = foo2 (aa); + assert (i == -2); + + volatile long j = foo3 (aa); + assert (j == -6); +} diff --git a/gcc/testsuite/gcc.dg/wrapped-binop-simplify-unsigned-1.c b/gcc/testsuite/gcc.dg/wrapped-binop-simplify-unsigned-1.c new file mode 100644 index 0000000..04a7ca49 --- /dev/null +++ b/gcc/testsuite/gcc.dg/wrapped-binop-simplify-unsigned-1.c @@ -0,0 +1,43 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-evrp-details -fdump-tree-ccp2-details -fdump-tree-vrp1-details" } */ +/* { dg-final { scan-tree-dump-times "gimple_simplified to" 2 "evrp" } } */ +/* { dg-final { scan-tree-dump-times "Match-and-simplified" 2 "ccp2" } } */ +/* { dg-final { scan-tree-dump-times "gimple_simplified to" 3 "vrp1" } } */ + +#include <limits.h> + +unsigned long oof2(unsigned int a) +{ + if (a > 0) + return (unsigned long)(a - 1) + 1; +} + +unsigned long bah (unsigned int a) +{ + if (a > 0) + return (unsigned long)(a - 1) - 1; +} + +long baq3(unsigned int a) +{ + if (a > 0) + return (long)(a - 1) + 1; +} + +unsigned long bap(unsigned int a) +{ + if (a < UINT_MAX) + return (unsigned long)(a + 1) + ULONG_MAX; +} + +unsigned long bar3(unsigned int a) +{ + if (a < UINT_MAX) + return (unsigned long)(a + 1) - 5; +} + +unsigned long bar4(unsigned int a) +{ + if (a < UINT_MAX) + return (unsigned long)(a + 1) - 6; +} diff --git a/gcc/testsuite/gcc.dg/wrapped-binop-simplify-unsigned-2.c b/gcc/testsuite/gcc.dg/wrapped-binop-simplify-unsigned-2.c new file mode 100644 index 0000000..46290e7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/wrapped-binop-simplify-unsigned-2.c @@ -0,0 +1,125 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +#include <assert.h> +#include <limits.h> + +unsigned int a = 3; +int aa = 3; +int bb = 1; +int cc = 4; +unsigned int dd = 0; +unsigned int ee = 4294967294u; + +__attribute__((noinline)) +unsigned long foo1 (unsigned int a) +{ + return (unsigned long)(UINT_MAX + 1) - 1; +} + +__attribute__((noinline)) +unsigned long foo2 (unsigned int a) +{ + if (a < 4) + return (unsigned long)(a - 4) + 1; +} + +__attribute__((noinline)) +unsigned long foo3 (unsigned int a) +{ + if (a > 2) + return (unsigned long)(a + UINT_MAX - 4) + 2; +} + +__attribute__((noinline)) +unsigned long foo4 (unsigned int a) +{ + if (a > 2) + return (unsigned long)(a - UINT_MAX) + UINT_MAX; +} + +__attribute__((noinline)) +unsigned long foo5 (unsigned int a) +{ + if (a > 2) + return (unsigned long)(a + UINT_MAX) - UINT_MAX; +} + +__attribute__((noinline)) +long foo6 (unsigned int a) +{ + if (a > 2) + return (long)(a - 4) + 1; +} + +__attribute__((noinline)) +long foo7 (unsigned int a) +{ + if (a > 2) + return (long)(a + UINT_MAX) + 1; +} + +__attribute__((noinline)) +unsigned long foo8 (unsigned int a) +{ + if (a < 2) + return (unsigned long)(a + 4294967294u) + 5000000000; +} + +__attribute__((noinline)) +unsigned long foo9 (unsigned int a) +{ + if (a > 2) + return (unsigned long)(a + 4294967294u) + 8000000000; +} + +__attribute__((noinline)) +unsigned long foo10 (unsigned int a) +{ + if (a < 2) + return (unsigned long)(a + 4294967294u) + 2; +} + +__attribute__((noinline)) +unsigned long foo11 (unsigned int a) +{ + if (a > 4294967293u) + return (unsigned long)(a + 2u) + 2; +} + + +int main() +{ + unsigned long b = foo1 (UINT_MAX); + assert (b == 18446744073709551615ul); + + unsigned long c = foo2 (a); + assert (c == 4294967296u); + + unsigned long d = foo3 (a); + assert (d == 4294967296ul); + + unsigned long e = foo4 (a); + assert (e == 4294967299ul); + + unsigned long f = foo5 (a); + assert (f == 18446744069414584323ul); + + long g = foo6 (a); + assert (g == 4294967296ul); + + long h = foo7 (aa); + assert (h == 3); + + unsigned long i = foo8 (bb); + assert (i == 9294967295ul); + + unsigned long j = foo9 (cc); + assert (j == 8000000002); + + unsigned long k = foo10 (dd); + assert (k == 0x100000000); + + unsigned long l = foo11 (ee); + assert (l == 2); +}