aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2014-07-08 17:39:36 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2014-07-08 17:39:36 +0200
commit7e6d8fd9f6f2d3ef1a3c4d439b669b6de574aed9 (patch)
treea31e38df1a632b7487f21d3ab0c13016818f1191
parente4a452b2150b6b19c6e58612111495bef66156b3 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/combine.c2
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr61673.c50
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;
+}