Commit b7bc76e3 by Jakub Jelinek Committed by Jakub Jelinek

builtins.c (expand_builtin_expect_jump): Save pending_stack_adjust and restore…

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
parent 648bb159
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;
......
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
......
/* { 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);
}
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