------- 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