From: jakub Date: Tue, 8 Jul 2014 15:39:36 +0000 (+0000) Subject: PR rtl-optimization/61673 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a485453ac17516d74a4fb3dfc29b04408cbfd4cb;p=thirdparty%2Fgcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@212364 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b5ad7bd5a065..19506531bd6a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-07-08 Jakub Jelinek + + 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 * graphite-isl-ast-to-gimple.c (generate_isl_context): diff --git a/gcc/combine.c b/gcc/combine.c index 4e7ef55126e4..08f563897249 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 765eb9f41f3a..83015edd995a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2014-07-08 Jakub Jelinek + 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 000000000000..b3e243da5275 --- /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; +}