i386.c (ix86_expand_int_movcc): If overlap between out and comparison sequence has been detected...

* config/i386/i386.c (ix86_expand_int_movcc): If overlap between
	out and comparison sequence has been detected, put result into
	proper temporary pseudo.

	* gcc.c-torture/execute/20010422-1.c: New test.

From-SVN: r41536
This commit is contained in:
Jakub Jelinek 2001-04-25 11:51:25 +02:00 committed by Jakub Jelinek
parent 6bda7a5e41
commit e99af66bba
4 changed files with 30 additions and 5 deletions

View file

@ -1,3 +1,9 @@
2001-04-25 Jakub Jelinek <jakub@redhat.com>
* config/i386/i386.c (ix86_expand_int_movcc): If overlap between
out and comparison sequence has been detected, put result into
proper temporary pseudo.
2001-04-24 Zack Weinberg <zackw@stanford.edu>
* Makefile.in (LIB2FUNCS): Remove _varargs and __dummy.

View file

@ -6279,7 +6279,7 @@ ix86_expand_int_movcc (operands)
* Size 5 - 8.
*/
if (ct)
emit_insn (gen_addsi3 (out, out, GEN_INT (ct)));
emit_insn (gen_addsi3 (tmp, tmp, GEN_INT (ct)));
}
else if (cf == -1)
{
@ -6290,7 +6290,7 @@ ix86_expand_int_movcc (operands)
*
* Size 8.
*/
emit_insn (gen_iorsi3 (out, out, GEN_INT (ct)));
emit_insn (gen_iorsi3 (tmp, tmp, GEN_INT (ct)));
}
else if (diff == -1 && ct)
{
@ -6304,7 +6304,7 @@ ix86_expand_int_movcc (operands)
*/
emit_insn (gen_one_cmplsi2 (tmp, tmp));
if (cf)
emit_insn (gen_addsi3 (out, out, GEN_INT (cf)));
emit_insn (gen_addsi3 (tmp, tmp, GEN_INT (cf)));
}
else
{
@ -6316,10 +6316,10 @@ ix86_expand_int_movcc (operands)
*
* Size 8 - 11.
*/
emit_insn (gen_andsi3 (out, out, GEN_INT (trunc_int_for_mode
emit_insn (gen_andsi3 (tmp, tmp, GEN_INT (trunc_int_for_mode
(cf - ct, SImode))));
if (ct)
emit_insn (gen_addsi3 (out, out, GEN_INT (ct)));
emit_insn (gen_addsi3 (tmp, tmp, GEN_INT (ct)));
}
if (tmp != out)

View file

@ -1,3 +1,7 @@
2001-04-25 Jakub Jelinek <jakub@redhat.com>
* gcc.c-torture/execute/20010422-1.c: New test.
2001-04-25 Nathan Sidwell <nathan@codesourcery.com>
* g++.old-deja/g++.ns/type2.C: New test.

View file

@ -0,0 +1,15 @@
unsigned int foo(unsigned int x)
{
if (x < 5)
x = 4;
else
x = 8;
return x;
}
int main(void)
{
if (foo (8) != 8)
abort ();
exit (0);
}