http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55940
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|WAITING |NEW
Target Milestone|--- |4.7.3
Summary|Incorrect code for |[4.7/4.8 Regression]
|accessing parameters with |Incorrect code for
|32-bit Intel hosts |accessing parameters with
| |32-bit Intel hosts
--- Comment #11 from Jakub Jelinek <jakub at gcc dot gnu.org> 2013-01-15
17:45:48 UTC ---
Sounds like shrink-wrapping bug to me:
/* { dg-options "-Os" } */
/* { dg-additional-options "-mpreferred-stack-boundary=2" { target { { i?86-*-*
x86_64-*-* } && ia32 } } } */
struct S { int s; unsigned long t; };
__attribute__ ((visibility ("hidden"))) unsigned long long bar (struct S *x,
unsigned long y);
unsigned long long
foo (struct S *x, unsigned long y)
{
unsigned long a;
if (__builtin_expect (((unsigned long) (x) + 0x1000U < 0x2000U), 0))
return ~0ULL;
if (__builtin_expect (x->s <= 0 || x->s > 9, 0))
return ~0ULL;
a = x->t >> 12;
if (y >= a && y == a)
return ~0ULL;
if (x->s == 3)
return x->t + y * 4096;
return bar (x, y);
}
The pre-prologue code can't use registers initialized in the prologue.