builtins.c (expand_builtin_expect_jump): Save pending_stack_adjust and restore it if returning NULL.

* builtins.c (expand_builtin_expect_jump): Save pending_stack_adjust
	and restore it if returning NULL.

	* gcc.dg/20030826-2.c: New test.

From-SVN: r70844
This commit is contained in:
Jakub Jelinek 2003-08-27 12:52:09 +02:00 committed by Jakub Jelinek
parent 648bb15912
commit b7bc76e321
4 changed files with 78 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2003-08-27 Jakub Jelinek <jakub@redhat.com>
* builtins.c (expand_builtin_expect_jump): Save pending_stack_adjust
and restore it if returning NULL.
2003-08-27 Richard Sandiford <rsandifo@redhat.com>
* calls.c (initialize_argument_information): If an argument has no

View File

@ -4330,6 +4330,7 @@ expand_builtin_expect_jump (tree exp, rtx if_false_label, rtx if_true_label)
&& (integer_zerop (arg1) || integer_onep (arg1)))
{
int num_jumps = 0;
int save_pending_stack_adjust = pending_stack_adjust;
rtx insn;
/* If we fail to locate an appropriate conditional jump, we'll
@ -4421,7 +4422,10 @@ expand_builtin_expect_jump (tree exp, rtx if_false_label, rtx if_true_label)
/* If no jumps were modified, fail and do __builtin_expect the normal
way. */
if (num_jumps == 0)
ret = NULL_RTX;
{
ret = NULL_RTX;
pending_stack_adjust = save_pending_stack_adjust;
}
}
return ret;

View File

@ -1,3 +1,7 @@
2003-08-27 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/20030826-2.c: New test.
2003-08-26 Roger Sayle <roger@eyesopen.com>
PR middle-end/12002

View File

@ -0,0 +1,64 @@
/* { dg-do run } */
/* { dg-options "-O2 -fomit-frame-pointer" } */
/* { dg-options "-O2 -fomit-frame-pointer -march=i386" { target i?86-*-* } } */
extern void abort (void);
extern void exit (int);
struct S
{
int *a;
unsigned char *b, c;
};
int u, v, w;
void
foo (unsigned short x)
{
u += x;
}
int
bar (struct S **x, int *y)
{
w += *y;
*y = w + 25;
return 0;
}
int
baz (struct S **x)
{
struct S *y = *x;
unsigned char *a = y->b;
foo (*a);
if (__builtin_expect (y->c != 0 || y->a == &v, 0))
return 1;
if (__builtin_expect (*a == 1, 0))
{
int a, b = bar (x, &a);
if (a)
return b;
}
return 0;
}
int
main (void)
{
struct S a, *b = &a;
unsigned char c;
__builtin_memset (b, 0, sizeof (a));
a.a = &v;
a.b = &c;
if (baz (&b) != 1)
abort ();
exit (0);
}