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

--- Comment #21 from Hongtao Liu <liuhongt at gcc dot gnu.org> ---
typedef unsigned long mp_limb_t;
typedef long mp_size_t;
typedef unsigned long mp_bitcnt_t;

typedef mp_limb_t *mp_ptr;
typedef const mp_limb_t *mp_srcptr;

#define GMP_LIMB_BITS (sizeof(mp_limb_t) * 8)

#define GMP_LIMB_MAX (~ (mp_limb_t) 0)

mp_bitcnt_t
mpn_common_scan (mp_limb_t limb, mp_size_t i, mp_srcptr up, mp_size_t un,
                 mp_limb_t ux)
{
  unsigned cnt;

  while (limb == 0)
    {
      i++;
      if (i == un)
        return (ux == 0 ? ~(mp_bitcnt_t) 0 : un * GMP_LIMB_BITS);
      limb = ux ^ up[i];
    }
  return limb;
}

This one is miscompiled in 502.gcc_r

123  <bb 8> [local count: 862990464]:
124  _34 = ivtmp.20_20 * 32;
125  vect__5.15_59 = MEM <const vector(4) long unsigned int> [(const mp_limb_t
*)vectp.14_53 + _34 * 1];
126  mask_patt_9.16_61 = vect__5.15_59 == vect_cst__60;
127  ivtmp.20_32 = ivtmp.20_20 + 1;
128  if (mask_patt_9.16_61 == { -1, -1, -1, -1 })
129    goto <bb 5>; [94.50%]
130  else
131    goto <bb 9>; [5.50%]


is expanded to

 30.L18:
 31        movq    %rdi, %rdx
 32        incq    %rdi
 33        salq    $5, %rdx
 34        vpcmpeqq        (%rax,%rdx), %ymm3, %k0
 35        kmovb   %k0, %edx
 36        cmpb    $-1, %dl
 37        jne     .L21

Reply via email to