Module Name:    src
Committed By:   kalvisd
Date:           Sun Sep 29 09:49:05 UTC 2024

Modified Files:
        src/external/gpl3/gcc/dist/gcc: reload.cc

Log Message:
gcc: vax: additional constraints on address reloads

    A reload for the address of an operand's address should not use the
    same register as a reload of an operand's address if the two reloads
    are for different operands

    OK rin@


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/external/gpl3/gcc/dist/gcc/reload.cc

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/dist/gcc/reload.cc
diff -u src/external/gpl3/gcc/dist/gcc/reload.cc:1.2 src/external/gpl3/gcc/dist/gcc/reload.cc:1.3
--- src/external/gpl3/gcc/dist/gcc/reload.cc:1.2	Sun Jul 30 06:15:16 2023
+++ src/external/gpl3/gcc/dist/gcc/reload.cc	Sun Sep 29 09:49:05 2024
@@ -4554,6 +4554,53 @@ find_reloads (rtx_insn *insn, int replac
       }
   }
 
+#if 1
+  /*
+   * Scan the reloads again looking for a case where there is
+   * precisely one RELOAD_FOR_OPERAND_ADDRESS reload and one
+   * RELOAD_FOR_OPADDR_ADDR reload BUT they are for different
+   * operands.  choose_reload_regs assumes that the
+   * RELOAD_FOR_OPADDR_ADDR and RELOAD_FOR_OPERAND_ADDRESS reloads are
+   * a pair operating on the same operand and will choose the same
+   * register for both, which is not what is wanted.
+   */
+  {
+    int need_change = 0;
+    int n_operand_address_reloads = 0,
+      n_opaddr_addr_reloads = 0;
+    int reloadnum_for_operand_address_reload = -1,
+      reloadnum_for_opaddr_addr_reload = -1;
+
+    for (i = 0; i < n_reloads; i++)
+      {
+	switch (rld[i].when_needed)
+	  {
+	  case RELOAD_FOR_OPADDR_ADDR:
+	    n_opaddr_addr_reloads++;
+	    reloadnum_for_opaddr_addr_reload = i;
+	    break;
+	  case RELOAD_FOR_OPERAND_ADDRESS:
+	    n_operand_address_reloads++;
+	    reloadnum_for_operand_address_reload = i;
+	    break;
+	  default:
+	    break;
+	  }
+      }
+    need_change =
+      (n_operand_address_reloads == 1
+       && n_opaddr_addr_reloads == 1
+       && rld[reloadnum_for_opaddr_addr_reload].opnum
+       != rld[reloadnum_for_operand_address_reload].opnum);
+
+    if (need_change)
+      {
+	rld[reloadnum_for_opaddr_addr_reload].when_needed
+	  = RELOAD_FOR_OPERAND_ADDRESS;
+      }
+  }
+#endif
+
   /* See if we have any reloads that are now allowed to be merged
      because we've changed when the reload is needed to
      RELOAD_FOR_OPERAND_ADDRESS or RELOAD_FOR_OTHER_ADDRESS.  Only

Reply via email to