diff mbox

[PATCH/RFC] PR48344: Fix unrecognizable insn error when gcc command line specifies -fstack-limit-register=r2

Message ID 56984CE6.3040307@linux.vnet.ibm.com
State New
Headers show

Commit Message

Kelvin Nilsen Jan. 15, 2016, 1:35 a.m. UTC
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  <kelvin@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  <kelvin@gcc.gnu.org>

     * gcc.dg/pr48344-1.c: New test.
diff mbox

Patch

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 ();
Index: gcc/testsuite/gcc.dg/pr48344-1.c
===================================================================
--- gcc/testsuite/gcc.dg/pr48344-1.c	(revision 0)
+++ gcc/testsuite/gcc.dg/pr48344-1.c	(revision 232374)
@@ -0,0 +1,12 @@ 
+/* specifying stack-limit-register = r2 is only
+   meaningful on certain architectures */
+/* { target { powerpc*-*-* } } */
+/* { dg-do compile } */
+/* { dg-options "-fstack-limit-register=r2" } */
+void foo ()
+{
+  int N = 2;
+  int slots[N];
+
+}
+