This patch has bootstrapped and tested on powerpc64le-unknown-linux-gnu with no regressions. Is this ok for the trunk?
See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48344 for the original problem report. The error resulted because gcc's processing of command-line options within gcc initialization code originally preceded the processing of target-specific configuration hooks.
In the unpatched gcc implementation, the Pmode (pointer mode) variable has not been initialized at the time the -fstack-limit-register command-line option is processed. As a consequence, the stack-limiting register is not assigned a proper mode. Thus, rtl instructions that make use of this stack-limiting register have an unspecified mode, and are therefore not matched by any known instructions.
The fix represented in this patch is to move the invocation of process_options () from within the implementation of do_compile () to immediately preceding the invocation of handle_common_deferred_options () (inside toplev::main ()).
gcc/ChangeLog: 2016-01-14 Kelvin Nilsen <kel...@gcc.gnu.org> * toplev.c (do_compile): remove invocation of process_options () from within do_compile () (toplev::main): insert invocation of process_options () before invocation of handle_common_deferred_options (). gcc/testsuite/ChangeLog: 2016-01-14 Kelvin Nilsen <kel...@gcc.gnu.org> * gcc.target/powerpc/pr48344-1.c: New test.
Index: gcc/testsuite/gcc.target/powerpc/pr48344-1.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/pr48344-1.c (revision 0) +++ gcc/testsuite/gcc.target/powerpc/pr48344-1.c (revision 232633) @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-fstack-limit-register=r2" } */ +void foo () +{ + int N = 2; + int slots[N]; + +} + Index: gcc/toplev.c =================================================================== --- gcc/toplev.c (revision 232135) +++ gcc/toplev.c (working copy) @@ -1938,8 +1938,6 @@ standard_type_bitsize (int bitsize) static void do_compile () { - process_options (); - /* Don't do any more if an error has already occurred. */ if (!seen_error ()) { @@ -2072,6 +2070,11 @@ toplev::main (int argc, char **argv) save_decoded_options, save_decoded_options_count, UNKNOWN_LOCATION, global_dc); + /* process_options() must execute before handle_common_deferred_options() + because handle_common_deferred_options() makes use of variables + initialized by process_options() (e.g. Pmode) */ + process_options (); + handle_common_deferred_options (); init_local_tick ();