RESEND: [Patch] fix in storing function return register in a temp when register classes are small
Igor Shevlyakov
igor@windriver.com
Thu May 3 18:46:00 GMT 2001
Hi folks,
I encountered a problem in SH codegeneration which could be fixed by
the patch. And it's correct to have that kind of check in general.
Code I fixed was inserting pseudo reg to hold function return values
if we have SMALL_REGISTER_CLASSES. It was looking for patterns like:
set r0 = call f
set blahh = r0
and changing it to
set ro = call f
set rtemp = r0
set blah = rtemp
But it fails to find a pattern
set r0 = call f
set sp = sp + const
set blahh = r0
So I fixed that:
diff:
Index: egcs/gcc/function.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/function.c,v
retrieving revision 1.264
diff -c -3 -p -r1.264 function.c
*** function.c 2001/04/15 08:37:34 1.264
--- function.c 2001/04/20 02:01:17
*************** fixup_var_refs_insn (insn, var, promoted
*** 1797,1802 ****
--- 1797,1808 ----
&& GET_CODE (PATTERN (insn)) == PARALLEL
&& GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
call_dest = SET_DEST (XVECEXP (PATTERN (insn), 0, 0));
+ call_dest = SET_DEST (XVECEXP (PATTERN (insn), 0, 0));
+ else if (call_dest !=0 && GET_CODE(insn) == INSN &&
+ GET_CODE(PATTERN(insn)) == SET &&
+ GET_CODE (XEXP (PATTERN (insn), 0)) == REG &&
+ REGNO(XEXP (PATTERN (insn), 0)) == STACK_POINTER_REGNUM)
+ ; //keep call_dest since it's set sp = sp + adj
else
call_dest = 0;
}
======================================
ChangeLog:
2001-04-19 Igor Shevlyakov <igor@windriver.com>
* function.c: (fixup_var_refs_insn): Not to stop the search for
usage of function return register on adjusting stack frame after call.
=========================================
Regards,
Igor Shevlyakov
More information about the Gcc-patches
mailing list