https://gcc.gnu.org/g:53fd0f5b1fd737a208c12909fa1188281cb370a3
commit r14-9482-g53fd0f5b1fd737a208c12909fa1188281cb370a3 Author: John David Anglin <dang...@gcc.gnu.org> Date: Thu Mar 14 18:32:56 2024 +0000 hppa: Fix REG+D address support before reload When generating PA 1.x code or code for GNU ld, floating-point accesses only support 5-bit displacements but integer accesses support 14-bit displacements. I mistakenly assumed reload could fix an invalid 14-bit displacement in a floating-point access but this is not the case. 2024-03-14 John David Anglin <dang...@gcc.gnu.org> gcc/ChangeLog: PR target/114288 * config/pa/pa.cc (pa_legitimate_address_p): Don't allow 14-bit displacements before reload for modes that may use a floating-point load or store. Diff: --- gcc/config/pa/pa.cc | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/gcc/config/pa/pa.cc b/gcc/config/pa/pa.cc index 694123e37c9..129289f8e62 100644 --- a/gcc/config/pa/pa.cc +++ b/gcc/config/pa/pa.cc @@ -10968,20 +10968,15 @@ pa_legitimate_address_p (machine_mode mode, rtx x, bool strict, code_helper) /* Long 14-bit displacements always okay for these cases. */ if (INT14_OK_STRICT + || reload_completed || mode == QImode || mode == HImode) return true; - /* A secondary reload may be needed to adjust the displacement - of floating-point accesses when STRICT is nonzero. */ - if (strict) - return false; - - /* We get significantly better code if we allow long displacements - before reload for all accesses. Instructions must satisfy their - constraints after reload, so we must have an integer access. - Return true for both cases. */ - return true; + /* We have to limit displacements to those supported by + both floating-point and integer accesses as reload can't + fix invalid displacements. See PR114288. */ + return false; } if (!TARGET_DISABLE_INDEXING