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:
parent
648bb15912
commit
b7bc76e321
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
64
gcc/testsuite/gcc.dg/20030826-2.c
Normal file
64
gcc/testsuite/gcc.dg/20030826-2.c
Normal 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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user