http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55094



Jakub Jelinek <jakub at gcc dot gnu.org> changed:



           What    |Removed                     |Added

----------------------------------------------------------------------------

             Status|UNCONFIRMED                 |NEW

   Last reconfirmed|                            |2012-11-13

                 CC|                            |jakub at gcc dot gnu.org,

                   |                            |rth at gcc dot gnu.org,

                   |                            |vmakarov at gcc dot gnu.org

     Ever Confirmed|0                           |1



--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-11-13 
14:31:11 UTC ---

Doesn't ICE on the trunk anymore since LRA merge, apparently because LRA

decides for some reason to use frame pointer anyway, despite

-fomit-frame-pointer -Os.

CCing Vlad to see why.  Apparently it happens in:

665          if (ep->from_rtx == XEXP (x, 0)

666              || (ep->to_rtx == XEXP (x, 0)

667              && ep->to_rtx != hard_frame_pointer_rtx))

668            setup_can_eliminate (ep, false);

where ep->from_rtx is (frame), ep->to_rtx is (sp) and x is (pre_dec:SI

(reg/f:SI 7 sp)).

Is that intentional?



Anyway, testcase that also ICEs on 4.7 branch is e.g.

extern int puts (const char *);

int x;



int

main (int argc, char **argv)

{

  if (argc)

    {

      puts (argv[0]);

      x = 1;

      __builtin_unreachable ();

    }

  x = 1;

  __builtin_unreachable ();

}

with the same options - similar reason, crossjumping during jump2 crossjumps

bbs with different ARGS_SIZE final depth.  For noreturn calls we've handled it

by adding REG_ARGS_SIZE note on the noreturn call I think, for unconditional

TRAP_IF we perhaps could do the same, but not sure what we can do for

__builtin_unreachable which expands to nothing..., with no outgoing edge from

the bb at all.

Reply via email to