llvm/llvm-project

[AVX-512] Look for masked `vpmovqb` opportunities on Zen 4+

Open

#156,883 建立於 2025年9月4日

在 GitHub 查看
 (9 留言) (0 反應) (1 負責人)C++ (10,782 fork)batch import
backend:X86good first issuellvm:SelectionDAGmissed-optimization

倉庫指標

Star
 (26,378 star)
PR 合併指標
 (平均合併 1天 2小時) (30 天內合併 1,000 個 PR)

描述

Zig version: (Godbolt)

export fn foo(x: @Vector(8, u64), y: @Vector(8, u64)) @Vector(8, u8) {
    return @select(u8, x == y, @popCount(x), @as(@Vector(8, u8), @splat(0)));
}

LLVM version: (Godbolt)

define dso_local range(i8 0, 65) <8 x i8> @foo(<8 x i64> %0, <8 x i64> %1) local_unnamed_addr {
Entry:
  %2 = icmp eq <8 x i64> %0, %1
  %3 = tail call range(i64 0, 65) <8 x i64> @llvm.ctpop.v8i64(<8 x i64> %0)
  %4 = trunc nuw nsw <8 x i64> %3 to <8 x i8>
  %5 = select <8 x i1> %2, <8 x i8> %4, <8 x i8> zeroinitializer
  ret <8 x i8> %5
}

declare <8 x i64> @llvm.ctpop.v8i64(<8 x i64>) #1

Emits:

foo:
        vpcmpeqq        k1, zmm0, zmm1
        vpopcntq        zmm0, zmm0
        vpmovqb xmm0, zmm0
        vmovdqu8        xmm0 {k1} {z}, xmm0
        vzeroupper
        ret

Should be:

foo:
        vpcmpeqq        k1, zmm0, zmm1
        vpopcntq        zmm0, zmm0
        vpmovqb xmm0 {k1}, zmm0
        vzeroupper
        ret

貢獻者指南