aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir N. Makarov <vmakarov@redhat.com>2023-07-20 14:34:26 -0400
committerVladimir N. Makarov <vmakarov@redhat.com>2023-07-20 14:42:58 -0400
commit4b8878fbf7b74ea5c3405c9f558df0517036f131 (patch)
tree5d854fc253a2dd88ffd1ddb7f29bb4707c6195f1
parentbdda084bc4604467587447fbc4be1c8da0a12665 (diff)
downloadgcc-4b8878fbf7b74ea5c3405c9f558df0517036f131.zip
gcc-4b8878fbf7b74ea5c3405c9f558df0517036f131.tar.gz
gcc-4b8878fbf7b74ea5c3405c9f558df0517036f131.tar.bz2
[LRA]: Exclude reloading of frame pointer in subreg for some cases
LRA for avr port reloads frame pointer in subreg although we can just simplify the subreg. It results in generation of bad performance code. The following patch fixes this. gcc/ChangeLog: * lra-constraints.cc (simplify_operand_subreg): Check frame pointer simplification.
-rw-r--r--gcc/lra-constraints.cc16
1 files changed, 16 insertions, 0 deletions
diff --git a/gcc/lra-constraints.cc b/gcc/lra-constraints.cc
index 76a155e..f3784cf 100644
--- a/gcc/lra-constraints.cc
+++ b/gcc/lra-constraints.cc
@@ -1797,6 +1797,16 @@ simplify_operand_subreg (int nop, machine_mode reg_mode)
alter_subreg (curr_id->operand_loc[nop], false);
return true;
}
+ auto fp_subreg_can_be_simplified_after_reload_p = [] (machine_mode innermode,
+ poly_uint64 offset,
+ machine_mode mode) {
+ reload_completed = 1;
+ bool res = simplify_subreg_regno (FRAME_POINTER_REGNUM,
+ innermode,
+ offset, mode) >= 0;
+ reload_completed = 0;
+ return res;
+ };
/* Force a reload of the SUBREG_REG if this is a constant or PLUS or
if there may be a problem accessing OPERAND in the outer
mode. */
@@ -1809,6 +1819,12 @@ simplify_operand_subreg (int nop, machine_mode reg_mode)
>= hard_regno_nregs (hard_regno, mode))
&& simplify_subreg_regno (hard_regno, innermode,
SUBREG_BYTE (operand), mode) < 0
+ /* Exclude reloading of frame pointer in subreg if frame pointer can not
+ be simplified here only because the reload is not finished yet. */
+ && (hard_regno != FRAME_POINTER_REGNUM
+ || !fp_subreg_can_be_simplified_after_reload_p (innermode,
+ SUBREG_BYTE (operand),
+ mode))
/* Don't reload subreg for matching reload. It is actually
valid subreg in LRA. */
&& ! LRA_SUBREG_P (operand))