aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2020-01-20 19:29:25 +0000
committerRichard Sandiford <richard.sandiford@arm.com>2020-01-21 16:22:12 +0000
commitfb15e2bab5267213b8706fa6a29eeef94f62a524 (patch)
tree7babce9748b6b088d6d4baf6652971b0a91cfad6
parentc292cfe539cd7c060caad826d362ed5e845bfbef (diff)
downloadgcc-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/ChangeLog11
-rw-r--r--gcc/config/aarch64/aarch64-sve-builtins-sve2.cc2
-rw-r--r--gcc/config/aarch64/aarch64-sve-builtins.cc15
-rw-r--r--gcc/config/aarch64/aarch64-sve-builtins.h1
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 &);