[AVX-512] Match shufflevector-zero-extend of k-mask result
- 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
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