On 25/04/18 18:31, Maxim Kuvyrkov wrote:
On Mar 20, 2018, at 8:11 PM, Kyrill Tkachov <kyrylo.tkac...@foss.arm.com> wrote:

Hi all,

This PR shows that we get the load/store_lanes logic wrong for arm big-endian.
It is tricky to get right. Aarch64 does it by adding the appropriate 
lane-swapping
operations during expansion.

I'd like to do the same on arm eventually, but we'd need to port and validate 
the VTBL-generating
code and add it to all the right places and I'm not comfortable enough doing it 
for GCC 8, but I am keen
in getting the wrong-code fixed.
As I say in the PR, vectorisation on armeb is already severely restricted (we 
disable many patterns on BYTES_BIG_ENDIAN)
and the load/store_lanes patterns really were not working properly at all, so 
disabling them is not
a radical approach.

The way to do that is to return false in ARRAY_MODE_SUPPORTED_P for 
BYTES_BIG_ENDIAN.

Bootstrapped and tested on arm-none-linux-gnueabihf.
Also tested on armeb-none-eabi.

Committing to trunk.
...
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -6609,7 +6609,8 @@ proc check_effective_target_vect_load_lanes { } {
        verbose "check_effective_target_vect_load_lanes: using cached result" 2
      } else {
        set et_vect_load_lanes 0
-       if { ([istarget arm*-*-*] && [check_effective_target_arm_neon_ok])
+       # We don't support load_lanes correctly on big-endian arm.
+       if { ([istarget arm-*-*] && [check_effective_target_arm_neon_ok])
             || [istarget aarch64*-*-*] } {
            set et_vect_load_lanes 1
        }

Hi Kyrill,

This part makes armv8l-linux-gnueabihf target fail a few of slp-perm-* tests.  
Using [check_effective_target_arm_little_endian] should fix this.

Would you please fix this on master and gcc-7-branch?

Hi Maxim,

Thanks for catching this. This patch fixes the failures (I've reproduced them 
on a armv8l-linux-gnueabihf target).
Committing to trunk.
Richi, Jakub, is this ok to commit to the GCC 8 branch at this time?

Thanks,
Kyrill

2018-04-27  Kyrylo Tkachov  <kyrylo.tkac...@arm.com>

    * lib/target-supports.exp (check_effective_target_vect_load_lanes):
    Use check_effective_target_arm_little_endian.

diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index 00f988cc756b4f5898b9c6290722d1353240b3a3..6d497fbcf8033cae06f54e0601f14e4affe29923 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -6588,7 +6588,7 @@ proc check_effective_target_vect_load_lanes { } {
     } else {
 	set et_vect_load_lanes 0
 	# We don't support load_lanes correctly on big-endian arm.
-	if { ([istarget arm-*-*] && [check_effective_target_arm_neon_ok])
+	if { ([check_effective_target_arm_little_endian] && [check_effective_target_arm_neon_ok])
 	     || [istarget aarch64*-*-*] } {
 	    set et_vect_load_lanes 1
 	}

Reply via email to