llvm / llvm/llvm-project

[AVX-512] Match shufflevector-zero-extend of k-mask result

Open
#188,704 1 comment 0 reactions 0 assignees View on GitHub
backend:X86
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

[Zig Godbolt](https://zig.godbo.lt/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:16,fontUsePx:'0',j:1,lang:zig,selection:(endColumn:2,endLineNumber:10,positionColumn:2,positionLineNumber:10,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:'const+std+%3D+@import(%22std%22)%3B%0A%0Aexport+fn+foo(x:+@Vector(16,+u8),+y:+@Vector(4,+u32))+u32+%7B%0A++++const+a+%3D+x+%3E+@as(@Vector(16,+u8),+@splat(0))%3B%0A++++const+b+%3D+y+%3E+@as(@Vector(4,+u32),+@splat(0))%3B%0A++++if+(0+%3C+@as(u16,+@bitCast(a+%7C+std.simd.join(b,+@as(@Vector(12,+bool),+@splat(false))))))%0A++++++++return+10%3B%0A%0A++++return+40%3B%0A%7D'),l:'5',n:'0',o:'Zig+source+%231',t:'0')),k:45.48033225221075,l:'4',m:100,n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:ztrunk,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'0',trim:'1',verboseDemangling:'0'),flagsViewOpen:'1',fontScale:20,fontUsePx:'0',j:2,lang:zig,libs:!(),options:'-O+ReleaseFast+-target+x86_64-linux+-mcpu%3Dznver5+-fomit-frame-pointer',overrides:!(),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+zig+trunk+(Editor+%231)',t:'0')),header:(),k:54.51966774778925,l:'4',m:100,n:'0',o:'',s:0,t:'0')),l:'2',m:100,n:'0',o:'',t:'0')),version:4)
[LLVM Godbolt](https://llvm.godbo.lt/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1C1aANxakl9ZATwDKjdAGFUtAK4sGISdMcAZPAZMADkPACNMYglpAAdUBUI7Bhd3T29Y%2BMSBAKDQlgioqUtMa1sBIQImYgIUjy8fYtKkiqqCHJDwyOjLSuratIaFXrbAjvyuqQBKS1Q3YmR2DiwaIIBqdAVUAH1aVFFaVeJDYEwIPABmACZVrg1SVckuSdWL64ABflQIAFJzpy4AGyrVQvAAcv2wq2%2BlwArHcoX9JMCXlcIVDYU9Vrt9ls3AxmGx0FsmOh0MQoQB2ABC3w0AEFsIJiABPEC0umrdEw66/AAiL2QLBiqzWv3%2BQJBeHB50h0Lh9wAXpFUIFEmI8EriOzOXLzgj%2BXhBcLRYjka80XKuIrlarbOrNdquUi%2BasFAg3FQqPRTJgbCQEU4kZKuBbYed7mKgy8QzLVnE8JsGBG/lxrpLUbGxa9VvDs1aUddLvds%2BGC3GVYni1dywmBFXrvHK2XG3XmxXW9mW0m27Xu532wwIY65TD9a73Z7vb6iOSxamzTHZbDpAH58G0ZqVQw1bQNZFk%2BKzRnZX9s7nq/ns0Wy6W89e87eLyu8zD6zcAW%2BuBTP6DPwBON9LnPQtL2rS57zA84h3pHVYSBF1/TnCVo1DbkI1hGFh1hCkxzCQhRCGVdkLwRcuSBIhowBLCYQAOgYVACDHQ0hVWTAAEdKK5b8c2ohQYl9GirGnMchJsaMuTohi30kYCbg0R1iEwRjszlPiBNEgh2W%2BCleS0%2BlllGdZNh2PYxEOY5TjzeFHmebM3jCKofhTYjpSXeUAyjc1MwxZ5sTEXF8VYTAiRJMlKRpelGQIFk2RgrkeXOA0jRFTAiLNVyuXhTdbTwe1ImovUXWY41UsjI9LlQ/Nsu3O1dwdOK5WdRLxw9L1MB9P1Z1NddvJhUsyp6yEuwPNcCwtU9q1k0DCzfR8GwHN9hp7Jt%2B17RaFuWjtqyW1bE2gjkuVHF03VaqdOtXNMUN6lc50uki0TxZYRuI48AzPT9ANmz8IOuLg5puZ8L1fMtAU/bi81/EGALLIDAOm1ZwMAqCZWo%2BDmsQ5yF1Q68R2onCXTwggCMYpCsd68jUEo6jJJJ5ritYjiSPg7D7nkhrYTU5BBJKYTjp5sSSIk%2BiCGkqa2YOxTlOrVT%2BK5jStJ09kOGmWhOBhXgvA4LRSFQTg/D8AA1ABZVYAEkACVXVmeZSsuc4eFIAhNGV6YAGsQHlVWOEkDXnZ1zheAUEA7idrXldIOBYCQNAhTofcKAgGOYjjqITBsYg8Vdvg6AISIg4gMI/bw5gYu4Xhi6qZkAHkwm0adOAdmO2EEKuGFoVkw9ILAwjcYAnDEWgg7LrvMBYY5xE7/BFJsPAfSH7XMFUX03FzhveECXOve13cwiOFkXCwP3orwFg19IH1iDCeJMF5Ufx8CUAw%2BmL0mGABQDbwTAAHcq/4zWHf4IIEQYh2BFEAfIJQag/a6CtAYIwIATDmH0HgMIQdIDTFQDEMoDAh4AFoq56lwSwZAMQ3B8gVAwC%2B6sdYX2IHgLAaCIDTA0kkBwDBnCuDqHofwow8gFD0HEBI2D%2BheCtIIrIDB2h8ImI0aczRhgiL0Cw8owwpGdEKD0VoiirRDFaGo8YhRmHWwWBIFWatfad11hwLEtBkCrAgNFTOzwIC4EIIhO2TxeChy0JMN2Hs7hex9qQTW2srGB2Do7Z2vj9CcEuBY0JAdIlP2mBfBI9hJBAA)

```llvm
define dso_local range(i32 10, 41) i32 @foo(<16 x i8> %0, <4 x i32> %1) local_unnamed_addr {
Entry:
%2 = icmp ne <16 x i8> %0, zeroinitializer
%3 = icmp ne <4 x i32> %1, zeroinitializer
%4 = shufflevector <4 x i1> %3, <4 x i1> poison, <12 x i32>
%5 = shufflevector <12 x i1> %4, <12 x i1> zeroinitializer, <16 x i32>
%6 = or <16 x i1> %2, %5
%7 = bitcast <16 x i1> %6 to i16
%.not = icmp eq i16 %7, 0
%spec.select = select i1 %.not, i32 40, i32 10
ret i32 %spec.select
}
```

Results in:

```asm
foo: # @foo
mov ax, 15
vptestmd k1, xmm1, xmm1
vptestmb k0, xmm0, xmm0
mov ecx, 40
kmovd k2, eax
mov eax, 10
kandw k1, k1, k2
kortestw k0, k1
cmove eax, ecx
ret
```

Should be:

```asm
foo: # @foo
vptestmb k0, xmm0, xmm0
vptestmd k1, xmm1, xmm1
mov ecx, 40
mov eax, 10
kortestw k0, k1
cmove eax, ecx
ret
```

Contributor guide

Open the contributing guide

Research direction

Reproduce the issue from the Zig Godbolt link using -O ReleaseFast, x86_64-linux, and -mcpu=znver5, then inspect the linked LLVM IR and generated assembly. Trace the AVX-512 mask and shufflevector handling in the compiler backend; done means the redundant mask materialization and combination are eliminated as shown in the expected assembly.

Written by the indexing model from the issue text.

Assessment

Tech stack
zig
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.