"16-byte Reload"+`vpextrq rdx, xmm0, 1` => "latter 8 byte reload"
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
I have real code similar to this: ([LLVM Godbolt](https://llvm.godbo.lt/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:llvm,selection:(endColumn:1,endLineNumber:27,positionColumn:1,positionLineNumber:27,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:'declare+%3C2+x+i64%3E+@llvm.masked.load.v2i64.p0(ptr,+i32+immarg,+%3C2+x+i1%3E,+%3C2+x+i64%3E)%0Adeclare+void+@clobber()%0Adeclare+i64+@llvm.fshl.i64(i64,+i64,+i64)%0A%0Adefine+void+@repro(ptr+%25src,+ptr+%25dst,+i64+%25sh)+%7B%0Aentry:%0A++%25mask32+%3D+bitcast+i32+3+to+%3C32+x+i1%3E%0A++%25mask+%3D+shufflevector+%3C32+x+i1%3E+%25mask32,+%3C32+x+i1%3E+poison,+%3C2+x+i32%3E+%3Ci32+0,+i32+1%3E%0A%0A++%25vec+%3D+call+%3C2+x+i64%3E+@llvm.masked.load.v2i64.p0(%0A++++++ptr+align+8+%25src,%0A++++++i32+8,%0A++++++%3C2+x+i1%3E+%25mask,%0A++++++%3C2+x+i64%3E+zeroinitializer)%0A%0A++%25lo+%3D+extractelement+%3C2+x+i64%3E+%25vec,+i64+0%0A++store+i64+%25lo,+ptr+%25dst,+align+8%0A%0A++call+void+@clobber()%0A%0A++%25hi+%3D+extractelement+%3C2+x+i64%3E+%25vec,+i64+1%0A++%25r+%3D+call+i64+@llvm.fshl.i64(i64+%25hi,+i64+%25lo,+i64+%25sh)%0A++%25out+%3D+getelementptr+i8,+ptr+%25dst,+i64+8%0A++store+i64+%25r,+ptr+%25out,+align+8%0A++ret+void%0A%7D%0A'),l:'5',n:'0',o:'LLVM+IR+source+%231',t:'0')),k:55.19244734931009,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%3Demeraldrapids',overrides:!(),selection:(endColumn:12,endLineNumber:24,positionColumn:12,positionLineNumber:24,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+llc+(trunk)+(Editor+%231)',t:'0')),k:44.80755265068991,l:'4',m:100,n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4))
```llvm
declare <2 x i64> @llvm.masked.load.v2i64.p0(ptr, i32 immarg, <2 x i1>, <2 x i64>)
declare void @clobber()
declare i64 @llvm.fshl.i64(i64, i64, i64)
define void @repro(ptr %src, ptr %dst, i64 %sh) {
entry:
%mask32 = bitcast i32 3 to <32 x i1>
%mask = shufflevector <32 x i1> %mask32, <32 x i1> poison, <2 x i32>
%vec = call <2 x i64> @llvm.masked.load.v2i64.p0(
ptr align 8 %src,
i32 8,
<2 x i1> %mask,
<2 x i64> zeroinitializer)
%lo = extractelement <2 x i64> %vec, i64 0
store i64 %lo, ptr %dst, align 8
call void @clobber()
%hi = extractelement <2 x i64> %vec, i64 1
%r = call i64 @llvm.fshl.i64(i64 %hi, i64 %lo, i64 %sh)
%out = getelementptr i8, ptr %dst, i64 8
store i64 %r, ptr %out, align 8
ret void
}
```
Emit:
```asm
repro: # @repro
push r15
push r14
push rbx
sub rsp, 16
mov rbx, rdx
mov r14, rsi
mov eax, 3
kmovd k1, eax
vmovdqu64 xmm0 {k1} {z}, xmmword ptr [rdi]
vmovdqa xmmword ptr [rsp], xmm0 # 16-byte Spill
vmovq r15, xmm0
vmovq qword ptr [rsi], xmm0
call clobber@PLT
vmovdqa xmm0, xmmword ptr [rsp] # 16-byte Reload
vpextrq rax, xmm0, 1
mov ecx, ebx
shld rax, r15, cl
mov qword ptr [r14 + 8], rax
add rsp, 16
pop rbx
pop r14
pop r15
ret
```
Should be:
```diff
repro: # @repro
push r15
push r14
push rbx
sub rsp, 16
mov rbx, rdx
mov r14, rsi
mov eax, 3
kmovd k1, eax
vmovdqu64 xmm0 {k1} {z}, xmmword ptr [rdi]
vmovdqa xmmword ptr [rsp], xmm0 # 16-byte Spill
vmovq r15, xmm0
vmovq qword ptr [rsi], xmm0
call clobber@PLT
- vmovdqa xmm0, xmmword ptr [rsp] # 16-byte Reload
- vpextrq rax, xmm0, 1
+ mov rax, qword ptr [rsp + 8] # upper half of 16-byte reload
mov ecx, ebx
shld rax, r15, cl
mov qword ptr [r14 + 8], rax
add rsp, 16
pop rbx
pop r14
pop r15
ret
```
Contributor guide
Assessment
This issue has not been assessed yet.