llvm / llvm/llvm-project

`kmovd k0, edx`+`kmovb k1, k0` => `kmovd k1, edx`

Open
#198,779 3 comments 0 reactions 1 assignee Claimed by @RKSimon View on GitHub
backend:X86 confirmed missed-optimization
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

[LLVM Godbolt](https://llvm.godbo.lt/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1C1aANxakl9ZATwDKjdAGFUtAK4sGexwBk8DTAA5DwAjTGIQAGYAVlIAB1QFQjsGF3dPPQSk2wE/AOCWMIiYy0xrHIYhAiZiAjSPLy5S8pSqmoI8oNDwqNiFatr6jKb%2B9s6Cot6ASktUN2Jkdg4sGgCAanQFVAB9WlRRWjXTVDx0NYABAC84uO3MVQIIOIJiNYZ9pmf5zDeBBjcTGsAO7EQiYAS0ACeazEeGADDWXDWAFIAEzRDSkNZ4ABskhR6Kaa2er3eoi%2BxB%2B7wY/0BlKY6Ah0Nh8MRBOiqKxuPxaOikS5kVR7MkUzWewO2zcNNYmHQ2wZ6FeyIA7AAhZEaACC2EExEhIA1mrW7OiKMiABExQoEK88ILhVjIobjbycWbLYYznahbzYms%2BTiABzKjQATg0kmd7OV7rWl3uBDeAWA2PtrrWRGxeKj1ToawOh2OpwuJnMADo2CxkHFIWW4ho6w3uU8Xr8aQDDiyEUjeZjia3qbTDvTGQwoTDaHDu%2BzOVmeejlVykVQxEoplHeYHY8BMAQypg2IISdiGCE5gxNm83EDsYGscfebPudGN%2BjQ7GFG4Qleb8/efyXy1F1CQ0WMXilZA53Zd9M29V9oi4HsLQzJg8wLVMhXOUsWDLVRAxxMsQhYPBCMuBASMFCBvTWdE/Wo3kuA0dcgPZLgfWQvBkBYOI1jcYBEz/N8sWVeCyzLEiJI/fcbGxHtCSfe1aIFH1CS4eCuEiWMQkIUR%2Bgw9kxIk8SM1QM0nHtVRZORSJsHUnlkOtNwqCoehTEwGwSDMiyrJs1iAOs8yhUsvA1N8hI8C2BgsQCrdgsFazsDM6i%2B2oolqIUoUAOo6R9Lo%2B0cWUtYRJs9TTWsy1c0OdCYrWYLAwSkszBwlgmAUABrWUyz2Bky1MQM8EDRsW1JP4OzWEcmQnKc2U3QqiRq4LQsShicoW28GvjYgTgYZJYU25ijVYt1yrWHc93oQ8CGPfwzylS9/l/O9%2ByVdEUrxQDDoYmMTs/b8HqghjooXdStxO8CGEgwSEJjWD4pYhj3zB1CqrEQ5qKwprcPwwjiNI8iy0o9LojylSEMDA7gI5UCTs47jeP4gHCUXIrRPE4yfukgS5KpwqlP0hH4NRJDLW0ghdIEtN0UM4zMwC7yQoSwX2MtRznNc9yiCVSJAtqnzlvRIXou1%2BWluJE5IqNpxYowhqAuSubecKrL7Ry6iSbWAr9OK2yWMq/NUaOE4zgx8sWvazr%2BhITBev6wb6wgNaBttwk/WPQcxq7GbCU91LLethXfMfVEKfG3dA9OQ0VXNSutSwZADEpcvg%2BwisD2rWt60bcS8WG35YVa35yQIb5gVBPcmXvAdUH7hRB8%2BYfG4msdIS5PEl2xFgWuIYBRTRSI1K1Q064bn50ZbvCCKIkiQjIijUSowVlN31E4c1I/3JPpvGtD1qOvQMtI6UhjgNIaid6o2UniNIe3xCp4E3jUYAeddYF2wM/SITpD61w/jUH4YCGoh2ar/Tq3V/59RAfHNOHwKSYFgfA7eSDFoJQYetGyaDIxag4DMWgnBoi8C8BwLQpBUCcB8D4AAagAWTWAASQAEprC2PMRYBJ968AIJoThMw2ogAQmWZUkguBBlRKGfRxNQw4lDPoTgkg%2BEaKEZwXgCgQCYnUQIzhpA4CwCQGgbidBwjkEoD4uIfiIgmBsMQKUbU%2BB0D3MQJxEAQh2O0swPUnAeCkGSTUSEAB5EI2gNZpN4D4y62Tl52KwCEPiThUZOO4LwLALUjDiDcaQfAlIbB4DcrUwR9x3JuD3IU8gggyh2MnCEYgWSXBYDsS8OBgy3LEDPEoc0B5DDAEnEYDRMwXJMGAAoMReBMBAmyXERggz%2BCCBEGIdgUgZCCEUCodQLTdBNAMJs7C%2Bg8AhCcZAGYqBngpFqQAWmyZpIFVY4huHKpcBgCzeFCIWaCLAPyIAzCsBrFIDgLxDEaKQXw/guiFB6E0LIyQBA4syIkMlDBxjdAiCMTmrQBh1FcA0PQ6KOkCDaLUWlRL6WWGZRSkYzLeWTC4GiuYCwblcJ4bYlpwiOBiloJBCA4M2qiggLgQgnk97irUVsrRIBJCDXRIGfeIZ0SSEkBofeViOA2NICwCQGhMT8MEQqxxzjSCuK0FMGVHBURyvdQ471BrSALKSPYSQQA%3D%3D%3D)

```llvm
define dso_local void @zpp_ext(ptr nocapture nonnull writeonly align 1 %0, i64 %1, ptr nocapture nonnull readonly align 1 %2, i64 %3, i32 %4) local_unnamed_addr {
Entry:
%5 = lshr i32 %4, 3
%6 = and i32 %5, 536870904
%7 = zext nneg i32 %6 to i64
tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %0, ptr nonnull readonly align 1 %2, i64 %7, i1 false)
%8 = getelementptr inbounds nuw i8, ptr %2, i64 %7
%9 = sub nuw i64 %3, %7
%10 = trunc i64 %9 to i32
%11 = tail call i32 @llvm.x86.bmi.bzhi.32(i32 255, i32 %10)
%12 = icmp ugt i64 %9, 7
%..i.i.i = select i1 %12, i32 255, i32 %11
%13 = bitcast i32 %..i.i.i to <32 x i1>
%14 = shufflevector <32 x i1> %13, <32 x i1> poison, <8 x i32>
%15 = tail call <8 x i8> @llvm.masked.load.v8i8.p0(ptr nonnull readonly align 1 %8, i32 1, <8 x i1> %14, <8 x i8> zeroinitializer)
%16 = getelementptr inbounds nuw i8, ptr %0, i64 %7
%17 = sub nuw i64 %1, %7
%18 = trunc i64 %17 to i32
%19 = tail call i32 @llvm.x86.bmi.bzhi.32(i32 255, i32 %18)
%20 = icmp ugt i64 %17, 7
%..i.i = select i1 %20, i32 255, i32 %19
%21 = bitcast i32 %..i.i to <32 x i1>
%22 = shufflevector <32 x i1> %21, <32 x i1> poison, <8 x i32>
tail call void @llvm.masked.store.v8i8.p0(<8 x i8> %15, ptr nonnull align 1 %16, i32 1, <8 x i1> %22)
ret void
}

declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #1
declare i32 @llvm.x86.bmi.bzhi.32(i32, i32) #2
declare void @llvm.masked.store.v8i8.p0(<8 x i8>, ptr nocapture, i32 immarg, <8 x i1>) #3
declare <8 x i8> @llvm.masked.load.v8i8.p0(ptr nocapture, i32 immarg, <8 x i1>, <8 x i8>) #4
```

Compiles to:

```diff
zpp_ext: # @zpp_ext
push rbp
push r15
push r14
push r13
push r12
push rbx
push rax
mov ebx, r8d
shr ebx, 6
mov r13, rsi
mov r15, rcx
mov r12, rdx
mov r14, rdi
mov rsi, rdx
lea rbp, [8*rbx]
mov rdx, rbp
call memcpy@PLT
sub r15, rbp
mov eax, 255
bzhi ecx, eax, r15d
cmp r15, 8
cmovae ecx, eax
sub r13, rbp
+ kmovd k1, ecx
- kmovd k0, ecx
bzhi ecx, eax, r13d
cmp r13, 8
- kmovb k1, k0
cmovae ecx, eax
vmovdqu8 xmm0 {k1} {z}, xmmword ptr [r12 + 8*rbx]
+ kmovd k1, ecx
- kmovd k0, ecx
- kmovb k1, k0
vmovdqu8 xmmword ptr [r14 + 8*rbx] {k1}, xmm0
add rsp, 8
pop rbx
pop r12
pop r13
pop r14
pop r15
pop rbp
ret
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.