Module Name: src Committed By: rin Date: Sat Oct 7 12:02:23 UTC 2023
Modified Files: src/external/gpl3/gcc.old/dist/gcc: reload.c Log Message: gcc.old: PR port-vax/57646 patch provided by Kalvis Duckmanton [9/21] 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 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.11 -r1.12 src/external/gpl3/gcc.old/dist/gcc/reload.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/reload.c diff -u src/external/gpl3/gcc.old/dist/gcc/reload.c:1.11 src/external/gpl3/gcc.old/dist/gcc/reload.c:1.12 --- src/external/gpl3/gcc.old/dist/gcc/reload.c:1.11 Mon Feb 20 02:11:07 2023 +++ src/external/gpl3/gcc.old/dist/gcc/reload.c Sat Oct 7 12:02:23 2023 @@ -4529,6 +4529,50 @@ find_reloads (rtx_insn *insn, int replac } } +#if NB_FIX_VAX_BACKEND + /* + * 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 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; + } + } + + if (n_operand_address_reloads == 1 + && n_opaddr_addr_reloads == 1 + && rld[reloadnum_for_opaddr_addr_reload].opnum + != rld[reloadnum_for_operand_address_reload].opnum) + { + 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