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.

Reply via email to