diff options
author | Richard Guenther <rguenther@suse.de> | 2007-04-12 09:20:42 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2007-04-12 09:20:42 +0000 |
commit | 6e734d98206344f9d2469b69bff74685382927bc (patch) | |
tree | 6a12ae390d1e014bc61a7c078a730ae54d85460f | |
parent | 5852948c5b998dc8ddd9073ca68c097b96180838 (diff) | |
download | gcc-6e734d98206344f9d2469b69bff74685382927bc.zip gcc-6e734d98206344f9d2469b69bff74685382927bc.tar.gz gcc-6e734d98206344f9d2469b69bff74685382927bc.tar.bz2 |
re PR tree-optimization/31169 (Bootstrap comparison error at revision 122821)
2007-04-12 Richard Guenther <rguenther@suse.de>
PR tree-optimization/31169
* gcc.c-torture/execute/pr31169.c: New testcase.
From-SVN: r123737
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr31169.c | 51 |
2 files changed, 56 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f431bcb..c5cf4f6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2007-04-12 Richard Guenther <rguenther@suse.de> + PR tree-optimization/31169 + * gcc.c-torture/execute/pr31169.c: New testcase. + +2007-04-12 Richard Guenther <rguenther@suse.de> + PR tree-optimization/24689 PR tree-optimization/31307 * g++.dg/tree-ssa/pr31307.C: New testcase. diff --git a/gcc/testsuite/gcc.c-torture/execute/pr31169.c b/gcc/testsuite/gcc.c-torture/execute/pr31169.c new file mode 100644 index 0000000..447dd45 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr31169.c @@ -0,0 +1,51 @@ +extern void abort(); + +#define HOST_WIDE_INT long +#define HOST_BITS_PER_WIDE_INT (sizeof(long)*8) + +struct tree_type +{ + unsigned int precision : 9; +}; + +int +sign_bit_p (struct tree_type *t, HOST_WIDE_INT val_hi, unsigned HOST_WIDE_INT val_lo) +{ + unsigned HOST_WIDE_INT mask_lo, lo; + HOST_WIDE_INT mask_hi, hi; + int width = t->precision; + + if (width > HOST_BITS_PER_WIDE_INT) + { + hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1); + lo = 0; + + mask_hi = ((unsigned HOST_WIDE_INT) -1 + >> (2 * HOST_BITS_PER_WIDE_INT - width)); + mask_lo = -1; + } + else + { + hi = 0; + lo = (unsigned HOST_WIDE_INT) 1 << (width - 1); + + mask_hi = 0; + mask_lo = ((unsigned HOST_WIDE_INT) -1 + >> (HOST_BITS_PER_WIDE_INT - width)); + } + + if ((val_hi & mask_hi) == hi + && (val_lo & mask_lo) == lo) + return 1; + + return 0; +} + +int main() +{ + struct tree_type t; + t.precision = 1; + if (!sign_bit_p (&t, 0, -1)) + abort (); + return 0; +} |