diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2020-01-20 19:29:25 +0000 |
---|---|---|
committer | Richard Sandiford <richard.sandiford@arm.com> | 2020-01-21 16:22:12 +0000 |
commit | fb15e2bab5267213b8706fa6a29eeef94f62a524 (patch) | |
tree | 7babce9748b6b088d6d4baf6652971b0a91cfad6 | |
parent | c292cfe539cd7c060caad826d362ed5e845bfbef (diff) | |
download | gcc-fb15e2bab5267213b8706fa6a29eeef94f62a524.zip gcc-fb15e2bab5267213b8706fa6a29eeef94f62a524.tar.gz gcc-fb15e2bab5267213b8706fa6a29eeef94f62a524.tar.bz2 |
aarch64: Fix SVE ACLE handling of SImode pointers
This long-overdue patch promotes SImode pointers to DImode addresses,
avoiding various ICEs in the existing tests.
2020-01-21 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* config/aarch64/aarch64-sve-builtins.h
(function_expander::convert_to_pmode): Declare.
* config/aarch64/aarch64-sve-builtins.cc
(function_expander::convert_to_pmode): New function.
(function_expander::get_contiguous_base): Use it.
(function_expander::prepare_gather_address_operands): Likewise.
* config/aarch64/aarch64-sve-builtins-sve2.cc
(svwhilerw_svwhilewr_impl::expand): Likewise.
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64-sve-builtins-sve2.cc | 2 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64-sve-builtins.cc | 15 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64-sve-builtins.h | 1 |
4 files changed, 25 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3b7df18..63ff0bf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2020-01-21 Richard Sandiford <richard.sandiford@arm.com> + + * config/aarch64/aarch64-sve-builtins.h + (function_expander::convert_to_pmode): Declare. + * config/aarch64/aarch64-sve-builtins.cc + (function_expander::convert_to_pmode): New function. + (function_expander::get_contiguous_base): Use it. + (function_expander::prepare_gather_address_operands): Likewise. + * config/aarch64/aarch64-sve-builtins-sve2.cc + (svwhilerw_svwhilewr_impl::expand): Likewise. + 2020-01-21 Szabolcs Nagy <szabolcs.nagy@arm.com> PR target/92424 diff --git a/gcc/config/aarch64/aarch64-sve-builtins-sve2.cc b/gcc/config/aarch64/aarch64-sve-builtins-sve2.cc index fa3b506..53b1651 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins-sve2.cc +++ b/gcc/config/aarch64/aarch64-sve-builtins-sve2.cc @@ -442,6 +442,8 @@ public: rtx expand (function_expander &e) const OVERRIDE { + for (unsigned int i = 0; i < 2; ++i) + e.args[i] = e.convert_to_pmode (e.args[i]); return e.use_exact_insn (code_for_while (m_unspec, Pmode, e.gp_mode (0))); } diff --git a/gcc/config/aarch64/aarch64-sve-builtins.cc b/gcc/config/aarch64/aarch64-sve-builtins.cc index 587530a..3d1b610 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins.cc +++ b/gcc/config/aarch64/aarch64-sve-builtins.cc @@ -2602,12 +2602,21 @@ function_expander::overlaps_input_p (rtx x) return false; } +/* Convert ptr_mode value X to Pmode. */ +rtx +function_expander::convert_to_pmode (rtx x) +{ + if (ptr_mode == SImode) + x = simplify_gen_unary (ZERO_EXTEND, DImode, x, SImode); + return x; +} + /* Return the base address for a contiguous load or store function. MEM_MODE is the mode of the addressed memory. */ rtx function_expander::get_contiguous_base (machine_mode mem_mode) { - rtx base = args[1]; + rtx base = convert_to_pmode (args[1]); if (mode_suffix_id == MODE_vnum) { /* Use the size of the memory mode for extending loads and truncating @@ -2814,9 +2823,7 @@ function_expander::prepare_gather_address_operands (unsigned int argno, { /* Scalar base, vector displacement. This is the order that the md pattern wants. */ - if (Pmode == SImode) - args[argno] = simplify_gen_unary (ZERO_EXTEND, DImode, - args[argno], SImode); + args[argno] = convert_to_pmode (args[argno]); vector_type = displacement_vector_type (); if (units == UNITS_elements && !scaled_p) shift_idx = argno + 1; diff --git a/gcc/config/aarch64/aarch64-sve-builtins.h b/gcc/config/aarch64/aarch64-sve-builtins.h index f307233..9513b49 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins.h +++ b/gcc/config/aarch64/aarch64-sve-builtins.h @@ -526,6 +526,7 @@ public: bool overlaps_input_p (rtx); + rtx convert_to_pmode (rtx); rtx get_contiguous_base (machine_mode); rtx get_fallback_value (machine_mode, unsigned int, unsigned int, unsigned int &); |