https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120965

            Bug ID: 120965
           Summary: gcc 14.3 aarch64 be failed with pr78542.c
           Product: gcc
           Version: 14.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hanwei62 at huawei dot com
  Target Milestone: ---

target: aarch64 big-endian
compile option: -O0 
Hi, i found gcc 14.3 could not pass pr78542.c

souce code:
/* { dg-do run } */                                                          
/* { dg-additional-options "-w -Wno-psabi" } */                              
#include <stdio.h>                                                           
typedef unsigned V __attribute__ ((vector_size (16)));                       

V                                                                            
foo (unsigned x, V v)                                                        
{                                                                            
  do {                                                                       
      v %= x;                                                                
      x = 1;                                                                 
  } while (v[1]);                                                            
  return v;                                                                  
}                                                                            

int                                                                          
main ()                                                                      
{                                                                            
  V x = foo (5, (V) { 0, 1 }); //{0, 1, 0, 0}                                   
  printf("x[0]: %d, x[1]: %d, x[2]: %d, x[3]: %d\n", x[0], x[1], x[2], x[3]);
  if (x[0] || x[1] || x[2] || x[3])                                          
    __builtin_abort();                                                       
  return 0;                                                                  
}                                                                            

qemu result
gcc 14.3: x[0]: 1, x[1]: 0, x[2]: 0, x[3]: 0
gcc 7.3: x[0]: 0, x[1]: 0, x[2]: 0, x[3]: 0

When I examined the assembly code, I found that the issue might lie with the
zip1 instruction. GCC 14.3 little endian is ok with pr78542.c。It is possible
that the GCC 14.3 code generation phase did not adapt the zip1 instruction for
big-endian systems.

https://godbolt.org/z/T9qx1ve6v

thanks

Reply via email to