aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2023-04-19 11:13:11 +0200
committerJakub Jelinek <jakub@redhat.com>2023-04-19 11:13:11 +0200
commit76f44fbfea1f11e53d4b7e83f0debd029c94a1b3 (patch)
tree480aa9991c8cd99168bc4ed67316189ef03759ad
parent2c7bf8036dfe2f603f1c135dabf6415d8d28051b (diff)
downloadgcc-76f44fbfea1f11e53d4b7e83f0debd029c94a1b3.zip
gcc-76f44fbfea1f11e53d4b7e83f0debd029c94a1b3.tar.gz
gcc-76f44fbfea1f11e53d4b7e83f0debd029c94a1b3.tar.bz2
dse: Use SUBREG_REG for copy_to_mode_reg in DSE replace_read for WORD_REGISTER_OPERATIONS targets [PR109040]
While we've agreed this is not the right fix for the PR109040 bug, the patch clearly improves generated code (at least on the testcase from the PR), so I'd like to propose this as optimization heuristics improvement for GCC 14. 2023-04-19 Jakub Jelinek <jakub@redhat.com> PR target/109040 * dse.cc (replace_read): If read_reg is a SUBREG of a word mode REG, for WORD_REGISTER_OPERATIONS copy SUBREG_REG of it into a new REG rather than the SUBREG.
-rw-r--r--gcc/dse.cc14
1 files changed, 13 insertions, 1 deletions
diff --git a/gcc/dse.cc b/gcc/dse.cc
index a2db8d1c..802b949 100644
--- a/gcc/dse.cc
+++ b/gcc/dse.cc
@@ -2012,7 +2012,19 @@ replace_read (store_info *store_info, insn_info_t store_insn,
}
/* Force the value into a new register so that it won't be clobbered
between the store and the load. */
- read_reg = copy_to_mode_reg (read_mode, read_reg);
+ if (WORD_REGISTER_OPERATIONS
+ && GET_CODE (read_reg) == SUBREG
+ && REG_P (SUBREG_REG (read_reg))
+ && GET_MODE (SUBREG_REG (read_reg)) == word_mode)
+ {
+ /* For WORD_REGISTER_OPERATIONS with subreg of word_mode register
+ force SUBREG_REG into a new register rather than the SUBREG. */
+ rtx r = copy_to_mode_reg (word_mode, SUBREG_REG (read_reg));
+ read_reg = shallow_copy_rtx (read_reg);
+ SUBREG_REG (read_reg) = r;
+ }
+ else
+ read_reg = copy_to_mode_reg (read_mode, read_reg);
insns = get_insns ();
end_sequence ();