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

--- Comment #1 from Hongtao.liu <crazylht at gmail dot com> ---
kmovw here is zero_extend, and at gimple level it's not redundant in loop.

  _31 = MEM[(const __m256i_u * {ref-all})n_5];
  _30 = MEM[(const __m256i_u * {ref-all})n_5 + 32B];
  _28 = VIEW_CONVERT_EXPR<__v16hi>(_31);
  _29 = __builtin_ia32_ucmpw256_mask (_28, _20, 0, 65535);
  _26 = VIEW_CONVERT_EXPR<__v16hi>(_30);
  _27 = __builtin_ia32_ucmpw256_mask (_26, _20, 0, 65535);
  _2 = (int) _27;
  _3 = (int) _29;
  _15 = __builtin_ia32_kortestzhi (_3, _2);
  _25 = (unsigned char) _15;
  if (_25 != 0)

but at rtl level, _28/_29 propagate into kortest and be partial redundant but
failed to sink or be eliminated.

(insn 29 27 30 3 (set (reg:SI 83 [ _2 ])
        (zero_extend:SI (reg:HI 111))) "test.c":24:32 147 {*zero_extendhisi2}
     (nil))
(insn 30 29 31 3 (set (reg:SI 116 [ _29 ])
        (zero_extend:SI (reg:HI 106))) "test.c":24:32 147 {*zero_extendhisi2}
     (nil))

(insn 58 56 60 8 (parallel [
            (set (reg:HI 120)
                (unspec:HI [
                        (subreg:HI (reg:SI 83 [ _2 ]) 0)
                    ] UNSPEC_TZCNT))
            (clobber (reg:CC 17 flags))

(insn 52 51 55 7 (parallel [
            (set (reg/v:SI 88 [ idx ])
                (ctz:SI (reg:SI 116 [ _29 ])))
            (clobber (reg:CC 17 flags))

Reply via email to