diff options
author | Jakub Jelinek <jakub@redhat.com> | 2014-07-08 17:39:36 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2014-07-08 17:39:36 +0200 |
commit | 7e6d8fd9f6f2d3ef1a3c4d439b669b6de574aed9 (patch) | |
tree | a31e38df1a632b7487f21d3ab0c13016818f1191 | |
parent | e4a452b2150b6b19c6e58612111495bef66156b3 (diff) | |
download | gcc-7e6d8fd9f6f2d3ef1a3c4d439b669b6de574aed9.zip gcc-7e6d8fd9f6f2d3ef1a3c4d439b669b6de574aed9.tar.gz gcc-7e6d8fd9f6f2d3ef1a3c4d439b669b6de574aed9.tar.bz2 |
re PR rtl-optimization/61673 (Miscompilation of _gnutls_hostname_compare on s390)
PR rtl-optimization/61673
* combine.c (simplify_comparison): Test just mode's sign bit
in tmode rather than the sign bit and any bits above it.
* gcc.c-torture/execute/pr61673.c: New test.
From-SVN: r212364
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/combine.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr61673.c | 50 |
4 files changed, 60 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b5ad7bd..1950653 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-07-08 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/61673 + * combine.c (simplify_comparison): Test just mode's sign bit + in tmode rather than the sign bit and any bits above it. + 2014-07-08 Roman Gareev <gareevroman@gmail.com> * graphite-isl-ast-to-gimple.c (generate_isl_context): diff --git a/gcc/combine.c b/gcc/combine.c index 4e7ef55..08f5638 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -11981,7 +11981,7 @@ simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1) = (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1); op0 = simplify_gen_binary (AND, tmode, gen_lowpart (tmode, op0), - gen_int_mode (sign, mode)); + gen_int_mode (sign, tmode)); code = (code == LT) ? NE : EQ; break; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 765eb9f..83015ed 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2014-07-08 Jakub Jelinek <jakub@redhat.com> + PR rtl-optimization/61673 + * gcc.c-torture/execute/pr61673.c: New test. + PR tree-optimization/61725 * gcc.dg/tree-ssa/vrp93.c: New test. * gcc.c-torture/execute/pr61725.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/execute/pr61673.c b/gcc/testsuite/gcc.c-torture/execute/pr61673.c new file mode 100644 index 0000000..b3e243d --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr61673.c @@ -0,0 +1,50 @@ +/* PR rtl-optimization/61673 */ + +char e; + +__attribute__((noinline, noclone)) void +bar (char x) +{ + if (x != 0x54 && x != (char) 0x87) + __builtin_abort (); +} + +__attribute__((noinline, noclone)) void +foo (const char *x) +{ + char d = x[0]; + int c = d; + if ((c >= 0 && c <= 0x7f) == 0) + e = d; + bar (d); +} + +__attribute__((noinline, noclone)) void +baz (const char *x) +{ + char d = x[0]; + int c = d; + if ((c >= 0 && c <= 0x7f) == 0) + e = d; +} + +int +main () +{ + const char c[] = { 0x54, 0x87 }; + e = 0x21; + foo (c); + if (e != 0x21) + __builtin_abort (); + foo (c + 1); + if (e != (char) 0x87) + __builtin_abort (); + e = 0x21; + baz (c); + if (e != 0x21) + __builtin_abort (); + baz (c + 1); + if (e != (char) 0x87) + __builtin_abort (); + return 0; +} |