Module Name:    src
Committed By:   rin
Date:           Sat Oct  7 12:00:36 UTC 2023

Modified Files:
        src/external/gpl3/gcc.old/dist/gcc: function.c

Log Message:
gcc.old: PR port-vax/57646 patch provided by Kalvis Duckmanton [6/21]

load the address operand of a SUBREG into a register to allow virtual
registers to be instantiated

XXXRO: Hidden within ``#ifdef NB_FIX_VAX_BACKEND'' and enabled only for
vax at the moment.


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/external/gpl3/gcc.old/dist/gcc/function.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/gpl3/gcc.old/dist/gcc/function.c
diff -u src/external/gpl3/gcc.old/dist/gcc/function.c:1.15 src/external/gpl3/gcc.old/dist/gcc/function.c:1.16
--- src/external/gpl3/gcc.old/dist/gcc/function.c:1.15	Fri Jul 14 19:46:26 2023
+++ src/external/gpl3/gcc.old/dist/gcc/function.c	Sat Oct  7 12:00:35 2023
@@ -1720,6 +1720,27 @@ instantiate_virtual_regs_in_insn (rtx_in
 	  break;
 
 	case SUBREG:
+#ifdef NB_FIX_VAX_BACKEND
+	  if (MEM_P (XEXP (x, 0)))
+	    {
+	      /* convert a subreg of a MEMORY operand into a
+		 register operand */
+	      rtx mx = XEXP (x, 0); /* memory operand */
+	      rtx addr = XEXP (mx, 0);
+	      instantiate_virtual_regs_in_rtx (&addr);
+	      start_sequence ();
+	      mx = replace_equiv_address (mx, addr, true);
+	      addr = force_reg (GET_MODE (addr), addr);
+	      mx = replace_equiv_address (mx, addr, true);
+	      seq = get_insns ();
+	      end_sequence ();
+	      if (seq)
+		emit_insn_before (seq, insn);
+
+	      /* generate a new subreg expression */
+	      x = gen_rtx_SUBREG (GET_MODE (x), mx, SUBREG_BYTE (x));
+	    }
+#endif
 	  new_rtx = instantiate_new_reg (SUBREG_REG (x), &offset);
 	  if (new_rtx == NULL)
 	    continue;
@@ -1822,6 +1843,15 @@ instantiate_decl_rtl (rtx x)
       return;
     }
 
+#ifdef NB_FIX_VAX_BACKEND
+  /* If this is a SUBREG, recurse for the pieces */
+  if (GET_CODE (x) == SUBREG)
+    {
+      instantiate_decl_rtl (XEXP (x, 0));
+      return;
+    }
+#endif
+
   /* If this is not a MEM, no need to do anything.  Similarly if the
      address is a constant or a register that is not a virtual register.  */
   if (!MEM_P (x))

Reply via email to