aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2025-09-05 11:29:35 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2025-09-05 11:29:35 +0200
commit99e76f7ef469f7b36fc799c5b312bb1364196cc1 (patch)
treea97e223fc9344852ce0e550fd4cff7eff93e874c /gcc
parent8d8b6249d83609e56752ee51d2686b2f5fb062e6 (diff)
downloadgcc-99e76f7ef469f7b36fc799c5b312bb1364196cc1.zip
gcc-99e76f7ef469f7b36fc799c5b312bb1364196cc1.tar.gz
gcc-99e76f7ef469f7b36fc799c5b312bb1364196cc1.tar.bz2
Remove file that shouldn't have been committed.
2025-09-05 Jakub Jelinek <jakub@redhat.com> * J: Remove.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/J1545
1 files changed, 0 insertions, 1545 deletions
diff --git a/gcc/J b/gcc/J
deleted file mode 100644
index 33fba18..0000000
--- a/gcc/J
+++ /dev/null
@@ -1,1545 +0,0 @@
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1) /* Code for RTL register eliminations.
-6441eb6dc020f gcc/lra-eliminations.cc (Jakub Jelinek 2025-01-02 11:59:57 +0100 2) Copyright (C) 2010-2025 Free Software Foundation, Inc.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 3) Contributed by Vladimir Makarov <vmakarov@redhat.com>.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 4)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 5) This file is part of GCC.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 6)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 7) GCC is free software; you can redistribute it and/or modify it under
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 8) the terms of the GNU General Public License as published by the Free
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 9) Software Foundation; either version 3, or (at your option) any later
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 10) version.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 11)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 12) GCC is distributed in the hope that it will be useful, but WITHOUT ANY
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 13) WARRANTY; without even the implied warranty of MERCHANTABILITY or
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 14) FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 15) for more details.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 16)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 17) You should have received a copy of the GNU General Public License
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 18) along with GCC; see the file COPYING3. If not see
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 19) <http://www.gnu.org/licenses/>. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 20)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 21) /* Eliminable registers (like a soft argument or frame pointer) are
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 22) widely used in RTL. These eliminable registers should be replaced
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 23) by real hard registers (like the stack pointer or hard frame
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 24) pointer) plus some offset. The offsets usually change whenever the
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 25) stack is expanded. We know the final offsets only at the very end
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 26) of LRA.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 27)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 28) Within LRA, we usually keep the RTL in such a state that the
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 29) eliminable registers can be replaced by just the corresponding hard
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 30) register (without any offset). To achieve this we should add the
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 31) initial elimination offset at the beginning of LRA and update the
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 32) offsets whenever the stack is expanded. We need to do this before
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 33) every constraint pass because the choice of offset often affects
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 34) whether a particular address or memory constraint is satisfied.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 35)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 36) We keep RTL code at most time in such state that the virtual
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 37) registers can be changed by just the corresponding hard registers
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 38) (with zero offsets) and we have the right RTL code. To achieve this
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 39) we should add initial offset at the beginning of LRA work and update
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 40) offsets after each stack expanding. But actually we update virtual
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 41) registers to the same virtual registers + corresponding offsets
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 42) before every constraint pass because it affects constraint
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 43) satisfaction (e.g. an address displacement became too big for some
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 44) target).
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 45)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 46) The final change of eliminable registers to the corresponding hard
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 47) registers are done at the very end of LRA when there were no change
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 48) in offsets anymore:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 49)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 50) fp + 42 => sp + 42
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 51)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 52) */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 53)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 54) #include "config.h"
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 55) #include "system.h"
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 56) #include "coretypes.h"
-c7131fb2b58ab gcc/lra-eliminations.c (Andrew MacLeod 2015-07-08 00:53:03 +0000 57) #include "backend.h"
-957060b5c5d27 gcc/lra-eliminations.c (Andrew MacLeod 2015-10-29 13:57:32 +0000 58) #include "target.h"
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 59) #include "rtl.h"
-957060b5c5d27 gcc/lra-eliminations.c (Andrew MacLeod 2015-10-29 13:57:32 +0000 60) #include "tree.h"
-c7131fb2b58ab gcc/lra-eliminations.c (Andrew MacLeod 2015-07-08 00:53:03 +0000 61) #include "df.h"
-4d0cdd0ce64e8 gcc/lra-eliminations.c (Thomas Preud'homme 2016-10-13 14:17:52 +0000 62) #include "memmodel.h"
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 63) #include "tm_p.h"
-957060b5c5d27 gcc/lra-eliminations.c (Andrew MacLeod 2015-10-29 13:57:32 +0000 64) #include "optabs.h"
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 65) #include "regs.h"
-957060b5c5d27 gcc/lra-eliminations.c (Andrew MacLeod 2015-10-29 13:57:32 +0000 66) #include "ira.h"
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 67) #include "recog.h"
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 68) #include "output.h"
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 69) #include "rtl-error.h"
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 70) #include "lra-int.h"
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 71)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 72) /* This structure is used to record information about hard register
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 73) eliminations. */
-6c1dae73cd2ce gcc/lra-eliminations.c (Martin Sebor 2019-07-09 16:36:00 +0000 74) class lra_elim_table
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 75) {
-6c1dae73cd2ce gcc/lra-eliminations.c (Martin Sebor 2019-07-09 16:36:00 +0000 76) public:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 77) /* Hard register number to be eliminated. */
-f4eafc3059ff4 gcc/lra-eliminations.c (H.J. Lu 2012-10-29 21:56:35 +0000 78) int from;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 79) /* Hard register number used as replacement. */
-f4eafc3059ff4 gcc/lra-eliminations.c (H.J. Lu 2012-10-29 21:56:35 +0000 80) int to;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 81) /* Difference between values of the two hard registers above on
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 82) previous iteration. */
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 83) poly_int64 previous_offset;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 84) /* Difference between the values on the current iteration. */
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 85) poly_int64 offset;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 86) /* Nonzero if this elimination can be done. */
-f4eafc3059ff4 gcc/lra-eliminations.c (H.J. Lu 2012-10-29 21:56:35 +0000 87) bool can_eliminate;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 88) /* CAN_ELIMINATE since the last check. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 89) bool prev_can_eliminate;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 90) /* REG rtx for the register to be eliminated. We cannot simply
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 91) compare the number since we might then spuriously replace a hard
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 92) register corresponding to a pseudo assigned to the reg to be
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 93) eliminated. */
-f4eafc3059ff4 gcc/lra-eliminations.c (H.J. Lu 2012-10-29 21:56:35 +0000 94) rtx from_rtx;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 95) /* REG rtx for the replacement. */
-f4eafc3059ff4 gcc/lra-eliminations.c (H.J. Lu 2012-10-29 21:56:35 +0000 96) rtx to_rtx;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 97) };
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 98)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 99) /* The elimination table. Each array entry describes one possible way
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 100) of eliminating a register in favor of another. If there is more
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 101) than one way of eliminating a particular register, the most
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 102) preferred should be specified first. */
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 103) static class lra_elim_table *reg_eliminate = 0;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 104)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 105) /* This is an intermediate structure to initialize the table. It has
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 106) exactly the members provided by ELIMINABLE_REGS. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 107) static const struct elim_table_1
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 108) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 109) const int from;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 110) const int to;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 111) } reg_eliminate_1[] =
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 112)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 113) ELIMINABLE_REGS;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 114)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 115) #define NUM_ELIMINABLE_REGS ARRAY_SIZE (reg_eliminate_1)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 116)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 117) /* Print info about elimination table to file F. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 118) static void
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 119) print_elim_table (FILE *f)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 120) {
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 121) class lra_elim_table *ep;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 122)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 123) for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 124) {
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 125) fprintf (f, "%s eliminate %d to %d (offset=",
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 126) ep->can_eliminate ? "Can" : "Can't", ep->from, ep->to);
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 127) print_dec (ep->offset, f);
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 128) fprintf (f, ", prev_offset=");
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 129) print_dec (ep->previous_offset, f);
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 130) fprintf (f, ")\n");
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 131) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 132) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 133)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 134) /* Print info about elimination table to stderr. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 135) void
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 136) lra_debug_elim_table (void)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 137) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 138) print_elim_table (stderr);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 139) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 140)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 141) /* Setup possibility of elimination in elimination table element EP to
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 142) VALUE. Setup FRAME_POINTER_NEEDED if elimination from frame
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 143) pointer to stack pointer is not possible anymore. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 144) static void
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 145) setup_can_eliminate (class lra_elim_table *ep, bool value)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 146) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 147) ep->can_eliminate = ep->prev_can_eliminate = value;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 148) if (! value
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 149) && ep->from == FRAME_POINTER_REGNUM && ep->to == STACK_POINTER_REGNUM)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 150) frame_pointer_needed = 1;
-d303ff9764d32 gcc/lra-eliminations.c (H.J. Lu 2015-02-04 12:02:21 -0800 151) if (!frame_pointer_needed)
-d303ff9764d32 gcc/lra-eliminations.c (H.J. Lu 2015-02-04 12:02:21 -0800 152) REGNO_POINTER_ALIGN (HARD_FRAME_POINTER_REGNUM) = 0;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 153) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 154)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 155) /* Map: eliminable "from" register -> its current elimination,
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 156) or NULL if none. The elimination table may contain more than
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 157) one elimination for the same hard register, but this map specifies
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 158) the one that we are currently using. */
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 159) static class lra_elim_table *elimination_map[FIRST_PSEUDO_REGISTER];
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 160)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 161) /* When an eliminable hard register becomes not eliminable, we use the
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 162) following special structure to restore original offsets for the
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 163) register. */
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 164) static class lra_elim_table self_elim_table;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 165)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 166) /* Offsets should be used to restore original offsets for eliminable
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 167) hard register which just became not eliminable. Zero,
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 168) otherwise. */
-eaa41a6dc127d gcc/lra-eliminations.cc (Richard Sandiford 2023-09-29 17:55:12 +0100 169) static poly_int64 self_elim_offsets[FIRST_PSEUDO_REGISTER];
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 170)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 171) /* Map: hard regno -> RTL presentation. RTL presentations of all
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 172) potentially eliminable hard registers are stored in the map. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 173) static rtx eliminable_reg_rtx[FIRST_PSEUDO_REGISTER];
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 174)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 175) /* Set up ELIMINATION_MAP of the currently used eliminations. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 176) static void
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 177) setup_elimination_map (void)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 178) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 179) int i;
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 180) class lra_elim_table *ep;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 181)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 182) for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 183) elimination_map[i] = NULL;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 184) for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 185) if (ep->can_eliminate && elimination_map[ep->from] == NULL)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 186) elimination_map[ep->from] = ep;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 187) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 188)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 189)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 190)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 191) /* Compute the sum of X and Y, making canonicalizations assumed in an
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 192) address, namely: sum constant integers, surround the sum of two
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 193) constants with a CONST, put the constant as the second operand, and
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 194) group the constant on the outermost sum.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 195)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 196) This routine assumes both inputs are already in canonical form. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 197) static rtx
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 198) form_sum (rtx x, rtx y)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 199) {
-ef4bddc299eae gcc/lra-eliminations.c (Richard Sandiford 2014-10-29 12:02:45 +0000 200) machine_mode mode = GET_MODE (x);
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 201) poly_int64 offset;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 202)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 203) if (mode == VOIDmode)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 204) mode = GET_MODE (y);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 205)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 206) if (mode == VOIDmode)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 207) mode = Pmode;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 208)
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 209) if (poly_int_rtx_p (x, &offset))
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 210) return plus_constant (mode, y, offset);
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 211) else if (poly_int_rtx_p (y, &offset))
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 212) return plus_constant (mode, x, offset);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 213) else if (CONSTANT_P (x))
-4e1952ab19938 gcc/lra-eliminations.c (Kyrylo Tkachov 2015-07-24 16:46:04 +0000 214) std::swap (x, y);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 215)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 216) if (GET_CODE (x) == PLUS && CONSTANT_P (XEXP (x, 1)))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 217) return form_sum (XEXP (x, 0), form_sum (XEXP (x, 1), y));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 218)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 219) /* Note that if the operands of Y are specified in the opposite
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 220) order in the recursive calls below, infinite recursion will
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 221) occur. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 222) if (GET_CODE (y) == PLUS && CONSTANT_P (XEXP (y, 1)))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 223) return form_sum (form_sum (x, XEXP (y, 0)), XEXP (y, 1));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 224)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 225) /* If both constant, encapsulate sum. Otherwise, just form sum. A
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 226) constant will have been placed second. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 227) if (CONSTANT_P (x) && CONSTANT_P (y))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 228) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 229) if (GET_CODE (x) == CONST)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 230) x = XEXP (x, 0);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 231) if (GET_CODE (y) == CONST)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 232) y = XEXP (y, 0);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 233)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 234) return gen_rtx_CONST (VOIDmode, gen_rtx_PLUS (mode, x, y));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 235) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 236)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 237) return gen_rtx_PLUS (mode, x, y);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 238) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 239)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 240) /* Return the current substitution hard register of the elimination of
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 241) HARD_REGNO. If HARD_REGNO is not eliminable, return itself. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 242) int
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 243) lra_get_elimination_hard_regno (int hard_regno)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 244) {
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 245) class lra_elim_table *ep;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 246)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 247) if (hard_regno < 0 || hard_regno >= FIRST_PSEUDO_REGISTER)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 248) return hard_regno;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 249) if ((ep = elimination_map[hard_regno]) == NULL)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 250) return hard_regno;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 251) return ep->to;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 252) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 253)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 254) /* Return elimination which will be used for hard reg REG, NULL
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 255) otherwise. */
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 256) static class lra_elim_table *
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 257) get_elimination (rtx reg)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 258) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 259) int hard_regno;
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 260) class lra_elim_table *ep;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 261)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 262) lra_assert (REG_P (reg));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 263) if ((hard_regno = REGNO (reg)) < 0 || hard_regno >= FIRST_PSEUDO_REGISTER)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 264) return NULL;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 265) if ((ep = elimination_map[hard_regno]) != NULL)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 266) return ep->from_rtx != reg ? NULL : ep;
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 267) poly_int64 offset = self_elim_offsets[hard_regno];
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 268) if (known_eq (offset, 0))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 269) return NULL;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 270) /* This is an iteration to restore offsets just after HARD_REGNO
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 271) stopped to be eliminable. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 272) self_elim_table.from = self_elim_table.to = hard_regno;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 273) self_elim_table.from_rtx
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 274) = self_elim_table.to_rtx
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 275) = eliminable_reg_rtx[hard_regno];
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 276) lra_assert (self_elim_table.from_rtx != NULL);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 277) self_elim_table.offset = offset;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 278) return &self_elim_table;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 279) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 280)
-18c8f1a812865 gcc/lra-eliminations.c (Vladimir Makarov 2015-12-04 19:23:21 +0000 281) /* Transform (subreg (plus reg const)) to (plus (subreg reg) const)
-18c8f1a812865 gcc/lra-eliminations.c (Vladimir Makarov 2015-12-04 19:23:21 +0000 282) when it is possible. Return X or the transformation result if the
-18c8f1a812865 gcc/lra-eliminations.c (Vladimir Makarov 2015-12-04 19:23:21 +0000 283) transformation is done. */
-18c8f1a812865 gcc/lra-eliminations.c (Vladimir Makarov 2015-12-04 19:23:21 +0000 284) static rtx
-18c8f1a812865 gcc/lra-eliminations.c (Vladimir Makarov 2015-12-04 19:23:21 +0000 285) move_plus_up (rtx x)
-18c8f1a812865 gcc/lra-eliminations.c (Vladimir Makarov 2015-12-04 19:23:21 +0000 286) {
-18c8f1a812865 gcc/lra-eliminations.c (Vladimir Makarov 2015-12-04 19:23:21 +0000 287) rtx subreg_reg;
-b8506a8ac0a98 gcc/lra-eliminations.c (Richard Sandiford 2017-07-05 15:29:27 +0000 288) machine_mode x_mode, subreg_reg_mode;
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 289)
-18c8f1a812865 gcc/lra-eliminations.c (Vladimir Makarov 2015-12-04 19:23:21 +0000 290) if (GET_CODE (x) != SUBREG || !subreg_lowpart_p (x))
-18c8f1a812865 gcc/lra-eliminations.c (Vladimir Makarov 2015-12-04 19:23:21 +0000 291) return x;
-18c8f1a812865 gcc/lra-eliminations.c (Vladimir Makarov 2015-12-04 19:23:21 +0000 292) subreg_reg = SUBREG_REG (x);
-18c8f1a812865 gcc/lra-eliminations.c (Vladimir Makarov 2015-12-04 19:23:21 +0000 293) x_mode = GET_MODE (x);
-18c8f1a812865 gcc/lra-eliminations.c (Vladimir Makarov 2015-12-04 19:23:21 +0000 294) subreg_reg_mode = GET_MODE (subreg_reg);
-03a9562184454 gcc/lra-eliminations.c (Richard Sandiford 2017-08-22 16:14:48 +0000 295) if (!paradoxical_subreg_p (x)
-03a9562184454 gcc/lra-eliminations.c (Richard Sandiford 2017-08-22 16:14:48 +0000 296) && GET_CODE (subreg_reg) == PLUS
-cd65ae9071036 gcc/lra-eliminations.c (Jakub Jelinek 2016-01-14 20:57:34 +0100 297) && CONSTANT_P (XEXP (subreg_reg, 1))
-cd65ae9071036 gcc/lra-eliminations.c (Jakub Jelinek 2016-01-14 20:57:34 +0100 298) && GET_MODE_CLASS (x_mode) == MODE_INT
-cd65ae9071036 gcc/lra-eliminations.c (Jakub Jelinek 2016-01-14 20:57:34 +0100 299) && GET_MODE_CLASS (subreg_reg_mode) == MODE_INT)
-26ff85b0b9d79 gcc/lra-eliminations.c (Jakub Jelinek 2016-01-11 20:06:34 +0100 300) {
-26ff85b0b9d79 gcc/lra-eliminations.c (Jakub Jelinek 2016-01-11 20:06:34 +0100 301) rtx cst = simplify_subreg (x_mode, XEXP (subreg_reg, 1), subreg_reg_mode,
-26ff85b0b9d79 gcc/lra-eliminations.c (Jakub Jelinek 2016-01-11 20:06:34 +0100 302) subreg_lowpart_offset (x_mode,
-26ff85b0b9d79 gcc/lra-eliminations.c (Jakub Jelinek 2016-01-11 20:06:34 +0100 303) subreg_reg_mode));
-26ff85b0b9d79 gcc/lra-eliminations.c (Jakub Jelinek 2016-01-11 20:06:34 +0100 304) if (cst && CONSTANT_P (cst))
-da3f2a561649c gcc/lra-eliminations.cc (Richard Sandiford 2025-06-30 08:52:26 +0100 305) {
-da3f2a561649c gcc/lra-eliminations.cc (Richard Sandiford 2025-06-30 08:52:26 +0100 306) rtx lowpart = lowpart_subreg (x_mode, XEXP (subreg_reg, 0),
-da3f2a561649c gcc/lra-eliminations.cc (Richard Sandiford 2025-06-30 08:52:26 +0100 307) subreg_reg_mode);
-da3f2a561649c gcc/lra-eliminations.cc (Richard Sandiford 2025-06-30 08:52:26 +0100 308) if (lowpart)
-da3f2a561649c gcc/lra-eliminations.cc (Richard Sandiford 2025-06-30 08:52:26 +0100 309) return gen_rtx_PLUS (x_mode, lowpart, cst);
-da3f2a561649c gcc/lra-eliminations.cc (Richard Sandiford 2025-06-30 08:52:26 +0100 310) }
-26ff85b0b9d79 gcc/lra-eliminations.c (Jakub Jelinek 2016-01-11 20:06:34 +0100 311) }
-18c8f1a812865 gcc/lra-eliminations.c (Vladimir Makarov 2015-12-04 19:23:21 +0000 312) return x;
-18c8f1a812865 gcc/lra-eliminations.c (Vladimir Makarov 2015-12-04 19:23:21 +0000 313) }
-18c8f1a812865 gcc/lra-eliminations.c (Vladimir Makarov 2015-12-04 19:23:21 +0000 314)
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 315) /* Flag that we already applied nonzero stack pointer elimination
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 316) offset; such sp updates cannot currently be undone. */
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 317) static bool elimination_2sp_occurred_p = false;
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 318)
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 319) /* Take note of any nonzero sp-OFFSET used in eliminations to sp. */
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 320) static inline poly_int64
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 321) note_spoff (poly_int64 offset)
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 322) {
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 323) if (maybe_ne (offset, 0))
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 324) elimination_2sp_occurred_p = true;
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 325) return offset;
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 326) }
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 327)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 328) /* Scan X and replace any eliminable registers (such as fp) with a
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 329) replacement (such as sp) if SUBST_P, plus an offset. The offset is
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 330) a change in the offset between the eliminable register and its
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 331) substitution if UPDATE_P, or the full offset if FULL_P, or
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 332) otherwise zero. If FULL_P, we also use the SP offsets for
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 333) elimination to SP. If UPDATE_P, use UPDATE_SP_OFFSET for updating
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 334) offsets of register elimnable to SP. If UPDATE_SP_OFFSET is
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 335) non-zero, don't use difference of the offset and the previous
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 336) offset.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 337)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 338) MEM_MODE is the mode of an enclosing MEM. We need this to know how
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 339) much to adjust a register for, e.g., PRE_DEC. Also, if we are
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 340) inside a MEM, we are allowed to replace a sum of a hard register
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 341) and the constant zero with the hard register, which we cannot do
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 342) outside a MEM. In addition, we need to record the fact that a
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 343) hard register is referenced outside a MEM.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 344)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 345) If we make full substitution to SP for non-null INSN, add the insn
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 346) sp offset. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 347) rtx
-ef4bddc299eae gcc/lra-eliminations.c (Richard Sandiford 2014-10-29 12:02:45 +0000 348) lra_eliminate_regs_1 (rtx_insn *insn, rtx x, machine_mode mem_mode,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 349) bool subst_p, bool update_p,
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 350) poly_int64 update_sp_offset, bool full_p)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 351) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 352) enum rtx_code code = GET_CODE (x);
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 353) class lra_elim_table *ep;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 354) rtx new_rtx;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 355) int i, j;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 356) const char *fmt;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 357) int copied = 0;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 358)
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 359) lra_assert (!update_p || !full_p);
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 360) lra_assert (known_eq (update_sp_offset, 0)
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 361) || (!subst_p && update_p && !full_p));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 362) if (! current_function_decl)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 363) return x;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 364)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 365) switch (code)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 366) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 367) CASE_CONST_ANY:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 368) case CONST:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 369) case SYMBOL_REF:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 370) case CODE_LABEL:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 371) case PC:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 372) case ASM_INPUT:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 373) case ADDR_VEC:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 374) case ADDR_DIFF_VEC:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 375) case RETURN:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 376) return x;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 377)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 378) case REG:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 379) /* First handle the case where we encounter a bare hard register
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 380) that is eliminable. Replace it with a PLUS. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 381) if ((ep = get_elimination (x)) != NULL)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 382) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 383) rtx to = subst_p ? ep->to_rtx : ep->from_rtx;
-f4eafc3059ff4 gcc/lra-eliminations.c (H.J. Lu 2012-10-29 21:56:35 +0000 384)
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 385) if (maybe_ne (update_sp_offset, 0))
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 386) {
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 387) if (ep->to_rtx == stack_pointer_rtx)
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 388) return plus_constant (Pmode, to, note_spoff (update_sp_offset));
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 389) return to;
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 390) }
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 391) else if (update_p)
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 392) return plus_constant (Pmode, to, ep->offset - ep->previous_offset);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 393) else if (full_p)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 394) return plus_constant (Pmode, to,
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 395) ep->offset
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 396) - (insn != NULL_RTX
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 397) && ep->to_rtx == stack_pointer_rtx
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 398) ? note_spoff (lra_get_insn_recog_data
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 399) (insn)->sp_offset)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 400) : 0));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 401) else
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 402) return to;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 403) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 404) return x;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 405)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 406) case PLUS:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 407) /* If this is the sum of an eliminable register and a constant, rework
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 408) the sum. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 409) if (REG_P (XEXP (x, 0)) && CONSTANT_P (XEXP (x, 1)))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 410) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 411) if ((ep = get_elimination (XEXP (x, 0))) != NULL)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 412) {
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 413) poly_int64 offset, curr_offset;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 414) rtx to = subst_p ? ep->to_rtx : ep->from_rtx;
-f4eafc3059ff4 gcc/lra-eliminations.c (H.J. Lu 2012-10-29 21:56:35 +0000 415)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 416) if (! update_p && ! full_p)
-10d59b802a7db gcc/lra-eliminations.cc (Richard Sandiford 2023-09-07 07:28:50 +0100 417) return simplify_gen_binary (PLUS, Pmode, to, XEXP (x, 1));
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 418)
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 419) if (maybe_ne (update_sp_offset, 0))
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 420) offset = (ep->to_rtx == stack_pointer_rtx
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 421) ? note_spoff (update_sp_offset)
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 422) : 0);
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 423) else
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 424) offset = (update_p
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 425) ? ep->offset - ep->previous_offset : ep->offset);
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 426) if (full_p && insn != NULL_RTX && ep->to_rtx == stack_pointer_rtx)
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 427) offset -= note_spoff (lra_get_insn_recog_data (insn)->sp_offset);
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 428) if (poly_int_rtx_p (XEXP (x, 1), &curr_offset)
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 429) && known_eq (curr_offset, -offset))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 430) return to;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 431) else
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 432) return gen_rtx_PLUS (Pmode, to,
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 433) plus_constant (Pmode,
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 434) XEXP (x, 1), offset));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 435) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 436)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 437) /* If the hard register is not eliminable, we are done since
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 438) the other operand is a constant. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 439) return x;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 440) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 441)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 442) /* If this is part of an address, we want to bring any constant
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 443) to the outermost PLUS. We will do this by doing hard
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 444) register replacement in our operands and seeing if a constant
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 445) shows up in one of them.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 446)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 447) Note that there is no risk of modifying the structure of the
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 448) insn, since we only get called for its operands, thus we are
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 449) either modifying the address inside a MEM, or something like
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 450) an address operand of a load-address insn. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 451)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 452) {
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 453) rtx new0 = lra_eliminate_regs_1 (insn, XEXP (x, 0), mem_mode,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 454) subst_p, update_p,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 455) update_sp_offset, full_p);
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 456) rtx new1 = lra_eliminate_regs_1 (insn, XEXP (x, 1), mem_mode,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 457) subst_p, update_p,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 458) update_sp_offset, full_p);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 459)
-18c8f1a812865 gcc/lra-eliminations.c (Vladimir Makarov 2015-12-04 19:23:21 +0000 460) new0 = move_plus_up (new0);
-18c8f1a812865 gcc/lra-eliminations.c (Vladimir Makarov 2015-12-04 19:23:21 +0000 461) new1 = move_plus_up (new1);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 462) if (new0 != XEXP (x, 0) || new1 != XEXP (x, 1))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 463) return form_sum (new0, new1);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 464) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 465) return x;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 466)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 467) case MULT:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 468) /* If this is the product of an eliminable hard register and a
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 469) constant, apply the distribute law and move the constant out
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 470) so that we have (plus (mult ..) ..). This is needed in order
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 471) to keep load-address insns valid. This case is pathological.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 472) We ignore the possibility of overflow here. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 473) if (REG_P (XEXP (x, 0)) && CONST_INT_P (XEXP (x, 1))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 474) && (ep = get_elimination (XEXP (x, 0))) != NULL)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 475) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 476) rtx to = subst_p ? ep->to_rtx : ep->from_rtx;
-f4eafc3059ff4 gcc/lra-eliminations.c (H.J. Lu 2012-10-29 21:56:35 +0000 477)
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 478) if (maybe_ne (update_sp_offset, 0))
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 479) {
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 480) if (ep->to_rtx == stack_pointer_rtx)
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 481) return plus_constant (Pmode,
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 482) gen_rtx_MULT (Pmode, to, XEXP (x, 1)),
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 483) note_spoff (update_sp_offset)
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 484) * INTVAL (XEXP (x, 1)));
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 485) return gen_rtx_MULT (Pmode, to, XEXP (x, 1));
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 486) }
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 487) else if (update_p)
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 488) return plus_constant (Pmode,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 489) gen_rtx_MULT (Pmode, to, XEXP (x, 1)),
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 490) (ep->offset - ep->previous_offset)
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 491) * INTVAL (XEXP (x, 1)));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 492) else if (full_p)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 493) {
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 494) poly_int64 offset = ep->offset;
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 495)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 496) if (insn != NULL_RTX && ep->to_rtx == stack_pointer_rtx)
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 497) offset -= note_spoff (lra_get_insn_recog_data (insn)->sp_offset);
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 498) return
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 499) plus_constant (Pmode,
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 500) gen_rtx_MULT (Pmode, to, XEXP (x, 1)),
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 501) offset * INTVAL (XEXP (x, 1)));
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 502) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 503) else
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 504) return gen_rtx_MULT (Pmode, to, XEXP (x, 1));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 505) }
-f4eafc3059ff4 gcc/lra-eliminations.c (H.J. Lu 2012-10-29 21:56:35 +0000 506)
-191816a36b90e gcc/lra-eliminations.c (Marek Polacek 2016-08-12 10:30:47 +0000 507) /* fall through */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 508)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 509) case CALL:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 510) case COMPARE:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 511) /* See comments before PLUS about handling MINUS. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 512) case MINUS:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 513) case DIV: case UDIV:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 514) case MOD: case UMOD:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 515) case AND: case IOR: case XOR:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 516) case ROTATERT: case ROTATE:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 517) case ASHIFTRT: case LSHIFTRT: case ASHIFT:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 518) case NE: case EQ:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 519) case GE: case GT: case GEU: case GTU:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 520) case LE: case LT: case LEU: case LTU:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 521) {
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 522) rtx new0 = lra_eliminate_regs_1 (insn, XEXP (x, 0), mem_mode,
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 523) subst_p, update_p,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 524) update_sp_offset, full_p);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 525) rtx new1 = XEXP (x, 1)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 526) ? lra_eliminate_regs_1 (insn, XEXP (x, 1), mem_mode,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 527) subst_p, update_p,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 528) update_sp_offset, full_p) : 0;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 529)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 530) if (new0 != XEXP (x, 0) || new1 != XEXP (x, 1))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 531) return gen_rtx_fmt_ee (code, GET_MODE (x), new0, new1);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 532) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 533) return x;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 534)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 535) case EXPR_LIST:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 536) /* If we have something in XEXP (x, 0), the usual case,
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 537) eliminate it. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 538) if (XEXP (x, 0))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 539) {
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 540) new_rtx = lra_eliminate_regs_1 (insn, XEXP (x, 0), mem_mode,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 541) subst_p, update_p,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 542) update_sp_offset, full_p);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 543) if (new_rtx != XEXP (x, 0))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 544) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 545) /* If this is a REG_DEAD note, it is not valid anymore.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 546) Using the eliminated version could result in creating a
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 547) REG_DEAD note for the stack or frame pointer. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 548) if (REG_NOTE_KIND (x) == REG_DEAD)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 549) return (XEXP (x, 1)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 550) ? lra_eliminate_regs_1 (insn, XEXP (x, 1), mem_mode,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 551) subst_p, update_p,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 552) update_sp_offset, full_p)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 553) : NULL_RTX);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 554)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 555) x = alloc_reg_note (REG_NOTE_KIND (x), new_rtx, XEXP (x, 1));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 556) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 557) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 558)
-191816a36b90e gcc/lra-eliminations.c (Marek Polacek 2016-08-12 10:30:47 +0000 559) /* fall through */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 560)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 561) case INSN_LIST:
-f91aec98e2fe7 gcc/lra-eliminations.c (Richard Sandiford 2013-09-27 11:17:34 +0000 562) case INT_LIST:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 563) /* Now do eliminations in the rest of the chain. If this was
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 564) an EXPR_LIST, this might result in allocating more memory than is
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 565) strictly needed, but it simplifies the code. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 566) if (XEXP (x, 1))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 567) {
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 568) new_rtx = lra_eliminate_regs_1 (insn, XEXP (x, 1), mem_mode,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 569) subst_p, update_p,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 570) update_sp_offset, full_p);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 571) if (new_rtx != XEXP (x, 1))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 572) return
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 573) gen_rtx_fmt_ee (GET_CODE (x), GET_MODE (x),
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 574) XEXP (x, 0), new_rtx);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 575) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 576) return x;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 577)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 578) case PRE_INC:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 579) case POST_INC:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 580) case PRE_DEC:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 581) case POST_DEC:
-ccef9e5dd9ffd gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:27 -0300 582) /* Recurse to adjust elimination offsets in a spilled pseudo. */
-ccef9e5dd9ffd gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:27 -0300 583) if (GET_CODE (XEXP (x, 0)) == MEM)
-ccef9e5dd9ffd gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:27 -0300 584) break;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 585) /* We do not support elimination of a register that is modified.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 586) elimination_effects has already make sure that this does not
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 587) happen. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 588) return x;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 589)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 590) case PRE_MODIFY:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 591) case POST_MODIFY:
-ccef9e5dd9ffd gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:27 -0300 592) /* Recurse to adjust elimination offsets in a spilled pseudo. */
-ccef9e5dd9ffd gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:27 -0300 593) if (GET_CODE (XEXP (x, 0)) == MEM)
-ccef9e5dd9ffd gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:27 -0300 594) break;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 595) /* We do not support elimination of a hard register that is
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 596) modified. LRA has already make sure that this does not
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 597) happen. The only remaining case we need to consider here is
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 598) that the increment value may be an eliminable register. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 599) if (GET_CODE (XEXP (x, 1)) == PLUS
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 600) && XEXP (XEXP (x, 1), 0) == XEXP (x, 0))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 601) {
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 602) rtx new_rtx = lra_eliminate_regs_1 (insn, XEXP (XEXP (x, 1), 1),
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 603) mem_mode, subst_p, update_p,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 604) update_sp_offset, full_p);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 605)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 606) if (new_rtx != XEXP (XEXP (x, 1), 1))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 607) return gen_rtx_fmt_ee (code, GET_MODE (x), XEXP (x, 0),
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 608) gen_rtx_PLUS (GET_MODE (x),
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 609) XEXP (x, 0), new_rtx));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 610) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 611) return x;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 612)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 613) case STRICT_LOW_PART:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 614) case NEG: case NOT:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 615) case SIGN_EXTEND: case ZERO_EXTEND:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 616) case TRUNCATE: case FLOAT_EXTEND: case FLOAT_TRUNCATE:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 617) case FLOAT: case FIX:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 618) case UNSIGNED_FIX: case UNSIGNED_FLOAT:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 619) case ABS:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 620) case SQRT:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 621) case FFS:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 622) case CLZ:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 623) case CTZ:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 624) case POPCOUNT:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 625) case PARITY:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 626) case BSWAP:
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 627) new_rtx = lra_eliminate_regs_1 (insn, XEXP (x, 0), mem_mode,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 628) subst_p, update_p,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 629) update_sp_offset, full_p);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 630) if (new_rtx != XEXP (x, 0))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 631) return gen_rtx_fmt_e (code, GET_MODE (x), new_rtx);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 632) return x;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 633)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 634) case SUBREG:
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 635) new_rtx = lra_eliminate_regs_1 (insn, SUBREG_REG (x), mem_mode,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 636) subst_p, update_p,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 637) update_sp_offset, full_p);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 638)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 639) if (new_rtx != SUBREG_REG (x))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 640) {
-03a9562184454 gcc/lra-eliminations.c (Richard Sandiford 2017-08-22 16:14:48 +0000 641) if (MEM_P (new_rtx) && !paradoxical_subreg_p (x))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 642) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 643) SUBREG_REG (x) = new_rtx;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 644) alter_subreg (&x, false);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 645) return x;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 646) }
-b17ec42d4c8cd gcc/lra-eliminations.c (Vladimir Makarov 2014-05-23 01:52:01 +0000 647) else if (! subst_p)
-b17ec42d4c8cd gcc/lra-eliminations.c (Vladimir Makarov 2014-05-23 01:52:01 +0000 648) {
-b17ec42d4c8cd gcc/lra-eliminations.c (Vladimir Makarov 2014-05-23 01:52:01 +0000 649) /* LRA can transform subregs itself. So don't call
-b17ec42d4c8cd gcc/lra-eliminations.c (Vladimir Makarov 2014-05-23 01:52:01 +0000 650) simplify_gen_subreg until LRA transformations are
-b17ec42d4c8cd gcc/lra-eliminations.c (Vladimir Makarov 2014-05-23 01:52:01 +0000 651) finished. Function simplify_gen_subreg can do
-b17ec42d4c8cd gcc/lra-eliminations.c (Vladimir Makarov 2014-05-23 01:52:01 +0000 652) non-trivial transformations (like truncation) which
-b17ec42d4c8cd gcc/lra-eliminations.c (Vladimir Makarov 2014-05-23 01:52:01 +0000 653) might make LRA work to fail. */
-b17ec42d4c8cd gcc/lra-eliminations.c (Vladimir Makarov 2014-05-23 01:52:01 +0000 654) SUBREG_REG (x) = new_rtx;
-b17ec42d4c8cd gcc/lra-eliminations.c (Vladimir Makarov 2014-05-23 01:52:01 +0000 655) return x;
-b17ec42d4c8cd gcc/lra-eliminations.c (Vladimir Makarov 2014-05-23 01:52:01 +0000 656) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 657) else
-baa061be44ee3 gcc/lra-eliminations.c (Richard Sandiford 2012-10-30 14:33:48 +0000 658) return simplify_gen_subreg (GET_MODE (x), new_rtx,
-baa061be44ee3 gcc/lra-eliminations.c (Richard Sandiford 2012-10-30 14:33:48 +0000 659) GET_MODE (new_rtx), SUBREG_BYTE (x));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 660) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 661)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 662) return x;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 663)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 664) case MEM:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 665) /* Our only special processing is to pass the mode of the MEM to our
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 666) recursive call and copy the flags. While we are here, handle this
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 667) case more efficiently. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 668) return
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 669) replace_equiv_address_nv
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 670) (x,
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 671) lra_eliminate_regs_1 (insn, XEXP (x, 0), GET_MODE (x),
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 672) subst_p, update_p, update_sp_offset, full_p));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 673)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 674) case USE:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 675) /* Handle insn_list USE that a call to a pure function may generate. */
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 676) new_rtx = lra_eliminate_regs_1 (insn, XEXP (x, 0), VOIDmode,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 677) subst_p, update_p, update_sp_offset, full_p);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 678) if (new_rtx != XEXP (x, 0))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 679) return gen_rtx_USE (GET_MODE (x), new_rtx);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 680) return x;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 681)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 682) case CLOBBER:
-48cb51827c9eb gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-12-08 15:37:42 -0500 683) case ASM_OPERANDS:
-48cb51827c9eb gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-12-08 15:37:42 -0500 684) gcc_assert (insn && DEBUG_INSN_P (insn));
-48cb51827c9eb gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-12-08 15:37:42 -0500 685) break;
-48cb51827c9eb gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-12-08 15:37:42 -0500 686)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 687) case SET:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 688) gcc_unreachable ();
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 689)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 690) default:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 691) break;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 692) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 693)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 694) /* Process each of our operands recursively. If any have changed, make a
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 695) copy of the rtx. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 696) fmt = GET_RTX_FORMAT (code);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 697) for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 698) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 699) if (*fmt == 'e')
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 700) {
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 701) new_rtx = lra_eliminate_regs_1 (insn, XEXP (x, i), mem_mode,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 702) subst_p, update_p,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 703) update_sp_offset, full_p);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 704) if (new_rtx != XEXP (x, i) && ! copied)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 705) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 706) x = shallow_copy_rtx (x);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 707) copied = 1;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 708) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 709) XEXP (x, i) = new_rtx;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 710) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 711) else if (*fmt == 'E')
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 712) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 713) int copied_vec = 0;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 714) for (j = 0; j < XVECLEN (x, i); j++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 715) {
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 716) new_rtx = lra_eliminate_regs_1 (insn, XVECEXP (x, i, j), mem_mode,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 717) subst_p, update_p,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 718) update_sp_offset, full_p);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 719) if (new_rtx != XVECEXP (x, i, j) && ! copied_vec)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 720) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 721) rtvec new_v = gen_rtvec_v (XVECLEN (x, i),
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 722) XVEC (x, i)->elem);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 723) if (! copied)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 724) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 725) x = shallow_copy_rtx (x);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 726) copied = 1;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 727) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 728) XVEC (x, i) = new_v;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 729) copied_vec = 1;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 730) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 731) XVECEXP (x, i, j) = new_rtx;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 732) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 733) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 734) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 735)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 736) return x;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 737) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 738)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 739) /* This function is used externally in subsequent passes of GCC. It
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 740) always does a full elimination of X. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 741) rtx
-ef4bddc299eae gcc/lra-eliminations.c (Richard Sandiford 2014-10-29 12:02:45 +0000 742) lra_eliminate_regs (rtx x, machine_mode mem_mode,
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 743) rtx insn ATTRIBUTE_UNUSED)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 744) {
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 745) return lra_eliminate_regs_1 (NULL, x, mem_mode, true, false, 0, true);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 746) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 747)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 748) /* Stack pointer offset before the current insn relative to one at the
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 749) func start. RTL insns can change SP explicitly. We keep the
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 750) changes from one insn to another through this variable. */
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 751) static poly_int64 curr_sp_change;
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 752)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 753) /* Scan rtx X for references to elimination source or target registers
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 754) in contexts that would prevent the elimination from happening.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 755) Update the table of eliminables to reflect the changed state.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 756) MEM_MODE is the mode of an enclosing MEM rtx, or VOIDmode if not
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 757) within a MEM. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 758) static void
-ef4bddc299eae gcc/lra-eliminations.c (Richard Sandiford 2014-10-29 12:02:45 +0000 759) mark_not_eliminable (rtx x, machine_mode mem_mode)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 760) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 761) enum rtx_code code = GET_CODE (x);
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 762) class lra_elim_table *ep;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 763) int i, j;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 764) const char *fmt;
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 765) poly_int64 offset = 0;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 766)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 767) switch (code)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 768) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 769) case PRE_INC:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 770) case POST_INC:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 771) case PRE_DEC:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 772) case POST_DEC:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 773) case POST_MODIFY:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 774) case PRE_MODIFY:
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 775) if (XEXP (x, 0) == stack_pointer_rtx
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 776) && ((code != PRE_MODIFY && code != POST_MODIFY)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 777) || (GET_CODE (XEXP (x, 1)) == PLUS
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 778) && XEXP (x, 0) == XEXP (XEXP (x, 1), 0)
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 779) && poly_int_rtx_p (XEXP (XEXP (x, 1), 1), &offset))))
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 780) {
-7b4df2bf95d22 gcc/lra-eliminations.c (Richard Sandiford 2018-01-03 07:18:13 +0000 781) poly_int64 size = GET_MODE_SIZE (mem_mode);
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 782)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 783) #ifdef PUSH_ROUNDING
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 784) /* If more bytes than MEM_MODE are pushed, account for
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 785) them. */
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 786) size = PUSH_ROUNDING (size);
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 787) #endif
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 788) if (code == PRE_DEC || code == POST_DEC)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 789) curr_sp_change -= size;
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 790) else if (code == PRE_INC || code == POST_INC)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 791) curr_sp_change += size;
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 792) else if (code == PRE_MODIFY || code == POST_MODIFY)
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 793) curr_sp_change += offset;
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 794) }
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 795) else if (REG_P (XEXP (x, 0))
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 796) && REGNO (XEXP (x, 0)) >= FIRST_PSEUDO_REGISTER)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 797) {
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 798) /* If we modify the source of an elimination rule, disable
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 799) it. Do the same if it is the destination and not the
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 800) hard frame register. */
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 801) for (ep = reg_eliminate;
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 802) ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 803) ep++)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 804) if (ep->from_rtx == XEXP (x, 0)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 805) || (ep->to_rtx == XEXP (x, 0)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 806) && ep->to_rtx != hard_frame_pointer_rtx))
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 807) setup_can_eliminate (ep, false);
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 808) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 809) return;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 810)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 811) case USE:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 812) if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 813) /* If using a hard register that is the source of an eliminate
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 814) we still think can be performed, note it cannot be
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 815) performed since we don't know how this hard register is
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 816) used. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 817) for (ep = reg_eliminate;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 818) ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 819) ep++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 820) if (ep->from_rtx == XEXP (x, 0)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 821) && ep->to_rtx != hard_frame_pointer_rtx)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 822) setup_can_eliminate (ep, false);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 823) return;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 824)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 825) case CLOBBER:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 826) if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 827) /* If clobbering a hard register that is the replacement
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 828) register for an elimination we still think can be
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 829) performed, note that it cannot be performed. Otherwise, we
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 830) need not be concerned about it. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 831) for (ep = reg_eliminate;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 832) ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 833) ep++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 834) if (ep->to_rtx == XEXP (x, 0)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 835) && ep->to_rtx != hard_frame_pointer_rtx)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 836) setup_can_eliminate (ep, false);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 837) return;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 838)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 839) case SET:
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 840) if (SET_DEST (x) == stack_pointer_rtx
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 841) && GET_CODE (SET_SRC (x)) == PLUS
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 842) && XEXP (SET_SRC (x), 0) == SET_DEST (x)
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 843) && poly_int_rtx_p (XEXP (SET_SRC (x), 1), &offset))
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 844) {
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 845) curr_sp_change += offset;
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 846) return;
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 847) }
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 848) if (! REG_P (SET_DEST (x))
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 849) || REGNO (SET_DEST (x)) >= FIRST_PSEUDO_REGISTER)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 850) mark_not_eliminable (SET_DEST (x), mem_mode);
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 851) else
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 852) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 853) /* See if this is setting the replacement hard register for
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 854) an elimination.
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 855)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 856) If DEST is the hard frame pointer, we do nothing because
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 857) we assume that all assignments to the frame pointer are
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 858) for non-local gotos and are being done at a time when
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 859) they are valid and do not disturb anything else. Some
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 860) machines want to eliminate a fake argument pointer (or
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 861) even a fake frame pointer) with either the real frame
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 862) pointer or the stack pointer. Assignments to the hard
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 863) frame pointer must not prevent this elimination. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 864) for (ep = reg_eliminate;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 865) ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 866) ep++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 867) if (ep->to_rtx == SET_DEST (x)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 868) && SET_DEST (x) != hard_frame_pointer_rtx)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 869) setup_can_eliminate (ep, false);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 870) }
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 871)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 872) mark_not_eliminable (SET_SRC (x), mem_mode);
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 873) return;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 874)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 875) case MEM:
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 876) /* Our only special processing is to pass the mode of the MEM to
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 877) our recursive call. */
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 878) mark_not_eliminable (XEXP (x, 0), GET_MODE (x));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 879) return;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 880)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 881) default:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 882) break;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 883) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 884)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 885) fmt = GET_RTX_FORMAT (code);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 886) for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 887) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 888) if (*fmt == 'e')
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 889) mark_not_eliminable (XEXP (x, i), mem_mode);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 890) else if (*fmt == 'E')
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 891) for (j = 0; j < XVECLEN (x, i); j++)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 892) mark_not_eliminable (XVECEXP (x, i, j), mem_mode);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 893) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 894) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 895)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 896)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 897)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 898) /* Scan INSN and eliminate all eliminable hard registers in it.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 899)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 900) If REPLACE_P is true, do the replacement destructively. Also
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 901) delete the insn as dead it if it is setting an eliminable register.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 902)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 903) If REPLACE_P is false, just update the offsets while keeping the
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 904) base register the same. If FIRST_P, use the sp offset for
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 905) elimination to sp. Otherwise, use UPDATE_SP_OFFSET for this. If
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 906) UPDATE_SP_OFFSET is non-zero, don't use difference of the offset
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 907) and the previous offset. Attach the note about used elimination
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 908) for insns setting frame pointer to update elimination easy (without
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 909) parsing already generated elimination insns to find offset
-a6af1bf9fe2f7 gcc/lra-eliminations.c (Vladimir Makarov 2015-04-19 23:48:24 +0000 910) previously used) in future. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 911)
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 912) void
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 913) eliminate_regs_in_insn (rtx_insn *insn, bool replace_p, bool first_p,
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 914) poly_int64 update_sp_offset)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 915) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 916) int icode = recog_memoized (insn);
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 917) rtx set, old_set = single_set (insn);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 918) bool validate_p;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 919) int i;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 920) rtx substed_operand[MAX_RECOG_OPERANDS];
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 921) rtx orig_operand[MAX_RECOG_OPERANDS];
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 922) class lra_elim_table *ep;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 923) rtx plus_src, plus_cst_src;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 924) lra_insn_recog_data_t id;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 925) struct lra_static_insn_data *static_id;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 926)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 927) if (icode < 0 && asm_noperands (PATTERN (insn)) < 0 && ! DEBUG_INSN_P (insn))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 928) {
-397186076bb72 gcc/lra-eliminations.c (Steven Bosscher 2013-03-30 14:26:42 +0000 929) lra_assert (GET_CODE (PATTERN (insn)) == USE
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 930) || GET_CODE (PATTERN (insn)) == CLOBBER
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 931) || GET_CODE (PATTERN (insn)) == ASM_INPUT);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 932) return;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 933) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 934)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 935) /* We allow one special case which happens to work on all machines we
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 936) currently support: a single set with the source or a REG_EQUAL
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 937) note being a PLUS of an eliminable register and a constant. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 938) plus_src = plus_cst_src = 0;
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 939) poly_int64 offset = 0;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 940) if (old_set && REG_P (SET_DEST (old_set)))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 941) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 942) if (GET_CODE (SET_SRC (old_set)) == PLUS)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 943) plus_src = SET_SRC (old_set);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 944) /* First see if the source is of the form (plus (...) CST). */
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 945) if (plus_src && poly_int_rtx_p (XEXP (plus_src, 1), &offset))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 946) plus_cst_src = plus_src;
-6619b3d4c15cd gcc/lra-eliminations.cc (Jivan Hakobyan 2023-08-23 14:10:30 -0600 947) /* If we are doing initial offset computation, then utilize
-6619b3d4c15cd gcc/lra-eliminations.cc (Jivan Hakobyan 2023-08-23 14:10:30 -0600 948) eqivalences to discover a constant for the second term
-6619b3d4c15cd gcc/lra-eliminations.cc (Jivan Hakobyan 2023-08-23 14:10:30 -0600 949) of PLUS_SRC. */
-6619b3d4c15cd gcc/lra-eliminations.cc (Jivan Hakobyan 2023-08-23 14:10:30 -0600 950) else if (plus_src && REG_P (XEXP (plus_src, 1)))
-6619b3d4c15cd gcc/lra-eliminations.cc (Jivan Hakobyan 2023-08-23 14:10:30 -0600 951) {
-6619b3d4c15cd gcc/lra-eliminations.cc (Jivan Hakobyan 2023-08-23 14:10:30 -0600 952) int regno = REGNO (XEXP (plus_src, 1));
-6619b3d4c15cd gcc/lra-eliminations.cc (Jivan Hakobyan 2023-08-23 14:10:30 -0600 953) if (regno < ira_reg_equiv_len
-6619b3d4c15cd gcc/lra-eliminations.cc (Jivan Hakobyan 2023-08-23 14:10:30 -0600 954) && ira_reg_equiv[regno].constant != NULL_RTX
-6619b3d4c15cd gcc/lra-eliminations.cc (Jivan Hakobyan 2023-08-23 14:10:30 -0600 955) && !replace_p
-6619b3d4c15cd gcc/lra-eliminations.cc (Jivan Hakobyan 2023-08-23 14:10:30 -0600 956) && poly_int_rtx_p (ira_reg_equiv[regno].constant, &offset))
-6619b3d4c15cd gcc/lra-eliminations.cc (Jivan Hakobyan 2023-08-23 14:10:30 -0600 957) plus_cst_src = plus_src;
-6619b3d4c15cd gcc/lra-eliminations.cc (Jivan Hakobyan 2023-08-23 14:10:30 -0600 958) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 959) /* Check that the first operand of the PLUS is a hard reg or
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 960) the lowpart subreg of one. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 961) if (plus_cst_src)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 962) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 963) rtx reg = XEXP (plus_cst_src, 0);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 964)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 965) if (GET_CODE (reg) == SUBREG && subreg_lowpart_p (reg))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 966) reg = SUBREG_REG (reg);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 967)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 968) if (!REG_P (reg) || REGNO (reg) >= FIRST_PSEUDO_REGISTER)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 969) plus_cst_src = 0;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 970) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 971) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 972) if (plus_cst_src)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 973) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 974) rtx reg = XEXP (plus_cst_src, 0);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 975)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 976) if (GET_CODE (reg) == SUBREG)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 977) reg = SUBREG_REG (reg);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 978)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 979) if (REG_P (reg) && (ep = get_elimination (reg)) != NULL)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 980) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 981) rtx to_rtx = replace_p ? ep->to_rtx : ep->from_rtx;
-f4eafc3059ff4 gcc/lra-eliminations.c (H.J. Lu 2012-10-29 21:56:35 +0000 982)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 983) if (! replace_p)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 984) {
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 985) if (known_eq (update_sp_offset, 0))
-542773888190e gcc/lra-eliminations.cc (Michael Matz 2024-08-22 17:09:11 +0200 986) offset += (!first_p
-542773888190e gcc/lra-eliminations.cc (Michael Matz 2024-08-22 17:09:11 +0200 987) ? ep->offset - ep->previous_offset : ep->offset);
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 988) if (ep->to_rtx == stack_pointer_rtx)
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 989) {
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 990) if (first_p)
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 991) offset -= lra_get_insn_recog_data (insn)->sp_offset;
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 992) else
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 993) offset += update_sp_offset;
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 994) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 995) offset = trunc_int_for_mode (offset, GET_MODE (plus_cst_src));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 996) }
-f4eafc3059ff4 gcc/lra-eliminations.c (H.J. Lu 2012-10-29 21:56:35 +0000 997)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 998) if (GET_CODE (XEXP (plus_cst_src, 0)) == SUBREG)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 999) to_rtx = gen_lowpart (GET_MODE (XEXP (plus_cst_src, 0)), to_rtx);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1000) /* If we have a nonzero offset, and the source is already a
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1001) simple REG, the following transformation would increase
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1002) the cost of the insn by replacing a simple REG with (plus
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1003) (reg sp) CST). So try only when we already had a PLUS
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1004) before. */
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 1005) if (known_eq (offset, 0) || plus_src)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1006) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1007) rtx new_src = plus_constant (GET_MODE (to_rtx), to_rtx, offset);
-f4eafc3059ff4 gcc/lra-eliminations.c (H.J. Lu 2012-10-29 21:56:35 +0000 1008)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1009) old_set = single_set (insn);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1010)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1011) /* First see if this insn remains valid when we make the
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1012) change. If not, try to replace the whole pattern
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1013) with a simple set (this may help if the original insn
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1014) was a PARALLEL that was only recognized as single_set
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1015) due to REG_UNUSED notes). If this isn't valid
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1016) either, keep the INSN_CODE the same and let the
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1017) constraint pass fix it up. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1018) if (! validate_change (insn, &SET_SRC (old_set), new_src, 0))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1019) {
-f7df4a840c478 gcc/lra-eliminations.c (Richard Sandiford 2015-05-07 16:58:46 +0000 1020) rtx new_pat = gen_rtx_SET (SET_DEST (old_set), new_src);
-f4eafc3059ff4 gcc/lra-eliminations.c (H.J. Lu 2012-10-29 21:56:35 +0000 1021)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1022) if (! validate_change (insn, &PATTERN (insn), new_pat, 0))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1023) SET_SRC (old_set) = new_src;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1024) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1025) lra_update_insn_recog_data (insn);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1026) /* This can't have an effect on elimination offsets, so skip
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1027) right to the end. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1028) return;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1029) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1030) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1031) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1032)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1033) /* Eliminate all eliminable registers occurring in operands that
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1034) can be handled by the constraint pass. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1035) id = lra_get_insn_recog_data (insn);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1036) static_id = id->insn_static_data;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1037) validate_p = false;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1038) for (i = 0; i < static_id->n_operands; i++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1039) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1040) orig_operand[i] = *id->operand_loc[i];
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1041) substed_operand[i] = *id->operand_loc[i];
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1042)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1043) /* For an asm statement, every operand is eliminable. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1044) if (icode < 0 || insn_data[icode].operand[i].eliminable)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1045) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1046) /* Check for setting a hard register that we know about. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1047) if (static_id->operand[i].type != OP_IN
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1048) && REG_P (orig_operand[i]))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1049) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1050) /* If we are assigning to a hard register that can be
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1051) eliminated, it must be as part of a PARALLEL, since
-67914693144c0 gcc/lra-eliminations.c (Sandra Loosemore 2019-01-09 16:37:45 -0500 1052) the code above handles single SETs. This reg cannot
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1053) be longer eliminated -- it is forced by
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1054) mark_not_eliminable. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1055) for (ep = reg_eliminate;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1056) ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1057) ep++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1058) lra_assert (ep->from_rtx != orig_operand[i]
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1059) || ! ep->can_eliminate);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1060) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1061)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1062) /* Companion to the above plus substitution, we can allow
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1063) invariants as the source of a plain move. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1064) substed_operand[i]
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1065) = lra_eliminate_regs_1 (insn, *id->operand_loc[i], VOIDmode,
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1066) replace_p, ! replace_p && ! first_p,
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 1067) update_sp_offset, first_p);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1068) if (substed_operand[i] != orig_operand[i])
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1069) validate_p = true;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1070) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1071) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1072)
-2c62cbaaf13c7 gcc/lra-eliminations.c (Vladimir Makarov 2013-04-26 18:11:35 +0000 1073) if (! validate_p)
-2c62cbaaf13c7 gcc/lra-eliminations.c (Vladimir Makarov 2013-04-26 18:11:35 +0000 1074) return;
-2c62cbaaf13c7 gcc/lra-eliminations.c (Vladimir Makarov 2013-04-26 18:11:35 +0000 1075)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1076) /* Substitute the operands; the new values are in the substed_operand
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1077) array. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1078) for (i = 0; i < static_id->n_operands; i++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1079) *id->operand_loc[i] = substed_operand[i];
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1080) for (i = 0; i < static_id->n_dups; i++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1081) *id->dup_loc[i] = substed_operand[(int) static_id->dup_num[i]];
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1082)
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1083) /* Transform plus (plus (hard reg, const), pseudo) to plus (plus (pseudo,
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1084) const), hard reg) in order to keep insn containing eliminated register
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1085) after all reloads calculating its offset. This permits to keep register
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1086) pressure under control and helps to avoid LRA cycling in patalogical
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1087) cases. */
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1088) if (! replace_p && (set = single_set (insn)) != NULL
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1089) && GET_CODE (SET_SRC (set)) == PLUS
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1090) && GET_CODE (XEXP (SET_SRC (set), 0)) == PLUS)
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1091) {
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1092) rtx reg1, reg2, op1, op2;
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1093)
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1094) reg1 = op1 = XEXP (XEXP (SET_SRC (set), 0), 0);
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1095) reg2 = op2 = XEXP (SET_SRC (set), 1);
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1096) if (GET_CODE (reg1) == SUBREG)
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1097) reg1 = SUBREG_REG (reg1);
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1098) if (GET_CODE (reg2) == SUBREG)
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1099) reg2 = SUBREG_REG (reg2);
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1100) if (REG_P (reg1) && REG_P (reg2)
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1101) && REGNO (reg1) < FIRST_PSEUDO_REGISTER
-4334b52427420 gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-20 11:40:14 -0500 1102) && REGNO (reg2) >= FIRST_PSEUDO_REGISTER
-4334b52427420 gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-20 11:40:14 -0500 1103) && GET_MODE (reg1) == Pmode
-68ba1039c7daf gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-21 17:27:01 -0500 1104) && !have_addptr3_insn (lra_pmode_pseudo, reg1,
-4334b52427420 gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-20 11:40:14 -0500 1105) XEXP (XEXP (SET_SRC (set), 0), 1)))
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1106) {
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1107) XEXP (XEXP (SET_SRC (set), 0), 0) = op2;
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1108) XEXP (SET_SRC (set), 1) = op1;
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1109) }
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1110) }
-cf2ac1c30af0f gcc/lra-eliminations.c (Vladimir N. Makarov 2021-01-12 11:26:15 -0500 1111)
-2c62cbaaf13c7 gcc/lra-eliminations.c (Vladimir Makarov 2013-04-26 18:11:35 +0000 1112) /* If we had a move insn but now we don't, re-recognize it.
-2c62cbaaf13c7 gcc/lra-eliminations.c (Vladimir Makarov 2013-04-26 18:11:35 +0000 1113) This will cause spurious re-recognition if the old move had a
-2c62cbaaf13c7 gcc/lra-eliminations.c (Vladimir Makarov 2013-04-26 18:11:35 +0000 1114) PARALLEL since the new one still will, but we can't call
-2c62cbaaf13c7 gcc/lra-eliminations.c (Vladimir Makarov 2013-04-26 18:11:35 +0000 1115) single_set without having put new body into the insn and the
-2c62cbaaf13c7 gcc/lra-eliminations.c (Vladimir Makarov 2013-04-26 18:11:35 +0000 1116) re-recognition won't hurt in this rare case. */
-8ba6ea878fd09 gcc/lra-eliminations.c (Martin Liska 2019-07-03 10:34:20 +0200 1117) lra_update_insn_recog_data (insn);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1118) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1119)
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1120) /* Spill pseudos which are assigned to hard registers in SET, record them in
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1121) SPILLED_PSEUDOS unless it is null, and return the recorded pseudos number.
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1122) Add affected insns for processing in the subsequent constraint pass. */
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1123) static int
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1124) spill_pseudos (HARD_REG_SET set, int *spilled_pseudos)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1125) {
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1126) int i, n;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1127) bitmap_head to_process;
-cfa434f6d2c4e gcc/lra-eliminations.c (David Malcolm 2014-08-22 18:36:35 +0000 1128) rtx_insn *insn;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1129)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1130) if (hard_reg_set_empty_p (set))
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1131) return 0;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1132) if (lra_dump_file != NULL)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1133) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1134) fprintf (lra_dump_file, " Spilling non-eliminable hard regs:");
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1135) for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1136) if (TEST_HARD_REG_BIT (set, i))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1137) fprintf (lra_dump_file, " %d", i);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1138) fprintf (lra_dump_file, "\n");
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1139) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1140) bitmap_initialize (&to_process, &reg_obstack);
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1141) n = 0;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1142) for (i = FIRST_PSEUDO_REGISTER; i < max_reg_num (); i++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1143) if (lra_reg_info[i].nrefs != 0 && reg_renumber[i] >= 0
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1144) && overlaps_hard_reg_set_p (set,
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1145) PSEUDO_REGNO_MODE (i), reg_renumber[i]))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1146) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1147) if (lra_dump_file != NULL)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1148) fprintf (lra_dump_file, " Spilling r%d(%d)\n",
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1149) i, reg_renumber[i]);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1150) reg_renumber[i] = -1;
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1151) if (spilled_pseudos != NULL)
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1152) spilled_pseudos[n++] = i;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1153) bitmap_ior_into (&to_process, &lra_reg_info[i].insn_bitmap);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1154) }
-44942965f4eae gcc/lra-eliminations.c (Richard Sandiford 2019-09-09 17:59:19 +0000 1155) lra_no_alloc_regs |= set;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1156) for (insn = get_insns (); insn != NULL_RTX; insn = NEXT_INSN (insn))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1157) if (bitmap_bit_p (&to_process, INSN_UID (insn)))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1158) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1159) lra_push_insn (insn);
-7874b7c5b5992 gcc/lra-eliminations.c (Vladimir Makarov 2018-02-22 21:17:51 +0000 1160) lra_set_used_insn_alternative (insn, LRA_UNKNOWN_ALT);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1161) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1162) bitmap_clear (&to_process);
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1163) return n;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1164) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1165)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1166) /* Update all offsets and possibility for elimination on eliminable
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1167) registers. Spill pseudos assigned to registers which are
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1168) uneliminable, update LRA_NO_ALLOC_REGS and ELIMINABLE_REG_SET. Add
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1169) insns to INSNS_WITH_CHANGED_OFFSETS containing eliminable hard
-5a107a0f0cdf9 gcc/lra-eliminations.c (Vladimir Makarov 2013-05-07 19:29:05 +0000 1170) registers whose offsets should be changed. Return true if any
-5a107a0f0cdf9 gcc/lra-eliminations.c (Vladimir Makarov 2013-05-07 19:29:05 +0000 1171) elimination offset changed. */
-5a107a0f0cdf9 gcc/lra-eliminations.c (Vladimir Makarov 2013-05-07 19:29:05 +0000 1172) static bool
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1173) update_reg_eliminate (bitmap insns_with_changed_offsets)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1174) {
-5a107a0f0cdf9 gcc/lra-eliminations.c (Vladimir Makarov 2013-05-07 19:29:05 +0000 1175) bool prev, result;
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 1176) class lra_elim_table *ep, *ep1;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1177) HARD_REG_SET temp_hard_reg_set;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1178)
-29eb9a442b145 gcc/lra-eliminations.c (Bernd Edlinger 2017-05-08 17:44:36 +0000 1179) targetm.compute_frame_layout ();
-29eb9a442b145 gcc/lra-eliminations.c (Bernd Edlinger 2017-05-08 17:44:36 +0000 1180)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1181) /* Clear self elimination offsets. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1182) for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1183) self_elim_offsets[ep->from] = 0;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1184) for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1185) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1186) /* If it is a currently used elimination: update the previous
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1187) offset. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1188) if (elimination_map[ep->from] == ep)
-b49473448966b gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:24 -0300 1189) {
-b49473448966b gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:24 -0300 1190) ep->previous_offset = ep->offset;
-b49473448966b gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:24 -0300 1191) /* Restore the stack_pointer_rtx into to_rtx, that
-b49473448966b gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:24 -0300 1192) lra_update_fp2sp_elimination set to from_rtx, so that the assert
-b49473448966b gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:24 -0300 1193) below still checks what it was supposed to check. */
-b49473448966b gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:24 -0300 1194) if (ep->from_rtx == ep->to_rtx
-b49473448966b gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:24 -0300 1195) && ep->from != ep->to
-b49473448966b gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:24 -0300 1196) && ep->from == FRAME_POINTER_REGNUM)
-b49473448966b gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:24 -0300 1197) ep->to_rtx = stack_pointer_rtx;
-b49473448966b gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:24 -0300 1198) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1199)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1200) prev = ep->prev_can_eliminate;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1201) setup_can_eliminate (ep, targetm.can_eliminate (ep->from, ep->to));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1202) if (ep->can_eliminate && ! prev)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1203) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1204) /* It is possible that not eliminable register becomes
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1205) eliminable because we took other reasons into account to
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1206) set up eliminable regs in the initial set up. Just
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1207) ignore new eliminable registers. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1208) setup_can_eliminate (ep, false);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1209) continue;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1210) }
-2edb50a310896 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-02 20:21:45 -0300 1211) if (!ep->can_eliminate && elimination_map[ep->from] == ep)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1212) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1213) /* We cannot use this elimination anymore -- find another
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1214) one. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1215) if (lra_dump_file != NULL)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1216) fprintf (lra_dump_file,
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1217) " Elimination %d to %d is not possible anymore\n",
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1218) ep->from, ep->to);
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1219) /* If after processing RTL we decides that SP can be used as a result
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1220) of elimination, it cannot be changed. For frame pointer to stack
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1221) pointer elimination the condition is a bit relaxed and we just require
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1222) that actual elimination has not been done yet. */
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1223) gcc_assert (ep->to_rtx != stack_pointer_rtx
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 1224) || !elimination_2sp_occurred_p
-16894253cd152 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-21 20:28:50 -0400 1225) || (ep->from < FIRST_PSEUDO_REGISTER
-ddcfa953fc03e gcc/lra-eliminations.c (Jiong Wang 2014-11-18 09:30:08 +0000 1226) && fixed_regs [ep->from]));
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1227)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1228) /* Mark that is not eliminable anymore. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1229) elimination_map[ep->from] = NULL;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1230) for (ep1 = ep + 1; ep1 < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep1++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1231) if (ep1->can_eliminate && ep1->from == ep->from)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1232) break;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1233) if (ep1 < &reg_eliminate[NUM_ELIMINABLE_REGS])
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1234) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1235) if (lra_dump_file != NULL)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1236) fprintf (lra_dump_file, " Using elimination %d to %d now\n",
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1237) ep1->from, ep1->to);
-542773888190e gcc/lra-eliminations.cc (Michael Matz 2024-08-22 17:09:11 +0200 1238) lra_assert (known_eq (ep1->previous_offset, -1));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1239) ep1->previous_offset = ep->offset;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1240) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1241) else
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1242) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1243) /* There is no elimination anymore just use the hard
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1244) register `from' itself. Setup self elimination
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1245) offset to restore the original offset values. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1246) if (lra_dump_file != NULL)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1247) fprintf (lra_dump_file, " %d is not eliminable at all\n",
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1248) ep->from);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1249) self_elim_offsets[ep->from] = -ep->offset;
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 1250) if (maybe_ne (ep->offset, 0))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1251) bitmap_ior_into (insns_with_changed_offsets,
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1252) &lra_reg_info[ep->from].insn_bitmap);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1253) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1254) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1255)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1256) INITIAL_ELIMINATION_OFFSET (ep->from, ep->to, ep->offset);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1257) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1258) setup_elimination_map ();
-5a107a0f0cdf9 gcc/lra-eliminations.c (Vladimir Makarov 2013-05-07 19:29:05 +0000 1259) result = false;
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1260) CLEAR_HARD_REG_SET (temp_hard_reg_set);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1261) for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1262) if (elimination_map[ep->from] == NULL)
-764df76cb2dc6 gcc/lra-eliminations.c (Dimitar Dimitrov 2018-06-28 03:43:48 +0000 1263) add_to_hard_reg_set (&temp_hard_reg_set, Pmode, ep->from);
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1264) else if (elimination_map[ep->from] == ep)
-d70a81dddc916 gcc/lra-eliminations.c (Shiva Chen 2013-04-23 17:38:59 +0000 1265) {
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1266) /* Prevent the hard register into which we eliminate from
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1267) the usage for pseudos. */
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1268) if (ep->from != ep->to)
-764df76cb2dc6 gcc/lra-eliminations.c (Dimitar Dimitrov 2018-06-28 03:43:48 +0000 1269) add_to_hard_reg_set (&temp_hard_reg_set, Pmode, ep->to);
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 1270) if (maybe_ne (ep->previous_offset, ep->offset))
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1271) {
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1272) bitmap_ior_into (insns_with_changed_offsets,
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1273) &lra_reg_info[ep->from].insn_bitmap);
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1274)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1275) /* Update offset when the eliminate offset have been
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1276) changed. */
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1277) lra_update_reg_val_offset (lra_reg_info[ep->from].val,
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1278) ep->offset - ep->previous_offset);
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1279) result = true;
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1280) }
-d70a81dddc916 gcc/lra-eliminations.c (Shiva Chen 2013-04-23 17:38:59 +0000 1281) }
-44942965f4eae gcc/lra-eliminations.c (Richard Sandiford 2019-09-09 17:59:19 +0000 1282) lra_no_alloc_regs |= temp_hard_reg_set;
-d15e5131845e2 gcc/lra-eliminations.c (Richard Sandiford 2019-09-09 17:59:25 +0000 1283) eliminable_regset &= ~temp_hard_reg_set;
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1284) spill_pseudos (temp_hard_reg_set, NULL);
-5a107a0f0cdf9 gcc/lra-eliminations.c (Vladimir Makarov 2013-05-07 19:29:05 +0000 1285) return result;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1286) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1287)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1288) /* Initialize the table of hard registers to eliminate.
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1289) Pre-condition: global flag frame_pointer_needed has been set before
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1290) calling this function. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1291) static void
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1292) init_elim_table (void)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1293) {
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 1294) class lra_elim_table *ep;
-522d4efcd3bda gcc/lra-eliminations.c (Jan-Benedict Glaw 2013-09-27 20:20:35 +0000 1295) bool value_p;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1296) const struct elim_table_1 *ep1;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1297)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1298) if (!reg_eliminate)
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 1299) reg_eliminate = XCNEWVEC (class lra_elim_table, NUM_ELIMINABLE_REGS);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1300)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1301) memset (self_elim_offsets, 0, sizeof (self_elim_offsets));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1302) /* Initiate member values which will be never changed. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1303) self_elim_table.can_eliminate = self_elim_table.prev_can_eliminate = true;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1304) self_elim_table.previous_offset = 0;
-5368023839d4b gcc/lra-eliminations.c (Bernd Edlinger 2016-09-09 23:08:54 +0000 1305)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1306) for (ep = reg_eliminate, ep1 = reg_eliminate_1;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1307) ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++, ep1++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1308) {
-542773888190e gcc/lra-eliminations.cc (Michael Matz 2024-08-22 17:09:11 +0200 1309) ep->offset = ep->previous_offset = -1;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1310) ep->from = ep1->from;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1311) ep->to = ep1->to;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1312) value_p = (targetm.can_eliminate (ep->from, ep->to)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1313) && ! (ep->to == STACK_POINTER_REGNUM
-f4eafc3059ff4 gcc/lra-eliminations.c (H.J. Lu 2012-10-29 21:56:35 +0000 1314) && frame_pointer_needed
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1315) && (! SUPPORTS_STACK_ALIGNMENT
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1316) || ! stack_realign_fp)));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1317) setup_can_eliminate (ep, value_p);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1318) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1319)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1320) /* Build the FROM and TO REG rtx's. Note that code in gen_rtx_REG
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1321) will cause, e.g., gen_rtx_REG (Pmode, STACK_POINTER_REGNUM) to
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1322) equal stack_pointer_rtx. We depend on this. Threfore we switch
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1323) off that we are in LRA temporarily. */
-0c8ecbcd3cf7d gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-09-28 09:41:18 -0400 1324) lra_in_progress = false;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1325) for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1326) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1327) ep->from_rtx = gen_rtx_REG (Pmode, ep->from);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1328) ep->to_rtx = gen_rtx_REG (Pmode, ep->to);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1329) eliminable_reg_rtx[ep->from] = ep->from_rtx;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1330) }
-0c8ecbcd3cf7d gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-09-28 09:41:18 -0400 1331) lra_in_progress = true;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1332) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1333)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1334) /* Function for initialization of elimination once per function. It
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1335) sets up sp offset for each insn. */
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1336) static void
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1337) init_elimination (void)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1338) {
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1339) bool stop_to_sp_elimination_p;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1340) basic_block bb;
-cfa434f6d2c4e gcc/lra-eliminations.c (David Malcolm 2014-08-22 18:36:35 +0000 1341) rtx_insn *insn;
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 1342) class lra_elim_table *ep;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1343)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1344) init_elim_table ();
-11cd3bed28f13 gcc/lra-eliminations.c (David Malcolm 2013-12-09 21:06:06 +0000 1345) FOR_EACH_BB_FN (bb, cfun)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1346) {
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1347) curr_sp_change = 0;
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1348) stop_to_sp_elimination_p = false;
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1349) FOR_BB_INSNS (bb, insn)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1350) if (INSN_P (insn))
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1351) {
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1352) lra_get_insn_recog_data (insn)->sp_offset = curr_sp_change;
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1353) if (NONDEBUG_INSN_P (insn))
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1354) {
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1355) mark_not_eliminable (PATTERN (insn), VOIDmode);
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 1356) if (maybe_ne (curr_sp_change, 0)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1357) && find_reg_note (insn, REG_LABEL_OPERAND, NULL_RTX))
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1358) stop_to_sp_elimination_p = true;
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1359) }
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1360) }
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1361) if (! frame_pointer_needed
-73ca989cb823c gcc/lra-eliminations.c (Richard Sandiford 2017-12-20 12:53:35 +0000 1362) && (maybe_ne (curr_sp_change, 0) || stop_to_sp_elimination_p)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1363) && bb->succs && bb->succs->length () != 0)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1364) for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1365) if (ep->to == STACK_POINTER_REGNUM)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1366) setup_can_eliminate (ep, false);
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1367) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1368) setup_elimination_map ();
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1369) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1370)
-30038a207c10a gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-05-30 15:54:28 -0400 1371) /* Update and return stack pointer OFFSET after processing X. */
-30038a207c10a gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-05-30 15:54:28 -0400 1372) poly_int64
-30038a207c10a gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-05-30 15:54:28 -0400 1373) lra_update_sp_offset (rtx x, poly_int64 offset)
-30038a207c10a gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-05-30 15:54:28 -0400 1374) {
-30038a207c10a gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-05-30 15:54:28 -0400 1375) curr_sp_change = offset;
-30038a207c10a gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-05-30 15:54:28 -0400 1376) mark_not_eliminable (x, VOIDmode);
-30038a207c10a gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-05-30 15:54:28 -0400 1377) return curr_sp_change;
-30038a207c10a gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-05-30 15:54:28 -0400 1378) }
-30038a207c10a gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-05-30 15:54:28 -0400 1379)
-30038a207c10a gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-05-30 15:54:28 -0400 1380)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1381) /* Eliminate hard reg given by its location LOC. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1382) void
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1383) lra_eliminate_reg_if_possible (rtx *loc)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1384) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1385) int regno;
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 1386) class lra_elim_table *ep;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1387)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1388) lra_assert (REG_P (*loc));
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1389) if ((regno = REGNO (*loc)) >= FIRST_PSEUDO_REGISTER
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1390) || ! TEST_HARD_REG_BIT (lra_no_alloc_regs, regno))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1391) return;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1392) if ((ep = get_elimination (*loc)) != NULL)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1393) *loc = ep->to_rtx;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1394) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1395)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1396) /* Do (final if FINAL_P or first if FIRST_P) elimination in INSN. Add
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1397) the insn for subsequent processing in the constraint pass, update
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1398) the insn info. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1399) static void
-cfa434f6d2c4e gcc/lra-eliminations.c (David Malcolm 2014-08-22 18:36:35 +0000 1400) process_insn_for_elimination (rtx_insn *insn, bool final_p, bool first_p)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1401) {
-d9cf932c33070 gcc/lra-eliminations.c (Vladimir Makarov 2014-11-13 03:02:49 +0000 1402) eliminate_regs_in_insn (insn, final_p, first_p, 0);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1403) if (! final_p)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1404) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1405) /* Check that insn changed its code. This is a case when a move
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1406) insn becomes an add insn and we do not want to process the
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1407) insn as a move anymore. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1408) int icode = recog (PATTERN (insn), insn, 0);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1409)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1410) if (icode >= 0 && icode != INSN_CODE (insn))
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1411) {
-7436a1c6750d1 gcc/lra-eliminations.c (Vladimir Makarov 2019-12-10 22:07:57 +0000 1412) if (INSN_CODE (insn) >= 0)
-7436a1c6750d1 gcc/lra-eliminations.c (Vladimir Makarov 2019-12-10 22:07:57 +0000 1413) /* Insn code is changed. It may change its operand type
-7436a1c6750d1 gcc/lra-eliminations.c (Vladimir Makarov 2019-12-10 22:07:57 +0000 1414) from IN to INOUT. Inform the subsequent assignment
-7436a1c6750d1 gcc/lra-eliminations.c (Vladimir Makarov 2019-12-10 22:07:57 +0000 1415) subpass about this situation. */
-7436a1c6750d1 gcc/lra-eliminations.c (Vladimir Makarov 2019-12-10 22:07:57 +0000 1416) check_and_force_assignment_correctness_p = true;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1417) INSN_CODE (insn) = icode;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1418) lra_update_insn_recog_data (insn);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1419) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1420) lra_update_insn_regno_info (insn);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1421) lra_push_insn (insn);
-7874b7c5b5992 gcc/lra-eliminations.c (Vladimir Makarov 2018-02-22 21:17:51 +0000 1422) lra_set_used_insn_alternative (insn, LRA_UNKNOWN_ALT);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1423) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1424) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1425)
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1426) /* Update frame pointer to stack pointer elimination if we started with
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1427) permitted frame pointer elimination and now target reports that we can not
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1428) do this elimination anymore. Record spilled pseudos in SPILLED_PSEUDOS
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1429) unless it is null, and return the recorded pseudos number. */
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1430) int
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1431) lra_update_fp2sp_elimination (int *spilled_pseudos)
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1432) {
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1433) int n;
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1434) HARD_REG_SET set;
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1435) class lra_elim_table *ep;
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1436)
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1437) if (frame_pointer_needed || !targetm.frame_pointer_required ())
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1438) return 0;
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 1439) gcc_assert (!elimination_2sp_occurred_p);
-7ce8a87f78122 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:19 -0300 1440) ep = elimination_map[FRAME_POINTER_REGNUM];
-7ce8a87f78122 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:19 -0300 1441) if (ep->to == STACK_POINTER_REGNUM)
-7ce8a87f78122 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:19 -0300 1442) {
-b49473448966b gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:24 -0300 1443) /* Prevent any further uses of fp, say in spill addresses, from being
-b49473448966b gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:24 -0300 1444) eliminated to sp and affected by sp offsets. Alas, deactivating the
-b49473448966b gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:24 -0300 1445) elimination altogether causes the next chosen fp elimination to miss
-b49473448966b gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:24 -0300 1446) the offset propagation, so it may keep -1 as its prev_offset, and that
-b49473448966b gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:24 -0300 1447) will make subsequent offsets incorrect. */
-b49473448966b gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:24 -0300 1448) ep->to_rtx = ep->from_rtx;
-7ce8a87f78122 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:19 -0300 1449) setup_can_eliminate (ep, false);
-7ce8a87f78122 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:19 -0300 1450) }
-7ce8a87f78122 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:19 -0300 1451) else
-66b6da3b66ed0 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:26 -0300 1452) for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
-66b6da3b66ed0 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:26 -0300 1453) if (ep->from == FRAME_POINTER_REGNUM && ep->to == STACK_POINTER_REGNUM)
-66b6da3b66ed0 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:26 -0300 1454) setup_can_eliminate (ep, false);
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1455) if (lra_dump_file != NULL)
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1456) fprintf (lra_dump_file,
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1457) " Frame pointer can not be eliminated anymore\n");
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1458) frame_pointer_needed = true;
-be547188b632d gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:22 -0300 1459) /* If !lra_reg_spill_p, we likely have incomplete range information
-be547188b632d gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:22 -0300 1460) for pseudos assigned to the frame pointer that will have to be
-be547188b632d gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:22 -0300 1461) spilled, and so we may end up incorrectly sharing them unless we
-be547188b632d gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:22 -0300 1462) get live range information for them. */
-be547188b632d gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:22 -0300 1463) if (lra_complete_live_ranges ())
-be547188b632d gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:22 -0300 1464) /* If lives ranges changed, update the aggregate live ranges in
-be547188b632d gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:22 -0300 1465) slots as well before spilling any further pseudos. */
-be547188b632d gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:22 -0300 1466) lra_recompute_slots_live_ranges ();
-66b6da3b66ed0 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:26 -0300 1467) CLEAR_HARD_REG_SET (set);
-66b6da3b66ed0 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:26 -0300 1468) add_to_hard_reg_set (&set, Pmode, HARD_FRAME_POINTER_REGNUM);
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1469) n = spill_pseudos (set, spilled_pseudos);
-3452652236aa7 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-08-16 09:13:54 -0400 1470) return n;
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1471) }
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1472)
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1473) /* Return true if we have a pseudo assigned to hard frame pointer. */
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1474) bool
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1475) lra_fp_pseudo_p (void)
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1476) {
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1477) HARD_REG_SET set;
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1478)
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1479) if (frame_pointer_needed)
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1480) /* At this stage it means we have no pseudos assigned to FP: */
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1481) return false;
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1482) CLEAR_HARD_REG_SET (set);
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1483) add_to_hard_reg_set (&set, Pmode, HARD_FRAME_POINTER_REGNUM);
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1484) for (int i = FIRST_PSEUDO_REGISTER; i < max_reg_num (); i++)
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1485) if (lra_reg_info[i].nrefs != 0 && reg_renumber[i] >= 0
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1486) && overlaps_hard_reg_set_p (set, PSEUDO_REGNO_MODE (i),
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1487) reg_renumber[i]))
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1488) return true;
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1489) return false;
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1490) }
-fca0ab08cd936 gcc/lra-eliminations.cc (Vladimir N. Makarov 2024-12-11 15:36:21 -0500 1491)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1492) /* Entry function to do final elimination if FINAL_P or to update
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1493) elimination register offsets (FIRST_P if we are doing it the first
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1494) time). */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1495) void
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1496) lra_eliminate (bool final_p, bool first_p)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1497) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1498) unsigned int uid;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1499) bitmap_head insns_with_changed_offsets;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1500) bitmap_iterator bi;
-99b1c316ec974 gcc/lra-eliminations.c (Martin Sebor 2019-07-09 18:32:49 +0000 1501) class lra_elim_table *ep;
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1502)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1503) gcc_assert (! final_p || ! first_p);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1504)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1505) timevar_push (TV_LRA_ELIMINATE);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1506)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1507) if (first_p)
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1508) {
-f9a6efa7a71e8 gcc/lra-eliminations.cc (Alexandre Oliva 2025-06-26 21:01:29 -0300 1509) elimination_2sp_occurred_p = false;
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1510) init_elimination ();
-2971ff7b1d564 gcc/lra-eliminations.cc (Vladimir N. Makarov 2023-07-19 09:35:37 -0400 1511) }
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1512)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1513) bitmap_initialize (&insns_with_changed_offsets, &reg_obstack);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1514) if (final_p)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1515) {
-b2b293775a27c gcc/lra-eliminations.c (Mikhail Maltsev 2015-10-28 01:05:53 +0000 1516) if (flag_checking)
-b2b293775a27c gcc/lra-eliminations.c (Mikhail Maltsev 2015-10-28 01:05:53 +0000 1517) {
-b2b293775a27c gcc/lra-eliminations.c (Mikhail Maltsev 2015-10-28 01:05:53 +0000 1518) update_reg_eliminate (&insns_with_changed_offsets);
-b2b293775a27c gcc/lra-eliminations.c (Mikhail Maltsev 2015-10-28 01:05:53 +0000 1519) gcc_assert (bitmap_empty_p (&insns_with_changed_offsets));
-b2b293775a27c gcc/lra-eliminations.c (Mikhail Maltsev 2015-10-28 01:05:53 +0000 1520) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1521) /* We change eliminable hard registers in insns so we should do
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1522) this for all insns containing any eliminable hard
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1523) register. */
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1524) for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1525) if (elimination_map[ep->from] != NULL)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1526) bitmap_ior_into (&insns_with_changed_offsets,
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1527) &lra_reg_info[ep->from].insn_bitmap);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1528) }
-5a107a0f0cdf9 gcc/lra-eliminations.c (Vladimir Makarov 2013-05-07 19:29:05 +0000 1529) else if (! update_reg_eliminate (&insns_with_changed_offsets))
-5a107a0f0cdf9 gcc/lra-eliminations.c (Vladimir Makarov 2013-05-07 19:29:05 +0000 1530) goto lra_eliminate_done;
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1531) if (lra_dump_file != NULL)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1532) {
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1533) fprintf (lra_dump_file, "New elimination table:\n");
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1534) print_elim_table (lra_dump_file);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1535) }
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1536) EXECUTE_IF_SET_IN_BITMAP (&insns_with_changed_offsets, 0, uid, bi)
-80f466c4a620c gcc/lra-eliminations.c (Vladimir Makarov 2013-10-03 00:35:43 +0000 1537) /* A dead insn can be deleted in process_insn_for_elimination. */
-80f466c4a620c gcc/lra-eliminations.c (Vladimir Makarov 2013-10-03 00:35:43 +0000 1538) if (lra_insn_recog_data[uid] != NULL)
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1539) process_insn_for_elimination (lra_insn_recog_data[uid]->insn,
-8d49e7ef0a184 gcc/lra-eliminations.c (Vladimir Makarov 2013-11-28 21:45:21 +0000 1540) final_p, first_p);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1541) bitmap_clear (&insns_with_changed_offsets);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1542)
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1543) lra_eliminate_done:
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1544) timevar_pop (TV_LRA_ELIMINATE);
-55a2c3226a3e9 gcc/lra-eliminations.c (Vladimir Makarov 2012-10-23 15:51:41 +0000 1545) }