"16-byte Spill"+`vmovq rax, xmm0`+"8-byte Spill" => just 16-byte spill
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
```llvm
define <1 x i64> @example.repro(ptr %0, i64 %1, i32 %2, <2 x i1> %3, i64 %4) {
Entry:
%5 = zext i32 %2 to i64
%6 = tail call <2 x i64> @llvm.masked.load.v2i64.p0(ptr null, <2 x i1> %3, <2 x i64> zeroinitializer)
%.0.vec.extract166.i = extractelement <2 x i64> %6, i64 0
%7 = tail call i64 @llvm.x86.bmi.pdep.64(i64 %.0.vec.extract166.i, i64 %4)
store i64 %7, ptr null, align 8
%8 = sub i32 %2, 1
%9 = getelementptr i8, ptr %0, i64 8
%10 = lshr i32 %8, 1
%11 = zext i32 %10 to i64
tail call void @llvm.memset.p0.i64(ptr %9, i8 0, i64 %11, i1 false)
%12 = icmp eq i64 %4, 0
br i1 %12, label %example.zpp.exit, label %Else.i
Else.i: ; preds = %Entry
%.0.vec.extract170.i = extractelement <2 x i64> %6, i64 1
%13 = xor i64 %1, 1
%14 = tail call i64 @llvm.fshl.i64(i64 %.0.vec.extract170.i, i64 %.0.vec.extract166.i, i64 %13)
%15 = zext i32 %8 to i64
%16 = shl i64 %14, %15
%17 = getelementptr [8 x i8], ptr %9, i64 %11
store i64 %16, ptr %17, align 8
%18 = insertelement <1 x i64> zeroinitializer, i64 %5, i64 0
ret <1 x i64> %18
example.zpp.exit: ; preds = %Entry
ret <1 x i64> zeroinitializer
}
; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr writeonly captures(none), i8, i64, i1 immarg) #0
; Function Attrs: nocallback nofree nosync nounwind willreturn memory(none)
declare i64 @llvm.x86.bmi.pdep.64(i64, i64) #1
; Function Attrs: nocallback nocreateundeforpoison nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.fshl.i64(i64, i64, i64) #2
; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: read)
declare <2 x i64> @llvm.masked.load.v2i64.p0(ptr captures(none), <2 x i1>, <2 x i64>) #3
attributes #0 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(none) }
attributes #2 = { nocallback nocreateundeforpoison nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { nocallback nofree nosync nounwind willreturn memory(argmem: read) }
```
Should emit:
```diff
example.repro: # @example.repro
push rbp
push r15
push r14
push r13
push r12
push rbx
sub rsp, 40
mov r13, rcx
mov r15d, edx
mov r14, rsi
mov rbx, rdi
vpsllq xmm0, xmm0, 63
vpmovq2m k1, xmm0
vmovdqu64 xmm0 {k1} {z}, xmmword ptr [0]
vmovdqa xmmword ptr [rsp + 16], xmm0 # 16-byte Spill
vmovq rax, xmm0
- mov qword ptr [rsp + 8], rax # 8-byte Spill
pdep rax, rax, rcx
mov qword ptr [0], rax
lea ebp, [r15 - 1]
add rbx, 8
mov r12d, ebp
shr r12d
mov rdi, rbx
xor esi, esi
mov rdx, r12
call memset@PLT
test r13, r13
je .LBB0_2
mov eax, r15d
vmovdqa xmm0, xmmword ptr [rsp + 16] # 16-byte Reload
vpextrq rdx, xmm0, 1
xor r14d, 1
mov ecx, r14d
- mov rsi, qword ptr [rsp + 8] # 8-byte Reload
+ mov rsi, qword ptr [rsp + 16] # 8-byte Reload
shld rdx, rsi, cl
shlx rcx, rdx, rbp
mov qword ptr [rbx + 8*r12], rcx
jmp .LBB0_3
.LBB0_2: # %example.zpp.exit
xor eax, eax
.LBB0_3: # %example.zpp.exit
add rsp, 40
pop rbx
pop r12
pop r13
pop r14
pop r15
pop rbp
ret
```
With https://github.com/llvm/llvm-project/issues/199181:
```diff
example.repro: # @example.repro
push rbp
push r15
push r14
push r13
push r12
push rbx
sub rsp, 40
mov r13, rcx
mov r15d, edx
mov r14, rsi
mov rbx, rdi
vpsllq xmm0, xmm0, 63
vpmovq2m k1, xmm0
vmovdqu64 xmm0 {k1} {z}, xmmword ptr [0]
vmovdqa xmmword ptr [rsp + 16], xmm0 # 16-byte Spill
vmovq rax, xmm0
- mov qword ptr [rsp + 8], rax # 8-byte Spill
pdep rax, rax, rcx
mov qword ptr [0], rax
lea ebp, [r15 - 1]
add rbx, 8
mov r12d, ebp
shr r12d
mov rdi, rbx
xor esi, esi
mov rdx, r12
call memset@PLT
test r13, r13
je .LBB0_2
mov eax, r15d
- vmovdqa xmm0, xmmword ptr [rsp + 16] # 16-byte Reload
- vpextrq rdx, xmm0, 1
+ mov rdx, qword ptr [rsp + 24] # 8-byte Reload
xor r14d, 1
mov ecx, r14d
- mov rsi, qword ptr [rsp + 8] # 8-byte Reload
+ mov rsi, qword ptr [rsp + 16] # 8-byte Reload
shld rdx, rsi, cl
shlx rcx, rdx, rbp
mov qword ptr [rbx + 8*r12], rcx
jmp .LBB0_3
.LBB0_2: # %example.zpp.exit
xor eax, eax
.LBB0_3: # %example.zpp.exit
add rsp, 40
pop rbx
pop r12
pop r13
pop r14
pop r15
pop rbp
ret
```
Contributor guide
Assessment
This issue has not been assessed yet.