From: Eric Botcazou Date: Tue, 25 Mar 2003 10:42:14 +0000 (+0100) Subject: re PR rtl-optimization/8746 (gcc miscompiles Linux kernel ppa driver on x86) X-Git-Tag: releases/gcc-3.2.3~72 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=64809e79ae12cb1e5cbb7d8d64122c3e6b3dfef2;p=thirdparty%2Fgcc.git re PR rtl-optimization/8746 (gcc miscompiles Linux kernel ppa driver on x86) PR optimization/8746 * config/i386/i386.md (and promoting splitters): Disable HImode to SImode promoting when the sign bit matters and is not preserved. Disable promoting when optimizing for size. From-SVN: r64844 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dd8ef440eee2..19fddbf94cad 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-03-25 Eric Botcazou + + PR optimization/8746 + * config/i386/i386.md (and promoting splitters): Disable HImode to + SImode promoting when the sign bit matters and is not preserved. + Disable promoting when optimizing for size. + 2003-03-23 Eric Botcazou PR optimization/9414 diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 34cd0da1aeea..70ce9598662d 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -16864,6 +16864,10 @@ operands[2] = gen_lowpart (SImode, operands[2]); PUT_MODE (operands[3], SImode);") +; Promote the QImode tests, as i386 has encoding of the AND +; instruction with 32-bit sign-extended immediate and thus the +; instruction size is unchanged, except in the %eax case for +; which it is increased by one byte, hence the ! optimize_size. (define_split [(set (reg 17) (compare (and (match_operand 1 "aligned_operand" "") @@ -16872,12 +16876,11 @@ (set (match_operand 0 "register_operand" "") (and (match_dup 1) (match_dup 2)))] "! TARGET_PARTIAL_REG_STALL && reload_completed - && ix86_match_ccmode (insn, CCNOmode) + /* Ensure that the operand will remain sign-extended immediate. */ + && ix86_match_ccmode (insn, INTVAL (operands[2]) >= 0 ? CCNOmode : CCZmode) + && ! optimize_size && (GET_MODE (operands[0]) == HImode - || (GET_MODE (operands[0]) == QImode - /* Ensure that the operand will remain sign extended immediate. */ - && INTVAL (operands[2]) >= 0 - && (TARGET_PROMOTE_QImode || optimize_size)))" + || (GET_MODE (operands[0]) == QImode && TARGET_PROMOTE_QImode))" [(parallel [(set (reg:CCNO 17) (compare:CCNO (and:SI (match_dup 1) (match_dup 2)) (const_int 0))) @@ -16890,17 +16893,19 @@ operands[0] = gen_lowpart (SImode, operands[0]); operands[1] = gen_lowpart (SImode, operands[1]);") -; Don't promote the QImode tests, as i386 don't have encoding of -; the test instruction with 32bit sign extended immediate and thus -; the code grows. +; Don't promote the QImode tests, as i386 doesn't have encoding of +; the TEST instruction with 32-bit sign-extended immediate and thus +; the instruction size would at least double, which is not what we +; want even with ! optimize_size. (define_split [(set (reg 17) (compare (and (match_operand:HI 0 "aligned_operand" "") (match_operand:HI 1 "const_int_operand" "")) (const_int 0)))] "! TARGET_PARTIAL_REG_STALL && reload_completed - && ix86_match_ccmode (insn, CCNOmode) - && GET_MODE (operands[0]) == HImode" + /* Ensure that the operand will remain sign-extended immediate. */ + && ix86_match_ccmode (insn, INTVAL (operands[1]) >= 0 ? CCNOmode : CCZmode) + && ! optimize_size" [(set (reg:CCNO 17) (compare:CCNO (and:SI (match_dup 0) (match_dup 1)) (const_int 0)))] diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 050c59e8e2ef..98cb57bd00e2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2003-03-25 Eric Botcazou + + * gcc.dg/i386-signbit-1.c: Tweak options. + * gcc.dg/i386-signbit-2.c: New test. + * gcc.dg/i386-signbit-3.c: New test. + 2003-03-24 Jakub Jelinek * g++.dg/opt/rtti1.C: New test. diff --git a/gcc/testsuite/gcc.dg/i386-signbit-1.c b/gcc/testsuite/gcc.dg/i386-signbit-1.c index ef162297dc48..3bdc5906b7a9 100644 --- a/gcc/testsuite/gcc.dg/i386-signbit-1.c +++ b/gcc/testsuite/gcc.dg/i386-signbit-1.c @@ -1,6 +1,6 @@ /* PR optimization/8746 */ -/* { dg-do run } */ -/* { dg-options "-mcpu=i586 -O" { target i?86-*-* } } */ +/* { dg-do run { target i?86-*-* } } */ +/* { dg-options "-O1 -mcpu=i586" } */ extern void abort (void); diff --git a/gcc/testsuite/gcc.dg/i386-signbit-2.c b/gcc/testsuite/gcc.dg/i386-signbit-2.c index 5687d857a077..de1605c35da9 100644 --- a/gcc/testsuite/gcc.dg/i386-signbit-2.c +++ b/gcc/testsuite/gcc.dg/i386-signbit-2.c @@ -1,6 +1,6 @@ /* PR optimization/8746 */ /* { dg-do run { target i?86-*-* } } */ -/* { dg-options "-O1 -mtune=i586" } */ +/* { dg-options "-O1 -mcpu=i586" } */ extern void abort (void); diff --git a/gcc/testsuite/gcc.dg/i386-signbit-3.c b/gcc/testsuite/gcc.dg/i386-signbit-3.c index ae97f2156032..f48908964b18 100644 --- a/gcc/testsuite/gcc.dg/i386-signbit-3.c +++ b/gcc/testsuite/gcc.dg/i386-signbit-3.c @@ -1,6 +1,6 @@ /* PR optimization/8746 */ /* { dg-do run { target i?86-*-* } } */ -/* { dg-options "-O1 -mtune=i586" } */ +/* { dg-options "-O1 -mcpu=i586" } */ extern void abort (void);