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 --- a/llvm/test/CodeGen/X86/statepoint-fixup-copy-prop.mir +++ b/llvm/test/CodeGen/X86/statepoint-fixup-copy-prop.mir @@ -1,4 +1,4 @@ -# RUN: not --crash llc -o - %s -run-pass fixup-statepoint-caller-saved -verify-machineinstrs 2>&1 | FileCheck %s +# 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" @@ -21,22 +21,11 @@ bb.0: liveins: $rax, $rdi, $rbp - - ; CHECK: # After Fixup Statepoint Caller Saved - ; CHECK: # Machine code for function test_cp: - ; CHECK: bb.0: - ; CHECK: liveins: $rax, $rdi, $rbp - ; CHECK: renamable $rdi = COPY killed 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, , implicit-def $rsp, implicit-def $ssp - ; CHECK: *** Bad machine code: Using an undefined physical register *** - ; CHECK: - function: test_cp - ; CHECK: - basic block: %bb.0 - ; CHECK: - instruction: MOV64mr %stack.1, 1, $noreg, 0, $noreg, killed $rax :: (store (s64) into %stack.1) - ; CHECK: - operand 5: killed $rax - ; CHECK: LLVM ERROR: Found 1 machine code errors. + ; 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