]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
hppa: Fix (plus (plus (mult (a) (mem_shadd_constant)) (b)) (c)) optimization
authorJohn David Anglin <danglin@gcc.gnu.org>
Tue, 6 Aug 2024 17:40:26 +0000 (13:40 -0400)
committerJohn David Anglin <danglin@gcc.gnu.org>
Tue, 6 Aug 2024 17:44:17 +0000 (13:44 -0400)
The constant C must be an integral multiple of the shift value in
the above optimization.  Non integral values can occur evaluating
IMAGPART_EXPR when the shadd constant is 8 and we have SFmode.

2024-08-06  John David Anglin  <danglin@gcc.gnu.org>

gcc/ChangeLog:

PR target/113384
* config/pa/pa.cc (hppa_legitimize_address): Add check to
ensure constant is an integral multiple of shift the value.

gcc/config/pa/pa.cc

index ec81f403a0115c822c4a873bbed57b317fa9b052..bd4dcc4e2b365040dfd7cc26986b6f4aad988931 100644 (file)
@@ -1263,6 +1263,7 @@ hppa_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
       /* If the index adds a large constant, try to scale the
         constant so that it can be loaded with only one insn.  */
       if (GET_CODE (XEXP (idx, 1)) == CONST_INT
+         && INTVAL (XEXP (idx, 1)) % (1 << shift_val) == 0
          && VAL_14_BITS_P (INTVAL (XEXP (idx, 1))
                            / INTVAL (XEXP (XEXP (idx, 0), 1)))
          && INTVAL (XEXP (idx, 1)) % INTVAL (XEXP (XEXP (idx, 0), 1)) == 0)