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

            Bug ID: 119084
           Summary: LoongArch: __builtin_lsx_vldx can be incorrectly
                    reordered
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: xry111 at gcc dot gnu.org
  Target Milestone: ---

typedef signed char V16QI __attribute__ ((vector_size (16)));
static char x[128];

__attribute__ ((noipa)) int
noopt (int x)
{
  return x;
}

int
main (void)
{
  int t = noopt (32);

  x[32] = 1;

#if 0
  /* This can work around the issue */
  asm("":::"memory");
#endif

  V16QI y = __builtin_lsx_vldx (x, t);
  if (y[0] != 1)
    __builtin_trap ();
}

produces:

        la.local        $r12,.LANCHOR0
        addi.w  $r14,$r0,1                      # 0x1
        vldx    $vr0,$r12,$r4
        st.b    $r14,$r12,32
        vpickve2gr.b    $r12,$vr0,0
        addi.w  $r13,$r0,1                      # 0x1
        bstrpick.w      $r12,$r12,7,0
        bne     $r12,$r13,.L6

Note that st.b is incorrectly reordered after vldx.  It's because

(define_insn "lsx_vldx"
  [(set (match_operand:V16QI 0 "register_operand" "=f")
    (unspec:V16QI [(match_operand:DI 1 "register_operand" "r") 
                   (match_operand:DI 2 "reg_or_0_operand" "rJ")]
              UNSPEC_LSX_VLDX))]
  "ISA_HAS_LSX"
{
  return "vldx\t%w0,%1,%z2";
}
  [(set_attr "type" "simd_load")
   (set_attr "mode" "V16QI")])

seems (to the compiler) not accessing the memory at all.

Reply via email to