On 1/17/24 10:03, Mikael Pettersson wrote:
PR110934 is a problem on m68k where -fzero-call-used-regs -fpic ICEs
when clearing an FP register.

The generic code generates an XFmode move of zero to that register,
which becomes an XFmode load from initialized data, which due to -fpic
uses a non-constant address, which the backend rejects.  The
zero-call-used-regs pass runs very late, after register allocation and
frame layout, and at that point we can't allow new uses of the PIC
register or new pseudos.

To clear an FP register on m68k it's enough to do the move in SFmode,
but the generic code can't be told to do that, so this patch updates
m68k to use its own TARGET_ZERO_CALL_USED_REGS.

Bootstrapped and regression tested on m68k-linux-gnu.

Ok for master? (I don't have commit rights.)
We can certainly have new uses of the PIC register after reload. What we can't do is allocate a new scratch register after reload to hold the address of the object from the GOT. It's a subtle difference.

Because we're zeroing call used registers and we only do this at return points, we could (in theory) use one of the call-used address registers as a scratch. Doing that requires (AFAICT) defining the same target hook you're using, so it's not any cleaner from that point of view.



+/* Implement TARGET_ZERO_CALL_USED_REGS.  */
+
+static HARD_REG_SET
+m68k_zero_call_used_regs (HARD_REG_SET need_zeroed_hardregs)
+{
+  rtx zero_fpreg = NULL_RTX;
+
+  for (unsigned int regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
+    if (TEST_HARD_REG_BIT (need_zeroed_hardregs, regno))
+      {
+       rtx reg, zero;
+
+       if (INT_REGNO_P (regno))
+         {
+           reg = regno_reg_rtx[regno];
+           zero = CONST0_RTX (SImode);
+         }
+       else if (FP_REGNO_P (regno))
+         {
+           reg = gen_raw_REG (SFmode, regno);
+           if (zero_fpreg == NULL_RTX)
+             {
+               /* On the 040/060 clearing an FP reg loads a large
+                  immediate.  To reduce code size use the first
+                  cleared FP reg to clear remaing ones.  Don't do
Minor typo.  s/remaing/remaining/

I'll fix that and push the patch to the trunk. It's as clean as other approaches I pondered would likely be.

Jeff

Reply via email to