This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [RFC] use symbol_ref flags for rs6000
- From: David Edelsohn <dje at watson dot ibm dot com>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: Richard Henderson <rth at redhat dot com>, Janis Johnson <janis187 at us dot ibm dot com>, gcc-patches at gcc dot gnu dot org
- Date: Thu, 01 May 2003 18:17:28 -0400
- Subject: Re: [RFC] use symbol_ref flags for rs6000
>>>>> Jakub Jelinek writes:
Jakub> This line was added by me because of ppc64.
Jakub> If ppc64 backend is fixed, it should be deleted again IMHO.
Yes, and I appreciate your providing the work-around.
If you and Richard agree this is an error that should be fixed in
the backend, the solution is appended. This tests SYMBOL_REF_FUNCTION_P
for patterns which will produce direct calls and explicitly forces an
indirect call when the flag is not set. Is that what you two recommend?
David
Index: rs6000.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.463
diff -c -p -r1.463 rs6000.c
*** rs6000.c 1 May 2003 17:05:17 -0000 1.463
--- rs6000.c 1 May 2003 22:09:11 -0000
*************** symbol_ref_operand (op, mode)
*** 2073,2079 ****
if (mode != VOIDmode && GET_MODE (op) != mode)
return 0;
! return (GET_CODE (op) == SYMBOL_REF);
}
/* Return 1 if the operand, used inside a MEM, is a valid first argument
--- 2073,2079 ----
if (mode != VOIDmode && GET_MODE (op) != mode)
return 0;
! return (GET_CODE (op) == SYMBOL_REF && SYMBOL_REF_FUNCTION_P (op));
}
/* Return 1 if the operand, used inside a MEM, is a valid first argument
*************** current_file_function_operand (op, mode)
*** 2102,2118 ****
rtx op;
enum machine_mode mode ATTRIBUTE_UNUSED;
{
! if (GET_CODE (op) == SYMBOL_REF
! && (SYMBOL_REF_LOCAL_P (op)
! || (op == XEXP (DECL_RTL (current_function_decl), 0))))
! {
! #ifdef ENABLE_CHECKING
! if (!SYMBOL_REF_FUNCTION_P (op))
! abort ();
! #endif
! return 1;
! }
! return 0;
}
/* Return 1 if this operand is a valid input for a move insn. */
--- 2102,2111 ----
rtx op;
enum machine_mode mode ATTRIBUTE_UNUSED;
{
! return (GET_CODE (op) == SYMBOL_REF
! && SYMBOL_REF_FUNCTION_P (op)
! && (SYMBOL_REF_LOCAL_P (op)
! || (op == XEXP (DECL_RTL (current_function_decl), 0))));
}
/* Return 1 if this operand is a valid input for a move insn. */
Index: rs6000.md
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.md,v
retrieving revision 1.250
diff -c -p -r1.250 rs6000.md
*** rs6000.md 1 May 2003 17:05:18 -0000 1.250
--- rs6000.md 1 May 2003 22:09:11 -0000
***************
*** 10089,10094 ****
--- 10180,10186 ----
operands[0] = XEXP (operands[0], 0);
if (GET_CODE (operands[0]) != SYMBOL_REF
+ || !SYMBOL_REF_FUNCTION_P (operands[0])
|| (INTVAL (operands[2]) & CALL_LONG) != 0)
{
if (INTVAL (operands[2]) & CALL_LONG)
***************
*** 10136,10141 ****
--- 10228,10234 ----
operands[1] = XEXP (operands[1], 0);
if (GET_CODE (operands[1]) != SYMBOL_REF
+ || !SYMBOL_REF_FUNCTION_P (operands[1])
|| (INTVAL (operands[3]) & CALL_LONG) != 0)
{
if (INTVAL (operands[3]) & CALL_LONG)