From: Jakub Jelinek Date: Wed, 7 May 2014 16:07:21 +0000 (+0200) Subject: backport: re PR target/59101 (integer wrong code bug) X-Git-Tag: releases/gcc-4.7.4~101 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6f3ab47985f39d92652f5da6c11467d0274f3c79;p=thirdparty%2Fgcc.git backport: re PR target/59101 (integer wrong code bug) Backported from mainline 2013-11-14 Jakub Jelinek Uros Bizjak PR target/59101 * config/i386/i386.md (*anddi_2): Only allow CCZmode if operands[2] satisfies_constraint_Z that might have bit 31 set. * gcc.c-torture/execute/pr59101.c: New test. From-SVN: r210176 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 940ed0fb7c06..710550042a11 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,13 @@ 2014-05-07 Jakub Jelinek Backported from mainline + 2013-11-14 Jakub Jelinek + Uros Bizjak + + PR target/59101 + * config/i386/i386.md (*anddi_2): Only allow CCZmode if + operands[2] satisfies_constraint_Z that might have bit 31 set. + 2013-09-30 Jakub Jelinek PR middle-end/58564 diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 9b8a96e428d6..f09717d15a0c 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -7923,7 +7923,18 @@ (const_int 0))) (set (match_operand:DI 0 "nonimmediate_operand" "=r,r,rm") (and:DI (match_dup 1) (match_dup 2)))] - "TARGET_64BIT && ix86_match_ccmode (insn, CCNOmode) + "TARGET_64BIT + && ix86_match_ccmode + (insn, + /* If we are going to emit andl instead of andq, and the operands[2] + constant might have the SImode sign bit set, make sure the sign + flag isn't tested, because the instruction will set the sign flag + based on bit 31 rather than bit 63. If it isn't CONST_INT, + conservatively assume it might have bit 31 set. */ + (satisfies_constraint_Z (operands[2]) + && (!CONST_INT_P (operands[2]) + || val_signbit_known_set_p (SImode, INTVAL (operands[2])))) + ? CCZmode : CCNOmode) && ix86_binary_operator_ok (AND, DImode, operands)" "@ and{l}\t{%k2, %k0|%k0, %k2} diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b28b8ad0dce9..bc5ef8fe3f3d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2014-05-07 Jakub Jelinek Backported from mainline + 2013-11-14 Jakub Jelinek + + PR target/59101 + * gcc.c-torture/execute/pr59101.c: New test. + 2013-09-30 Jakub Jelinek PR middle-end/58564 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr59101.c b/gcc/testsuite/gcc.c-torture/execute/pr59101.c new file mode 100644 index 000000000000..ed6a7e8fa319 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr59101.c @@ -0,0 +1,15 @@ +/* PR target/59101 */ + +__attribute__((noinline, noclone)) int +foo (int a) +{ + return (~a & 4102790424LL) > 0 | 6; +} + +int +main () +{ + if (foo (0) != 7) + __builtin_abort (); + return 0; +}