aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Greenhalgh <james.greenhalgh@arm.com>2014-07-31 15:32:44 +0000
committerJames Greenhalgh <jgreenhalgh@gcc.gnu.org>2014-07-31 15:32:44 +0000
commit22756ccf24db934dd8913ff5965ddcdca2eb61ed (patch)
tree66eaa4191309d1b9929def578ac52c50e2b14c23
parent988fa69392bb0edcece6db817ef5a3dfb09907fa (diff)
downloadgcc-22756ccf24db934dd8913ff5965ddcdca2eb61ed.zip
gcc-22756ccf24db934dd8913ff5965ddcdca2eb61ed.tar.gz
gcc-22756ccf24db934dd8913ff5965ddcdca2eb61ed.tar.bz2
[AArch64_be] Don't fold reduction intrinsics.
gcc/ * config/aarch64/aarch64-builtins.c (aarch64_gimple_fold_builtin): Don't fold reduction operations for BYTES_BIG_ENDIAN. From-SVN: r213379
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/aarch64/aarch64-builtins.c14
2 files changed, 20 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b0ebfba..b2b6aa5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2014-07-31 James Greenhalgh <james.greenhalgh@arm.com>
+ * config/aarch64/aarch64-builtins.c
+ (aarch64_gimple_fold_builtin): Don't fold reduction operations for
+ BYTES_BIG_ENDIAN.
+
+2014-07-31 James Greenhalgh <james.greenhalgh@arm.com>
+
* config/aarch64/aarch64.c (aarch64_simd_vect_par_cnst_half): Vary
the generated mask based on BYTES_BIG_ENDIAN.
(aarch64_simd_check_vect_par_cnst_half): New.
diff --git a/gcc/config/aarch64/aarch64-builtins.c b/gcc/config/aarch64/aarch64-builtins.c
index fee17ec..58db77e 100644
--- a/gcc/config/aarch64/aarch64-builtins.c
+++ b/gcc/config/aarch64/aarch64-builtins.c
@@ -1383,6 +1383,20 @@ aarch64_gimple_fold_builtin (gimple_stmt_iterator *gsi)
tree call = gimple_call_fn (stmt);
tree fndecl;
gimple new_stmt = NULL;
+
+ /* The operations folded below are reduction operations. These are
+ defined to leave their result in the 0'th element (from the perspective
+ of GCC). The architectural instruction we are folding will leave the
+ result in the 0'th element (from the perspective of the architecture).
+ For big-endian systems, these perspectives are not aligned.
+
+ It is therefore wrong to perform this fold on big-endian. There
+ are some tricks we could play with shuffling, but the mid-end is
+ inconsistent in the way it treats reduction operations, so we will
+ end up in difficulty. Until we fix the ambiguity - just bail out. */
+ if (BYTES_BIG_ENDIAN)
+ return false;
+
if (call)
{
fndecl = gimple_call_fndecl (stmt);