On Tue, 2023-11-14 at 20:46 +0800, chenglulu wrote:
> 
> 在 2023/11/14 下午5:55, Xi Ruoyao 写道:
> > On Tue, 2023-11-14 at 17:45 +0800, Lulu Cheng wrote:
> > > +      /* When function calls are made through call36, t0 register
> > > will be
> > > +  implicitly modified, so '-fno-ipa-ra' needs to be set
> > > here.  */
> > >         case CMODEL_MEDIUM:
> > > + if (HAVE_AS_SUPPORT_CALL36)
> > > +   opts->x_flag_ipa_ra = 0;
> > > + break;
> > Maybe we can add a (clobber (reg:P 12)) to the related insns
> > instead?
> > 
> Sorry, this was modified in accordance with the call36 macro
> instruction 
> during the test.
> I will use clobber, and add test cases.

There seems a better solution as suggested by the GCC internal doc. 
Section 18.9.16 mentions -fipa-ra:

 -- Target Hook: bool TARGET_CALL_FUSAGE_CONTAINS_NON_CALLEE_CLOBBERS
     Set to true if each call that binds to a local definition
     explicitly clobbers or sets all non-fixed registers modified by
     performing the call.  That is, by the call pattern itself, or by
     code that might be inserted by the linker (e.g. stubs, veneers,
     branch islands), but not including those modifiable by the callee.
     The affected registers may be mentioned explicitly in the call
     pattern, or included as clobbers in CALL_INSN_FUNCTION_USAGE. The
     default version of this hook is set to false.  The purpose of this
     hook is to enable the fipa-ra optimization.

So we can add t0 into CALL_INSN_FUNCTION_USAGE of the call insn, like:

diff --git a/gcc/config/loongarch/loongarch.md 
b/gcc/config/loongarch/loongarch.md
index ea36542b1c3..96e7e98e6b3 100644
--- a/gcc/config/loongarch/loongarch.md
+++ b/gcc/config/loongarch/loongarch.md
@@ -3274,7 +3274,14 @@ (define_expand "sibcall"
                                            XEXP (target, 1),
                                            operands[1]));
   else
-    emit_call_insn (gen_sibcall_internal (target, operands[1]));
+    {
+      rtx call = gen_sibcall_internal (target, operands[1]);
+
+      if (TARGET_CMODEL_MEDIUM && !REG_P (target))
+       clobber_reg (&CALL_INSN_FUNCTION_USAGE (call),
+                    gen_rtx_REG (Pmode, T0_REGNUM));
+      emit_call_insn (call);
+    }
   DONE;
 })

Likewise for sibcall_value.

By the way we'd better have a command line switch to override the build-
time check for assembler call36 support, because it makes writing test
cases and inter-operating with different versions of assembler easier.

-- 
Xi Ruoyao <xry...@xry111.site>
School of Aerospace Science and Technology, Xidian University

Reply via email to