At least on aarch64, modes_tieable_p is a stricter condition than
can_change_mode_class. can_change_mode_class tells us whether the
subreg rules produce a sensible result for a particular mode change.
modes_tieable_p in addition tells us whether a mode change is
reasonable for optimisation purposes.
A false return from either hook should (and does) prevent early_ra
from attempting an allocation. But only a false return from
can_change_mode_class should invalidate the liveness tracking;
we can still analyse subregs for which can_change_mode_class is
true and modes_tieable_p is false.
This doesn't make a difference on its own, but it helps later
patches.
gcc/
* config/aarch64/aarch64-early-ra.cc
(early_ra::get_allocno_subgroup): Split can_change_mode_class test
out from modes_tieable_p test and only invalidate the live range
information for the former.
---
gcc/config/aarch64/aarch64-early-ra.cc | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/gcc/config/aarch64/aarch64-early-ra.cc
b/gcc/config/aarch64/aarch64-early-ra.cc
index 68e96bd4da8..79ac7b099eb 100644
--- a/gcc/config/aarch64/aarch64-early-ra.cc
+++ b/gcc/config/aarch64/aarch64-early-ra.cc
@@ -1434,8 +1434,8 @@ early_ra::get_allocno_subgroup (rtx reg)
if (!inner)
return {};
- if (!targetm.modes_tieable_p (GET_MODE (SUBREG_REG (reg)),
- GET_MODE (reg)))
+ if (!targetm.can_change_mode_class (GET_MODE (SUBREG_REG (reg)),
+ GET_MODE (reg), FP_REGS))
{
record_live_range_failure ([&](){
fprintf (dump_file, "cannot refer to r%d:%s in mode %s",
@@ -1446,6 +1446,15 @@ early_ra::get_allocno_subgroup (rtx reg)
return {};
}
+ if (!targetm.modes_tieable_p (GET_MODE (SUBREG_REG (reg)),
+ GET_MODE (reg)))
+ record_allocation_failure ([&](){
+ fprintf (dump_file, "r%d's mode %s is not tieable to mode %s",
+ REGNO (SUBREG_REG (reg)),
+ GET_MODE_NAME (GET_MODE (SUBREG_REG (reg))),
+ GET_MODE_NAME (GET_MODE (reg)));
+ });
+
subreg_info info;
subreg_get_info (V0_REGNUM, GET_MODE (SUBREG_REG (reg)),
SUBREG_BYTE (reg), GET_MODE (reg), &info);
--
2.25.1