llvm / llvm/llvm-project

[AMD] Broadcasting u64 from Vector of u64's should avoid `vpermpd`/`vpermq` in favor of `vshufps`/`vshufd`

Open
#191,763 4 comments 0 reactions 1 assignee Claimed by @RKSimon View on GitHub
backend:X86 question
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:21,fontUsePx:'0',j:1,lang:zig,selection:(endColumn:27,endLineNumber:1,positionColumn:27,positionLineNumber:1,selectionStartColumn:27,selectionStartLineNumber:1,startColumn:27,startLineNumber:1),source:'export+fn+foo(x:+@Vector(4,+u64))+@Vector(8,+u64)+%7B%0A++++return+@splat(x%5B1%5D)%3B%0A%7D%0A%0Aexport+fn+bar(x:+@Vector(32,+u8))+@Vector(8,+u64)+%7B%0A++++return+@splat(@as(@Vector(4,+u64),+@bitCast(x))%5B1%5D)%3B%0A%7D'),l:'5',n:'0',o:'Zig+source+%231',t:'0')),k:44.228888164329966,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((g:!((h:compiler,i:(compiler:ztrunk,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'0',intel:'0',libraryCode:'0',trim:'1',verboseDemangling:'0'),flagsViewOpen:'1',fontScale:21,fontUsePx:'0',j:1,lang:zig,libs:!(),options:'-O+ReleaseFast+-mcpu%3Dznver5+-target+x86_64-linux+-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:55.77111183567004,l:'4',m:53.74917053749171,n:'0',o:'',s:0,t:'0'),(g:!((h:ir,i:('-fno-discard-value-names':'0',compilerName:'zig+trunk',demangle-symbols:'0',editorid:1,filter-attributes:'0',filter-comments:'0',filter-debug-info:'0',filter-declarations:'1',filter-instruction-metadata:'0',filter-library-functions:'1',fontScale:14,fontUsePx:'0',j:1,selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),show-optimized:'0',treeid:0,wrap:'1'),l:'5',n:'0',o:'LLVM+IR+Viewer+zig+trunk+(Editor+%231,+Compiler+%231)',t:'0')),header:(),l:'4',m:46.25082946250829,n:'0',o:'',s:0,t:'0')),k:55.77111183567004,l:'3',n:'0',o:'',t:'0')),l:'2',n:'0',o:'',t:'0')),version:4)
[LLVM Godbolt](https://llvm.godbo.lt/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:llvm,selection:(endColumn:2,endLineNumber:6,positionColumn:1,positionLineNumber:1,selectionStartColumn:2,selectionStartLineNumber:6,startColumn:1,startLineNumber:1),source:'define+%3C8+x+i64%3E+@foo(%3C32+x+i8%3E+%250)+unnamed_addr+align+1+%7B%0AEntry:%0A++%251+%3D+bitcast+%3C32+x+i8%3E+%250+to+%3C4+x+i64%3E%0A++%252+%3D+shufflevector+%3C4+x+i64%3E+%251,+%3C4+x+i64%3E+poison,+%3C8+x+i32%3E+%3Ci32+1,+i32+1,+i32+1,+i32+1,+i32+1,+i32+1,+i32+1,+i32+1%3E%0A++ret+%3C8+x+i64%3E+%252%0A%7D%0A%0Adefine+%3C8+x+i64%3E+@bar(%3C4+x+i64%3E+%250)+unnamed_addr+align+1+%7B%0AEntry:%0A++%251+%3D+shufflevector+%3C4+x+i64%3E+%250,+%3C4+x+i64%3E+poison,+%3C8+x+i32%3E+%3Ci32+1,+i32+1,+i32+1,+i32+1,+i32+1,+i32+1,+i32+1,+i32+1%3E%0A++ret+%3C8+x+i64%3E+%251%0A%7D%0A'),l:'5',n:'0',o:'LLVM+IR+source+%231',t:'0')),k:51.74168297455969,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:llctrunk,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:14,fontUsePx:'0',j:1,lang:llvm,libs:!(),options:'-O3+-mcpu%3Dznver5',overrides:!(),selection:(endColumn:12,endLineNumber:10,positionColumn:12,positionLineNumber:10,selectionStartColumn:12,selectionStartLineNumber:10,startColumn:12,startLineNumber:10),source:1),l:'5',n:'0',o:'+llc+(trunk)+(Editor+%231)',t:'0')),k:48.25831702544031,l:'4',m:100,n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4)

```llvm
define <8 x i64> @foo(<32 x i8> %0) unnamed_addr align 1 {
Entry:
%1 = bitcast <32 x i8> %0 to <4 x i64>
%2 = shufflevector <4 x i64> %1, <4 x i64> poison, <8 x i32>
ret <8 x i64> %2
}
```

Gives us:

```asm
.LCPI0_0:
.quad 1 # 0x1
foo: # @foo
vbroadcastsd zmm1, qword ptr [rip + .LCPI0_0] # zmm1 = [1,1,1,1,1,1,1,1]
vpermpd zmm0, zmm1, zmm0
ret
```

Should be:

```asm
bar: # @bar
vshufps xmm0, xmm0, xmm0, 238 # xmm0 = xmm0[2,3,2,3]
vbroadcastsd zmm0, xmm0
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.