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

            Bug ID: 126494
           Summary: ICE with SVE VLS types and vector ?:
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Keywords: aarch64-sve
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ktkachov at gcc dot gnu.org
  Target Milestone: ---
            Target: aarch64

typedef __SVInt32_t sv4si __attribute__((arm_sve_vector_bits (128)));
typedef int v4si __attribute__((vector_size (16)));

__attribute__((noipa)) sv4si
f (v4si a, v4si b, sv4si c)
{
  sv4si z = (sv4si) { 0, 0, 0, 0 };
  sv4si m1 = (sv4si) { -1, -1, -1, -1 };
  return ((a < b) ? z : m1) ^ c;
}

__attribute__((noipa)) void
ref (int *out, const int *a, const int *b, const int *c)
{
  for (int i = 0; i < 4; i++)
    {
      volatile int ai = a[i];
      volatile int bi = b[i];
      volatile int ci = c[i];
      volatile int m = (ai < bi) ? 0 : -1;
      out[i] = m ^ ci;
    }
}

int
main (void)
{
  volatile int ia[4] = { 1, 5, -3, 7 };
  volatile int ib[4] = { 2, 2, 9, 7 };
  volatile int ic[4] = { 0x5a5a5a5a, -1, 3, 0 };
  int sa[4], sb[4], sc[4], expect[4];
  for (int i = 0; i < 4; i++)
    {
      sa[i] = ia[i];
      sb[i] = ib[i];
      sc[i] = ic[i];
    }

  v4si a = { sa[0], sa[1], sa[2], sa[3] };
  v4si b = { sb[0], sb[1], sb[2], sb[3] };
  sv4si c = (sv4si) { sc[0], sc[1], sc[2], sc[3] };

  sv4si r = f (a, b, c);
  ref (expect, sa, sb, sc);

  for (int i = 0; i < 4; i++)
    if (r[i] != expect[i])
      __builtin_abort ();
  return 0;
}

ICEs on aarch64 g++ with -O2 -march=armv8-a+sve -msve-vector-bits=128

during RTL pass: expand
<source>: In function 'sv4si f(v4si, v4si, sv4si)':
<source>:9:31: internal compiler error: in expand_insn, at optabs.cc:8682
    9 |   return ((a < b) ? z : m1) ^ c;

With GCC 13 this didn't ICE but the program aborted while it passes fine on
Clang

Reply via email to