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
This commit is contained in:
Eric Botcazou 2003-03-25 11:42:14 +01:00 committed by Eric Botcazou
parent 1f93ec1bbc
commit 64809e79ae
6 changed files with 32 additions and 14 deletions

View File

@ -1,3 +1,10 @@
2003-03-25 Eric Botcazou <ebotcazou@libertysurf.fr>
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 <ebotcazou@libertysurf.fr>
PR optimization/9414

View File

@ -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)))]

View File

@ -1,3 +1,9 @@
2003-03-25 Eric Botcazou <ebotcazou@libertysurf.fr>
* 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 <jakub@redhat.com>
* g++.dg/opt/rtti1.C: New test.

View File

@ -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);

View File

@ -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);

View File

@ -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);