diff --git a/llvm/lib/CodeGen/FixupStatepointCallerSaved.cpp b/llvm/lib/CodeGen/FixupStatepointCallerSaved.cpp --- a/llvm/lib/CodeGen/FixupStatepointCallerSaved.cpp +++ b/llvm/lib/CodeGen/FixupStatepointCallerSaved.cpp @@ -153,12 +153,17 @@ RI = ++MachineBasicBlock::iterator(Def); IsKill = DestSrc->Source->isKill(); - // There are no uses of original register between COPY and STATEPOINT. - // There can't be any after STATEPOINT, so we can eliminate Def. if (!Use) { + // There are no uses of original register between COPY and STATEPOINT. + // There can't be any after STATEPOINT, so we can eliminate Def. LLVM_DEBUG(dbgs() << "spillRegisters: removing dead copy " << *Def); Def->eraseFromParent(); + } else if (IsKill) { + // COPY will remain in place, spill will be inserted *after* it, so it is + // not a kill of source anymore. + const_cast(DestSrc->Source)->setIsKill(false); } + return SrcReg; } diff --git a/llvm/test/CodeGen/X86/statepoint-fixup-copy-prop.mir b/llvm/test/CodeGen/X86/statepoint-fixup-copy-prop.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/X86/statepoint-fixup-copy-prop.mir @@ -0,0 +1,34 @@ +# RUN: llc -o - %s -run-pass fixup-statepoint-caller-saved -verify-machineinstrs | FileCheck %s + +--- | + target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" + target triple = "x86_64-pc-linux-gnu" + + declare void @foo(i64) + + define i8 addrspace(1)* @test_cp(i64 %a, i64 %b, i64 %c, i8 addrspace(1)* %p) gc "statepoint-example" { + ret i8 addrspace(1)* undef + } +... +--- +name: test_cp +alignment: 16 +tracksRegLiveness: true +liveins: + - { reg: '$rdi', virtual-reg: '' } +frameInfo: +body: | + bb.0: + liveins: $rax, $rdi, $rbp + + ; CHECK: renamable $rdi = COPY renamable $rax + ; CHECK: MOV64mr %stack.1, 1, $noreg, 0, $noreg, killed $rax :: (store (s64) into %stack.1) + ; CHECK: renamable $rax = MOV64rm renamable $rdi, 1, $noreg, 16, $noreg + ; CHECK: MOV64mr %stack.0, 1, $noreg, 0, $noreg, killed $rax :: (store (s64) into %stack.0) + ; CHECK: STATEPOINT 0, 0, 0, @foo, 2, 0, 2, 0, 2, 1, 1, 8, %stack.0, 0, 2, 1, 1, 8, %stack.1, 0, 2, 0, 2, 1, 0, 0, csr_64, implicit-def $rsp, implicit-def $ssp :: (load (s64) from %stack.0), (load store (s64) on %stack.1) + renamable $rdi = COPY killed renamable $rax + renamable $rax = MOV64rm renamable $rdi, 1, $noreg, 16, $noreg + renamable $rdi = STATEPOINT 0, 0, 0, @foo, 2, 0, 2, 0, 2, 1, renamable $rax, 2, 1, killed renamable $rdi(tied-def 0), 2, 0, 2, 1, 0, 0, csr_64, implicit-def $rsp, implicit-def $ssp + $rax = COPY killed renamable $rdi + RET 0, killed $rax +...