diff options
author | Kewen Lin <linkw@linux.ibm.com> | 2023-08-09 01:15:46 -0500 |
---|---|---|
committer | Kewen Lin <linkw@linux.ibm.com> | 2023-08-09 01:16:05 -0500 |
commit | 0412f0e374de1f66e20c407e0b519324af3fd5b6 (patch) | |
tree | 85273baac0d510da6953ffa24b148f56309bc762 | |
parent | 4a8e6fa8016f8daf184dec49f371ca71b1cb0f01 (diff) | |
download | gcc-0412f0e374de1f66e20c407e0b519324af3fd5b6.zip gcc-0412f0e374de1f66e20c407e0b519324af3fd5b6.tar.gz gcc-0412f0e374de1f66e20c407e0b519324af3fd5b6.tar.bz2 |
rs6000: Teach legitimate_address_p about LEN_{LOAD,STORE} [PR110248]
This patch is to teach rs6000_legitimate_address_p to
handle the queried rtx constructed for LEN_{LOAD,STORE},
since lxvl and stxvl doesn't support x-form or ds-form,
so consider it as not legitimate when outer code is PLUS.
PR tree-optimization/110248
gcc/ChangeLog:
* config/rs6000/rs6000.cc (rs6000_legitimate_address_p): Check if
the given code is for ifn LEN_{LOAD,STORE}, if yes then make it not
legitimate when outer code is PLUS.
-rw-r--r-- | gcc/config/rs6000/rs6000.cc | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 3e0417a..efe9adc 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -9885,7 +9885,7 @@ use_toc_relative_ref (rtx sym, machine_mode mode) during assembly output. */ static bool rs6000_legitimate_address_p (machine_mode mode, rtx x, bool reg_ok_strict, - code_helper = ERROR_MARK) + code_helper ch = ERROR_MARK) { bool reg_offset_p = reg_offset_addressing_ok_p (mode); bool quad_offset_p = mode_supports_dq_form (mode); @@ -9893,6 +9893,12 @@ rs6000_legitimate_address_p (machine_mode mode, rtx x, bool reg_ok_strict, if (TARGET_ELF && RS6000_SYMBOL_REF_TLS_P (x)) return 0; + /* lxvl and stxvl doesn't support any addressing modes with PLUS. */ + if (ch.is_internal_fn () + && (ch == IFN_LEN_LOAD || ch == IFN_LEN_STORE) + && GET_CODE (x) == PLUS) + return 0; + /* Handle unaligned altivec lvx/stvx type addresses. */ if (VECTOR_MEM_ALTIVEC_OR_VSX_P (mode) && GET_CODE (x) == AND |