[Bug middle-end/23828] local calling convention not used when using -fwhole-program --combine

dann at godzilla dot ics dot uci dot edu gcc-bugzilla@gcc.gnu.org
Tue Sep 13 22:36:00 GMT 2005


------- Additional Comments From dann at godzilla dot ics dot uci dot edu  2005-09-13 22:36 -------
It looks like the -fwhole-program version of ClearLeft only passes the
first 2 arguments to the ClearInLine call in register, the 3rd one is
passed on the stack. 
The reason for that is this code in i386.c:ix86_function_regparm:

   /* We can't use regparm(3) for nested functions as these use
      static chain pointer in third argument.  */
   if (local_regparm == 3 && DECL_CONTEXT (decl)
       && !DECL_NO_STATIC_CHAIN (decl))
	  local_regparm = 2;

The test for nested functions is incorrect, in the -fwhole-program
case DECL_CONTEXT (DECL_for_ClearLeft) is a TRANSLATION_UNIT_DECL so
the test is true even though it should not be.

Changing the code to:

      if (local_regparm == 3
	  && DECL_CONTEXT (decl)
	  && (TREE_CODE (DECL_CONTEXT (decl)) != TRANSLATION_UNIT_DECL)
	  && !DECL_NO_STATIC_CHAIN (decl))
	  local_regparm = 2;

fixes the testcase. 

But the above just fixes the symptoms, it's probably not the correct
way to test for a nested function.


-- 


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



More information about the Gcc-bugs mailing list