Commit d2fc7725 by Eric Botcazou Committed by Eric Botcazou

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, or
	when TARGET_FAST_PREFIX is true. Disable promoting when optimizing
	for size.

From-SVN: r64840
parent 9904e232
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, or
when TARGET_FAST_PREFIX is true. Disable promoting when optimizing
for size.
2003-03-24 Kazu Hirata <kazu@cs.umass.edu> 2003-03-24 Kazu Hirata <kazu@cs.umass.edu>
* config/h8300/h8300.md (a peephole2): Extend to support loads * config/h8300/h8300.md (a peephole2): Extend to support loads
......
...@@ -17628,6 +17628,10 @@ ...@@ -17628,6 +17628,10 @@
operands[2] = gen_lowpart (SImode, operands[2]); operands[2] = gen_lowpart (SImode, operands[2]);
PUT_MODE (operands[3], SImode);") 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 (define_split
[(set (reg 17) [(set (reg 17)
(compare (and (match_operand 1 "aligned_operand" "") (compare (and (match_operand 1 "aligned_operand" "")
...@@ -17636,12 +17640,11 @@ ...@@ -17636,12 +17640,11 @@
(set (match_operand 0 "register_operand" "") (set (match_operand 0 "register_operand" "")
(and (match_dup 1) (match_dup 2)))] (and (match_dup 1) (match_dup 2)))]
"! TARGET_PARTIAL_REG_STALL && reload_completed "! TARGET_PARTIAL_REG_STALL && reload_completed
&& ix86_match_ccmode (insn, CCNOmode) /* Ensure that the operand will remain sign-extended immediate. */
&& (GET_MODE (operands[0]) == HImode && ix86_match_ccmode (insn, INTVAL (operands[2]) >= 0 ? CCNOmode : CCZmode)
|| (GET_MODE (operands[0]) == QImode && ! optimize_size
/* Ensure that the operand will remain sign extended immediate. */ && ((GET_MODE (operands[0]) == HImode && ! TARGET_FAST_PREFIX)
&& INTVAL (operands[2]) >= 0 || (GET_MODE (operands[0]) == QImode && TARGET_PROMOTE_QImode))"
&& (TARGET_PROMOTE_QImode || optimize_size)))"
[(parallel [(set (reg:CCNO 17) [(parallel [(set (reg:CCNO 17)
(compare:CCNO (and:SI (match_dup 1) (match_dup 2)) (compare:CCNO (and:SI (match_dup 1) (match_dup 2))
(const_int 0))) (const_int 0)))
...@@ -17654,17 +17657,20 @@ ...@@ -17654,17 +17657,20 @@
operands[0] = gen_lowpart (SImode, operands[0]); operands[0] = gen_lowpart (SImode, operands[0]);
operands[1] = gen_lowpart (SImode, operands[1]);") operands[1] = gen_lowpart (SImode, operands[1]);")
; Don't promote the QImode tests, as i386 don't have encoding of ; Don't promote the QImode tests, as i386 doesn't have encoding of
; the test instruction with 32bit sign extended immediate and thus ; the TEST instruction with 32-bit sign-extended immediate and thus
; the code grows. ; the instruction size would at least double, which is not what we
; want even with ! optimize_size.
(define_split (define_split
[(set (reg 17) [(set (reg 17)
(compare (and (match_operand:HI 0 "aligned_operand" "") (compare (and (match_operand:HI 0 "aligned_operand" "")
(match_operand:HI 1 "const_int_operand" "")) (match_operand:HI 1 "const_int_operand" ""))
(const_int 0)))] (const_int 0)))]
"! TARGET_PARTIAL_REG_STALL && reload_completed "! TARGET_PARTIAL_REG_STALL && reload_completed
&& ix86_match_ccmode (insn, CCNOmode) /* Ensure that the operand will remain sign-extended immediate. */
&& GET_MODE (operands[0]) == HImode" && ix86_match_ccmode (insn, INTVAL (operands[1]) >= 0 ? CCNOmode : CCZmode)
&& ! TARGET_FAST_PREFIX
&& ! optimize_size"
[(set (reg:CCNO 17) [(set (reg:CCNO 17)
(compare:CCNO (and:SI (match_dup 0) (match_dup 1)) (compare:CCNO (and:SI (match_dup 0) (match_dup 1))
(const_int 0)))] (const_int 0)))]
......
2003-03-25 Eric Botcazou <ebotcazou@libertysurf.fr> 2003-03-25 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.dg/i386-signbit-1.c: New test.
* gcc.dg/i386-signbit-2.c: New test.
* gcc.dg/i386-signbit-3.c: New test.
2003-03-25 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.dg/ultrasp5.c: Fix options. * gcc.dg/ultrasp5.c: Fix options.
2003-03-24 Eric Botcazou <ebotcazou@libertysurf.fr> 2003-03-24 Eric Botcazou <ebotcazou@libertysurf.fr>
......
/* PR optimization/8746 */
/* { dg-do run { target i?86-*-* } } */
/* { dg-options "-O1 -mtune=i586" } */
extern void abort (void);
unsigned char r0;
int foo(int x)
{
unsigned char r = x&0xf0;
if (!(r&0x80))
{
r0 = r;
return 0;
}
else
return 1;
}
int main(void)
{
if (foo(0x80) != 1)
abort();
return 0;
}
/* PR optimization/8746 */
/* { dg-do run { target i?86-*-* } } */
/* { dg-options "-O1 -mtune=i586" } */
extern void abort (void);
unsigned short r0;
int foo(int x)
{
unsigned short r = x&0xf000;
if (!(r&0x8000))
{
r0 = r;
return 0;
}
else
return 1;
}
int main(void)
{
if (foo(0x8000) != 1)
abort();
return 0;
}
/* PR optimization/8746 */
/* { dg-do run { target i?86-*-* } } */
/* { dg-options "-O1 -mtune=i586" } */
extern void abort (void);
volatile int j;
void f0() { j=0; }
void f1() { j=1; }
int foo(int x)
{
if ((short int)(x&0x8000) > (short int)0)
{
f0();
return 0;
}
else
{
f1();
return 1;
}
}
int main(void)
{
if (foo(0x8000) != 1)
abort();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment