-
Notifications
You must be signed in to change notification settings - Fork 12.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[X86] Fix liveness information when expanding X86::EH_SjLj_LongJmp64
test/CodeGen/X86/shadow-stack.ll has the following machine verifier errors: ``` *** Bad machine code: Using a killed virtual register *** - function: bar - basic block: %bb.6 entry (0x7fdc81857818) - instruction: %3:gr64 = MOV64rm killed %2:gr64, 1, $noreg, 8, $noreg - operand 1: killed %2:gr64 *** Bad machine code: Using a killed virtual register *** - function: bar - basic block: %bb.6 entry (0x7fdc81857818) - instruction: $rsp = MOV64rm killed %2:gr64, 1, $noreg, 16, $noreg - operand 1: killed %2:gr64 *** Bad machine code: Virtual register killed in block, but needed live out. *** - function: bar - basic block: %bb.2 entry (0x7fdc818574f8) Virtual register %2 is used after the block. ``` The fix here is to only copy the machine operand's register without the kill flags for all the instructions except the very last one of the sequence. I had to insert dummy PHIs in the test case to force the NoPHI function property to be set to false. More on this here: https://llvm.org/PR38439 Differential Revision: https://reviews.llvm.org/D50260 llvm-svn: 340033
- Loading branch information
Showing
2 changed files
with
57 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
# RUN: llc -mtriple=x86_64-- -run-pass=expand-isel-pseudos -verify-machineinstrs -o - %s | FileCheck %s | ||
# Check that we're not copying the kill flags with the operands from the pseudo | ||
# instruction. | ||
--- | | ||
define void @bar() { ret void } | ||
|
||
!llvm.module.flags = !{!0} | ||
|
||
!0 = !{i32 4, !"cf-protection-return", i32 1} | ||
... | ||
--- | ||
name: bar | ||
# CHECK-LABEL: name: bar | ||
alignment: 4 | ||
tracksRegLiveness: true | ||
body: | | ||
bb.0: | ||
%0:gr64 = IMPLICIT_DEF | ||
; CHECK: %0:gr64 = IMPLICIT_DEF | ||
EH_SjLj_LongJmp64 killed %0, 1, $noreg, 0, $noreg | ||
; CHECK: bb.3: | ||
; CHECK: MOV64rm %0 | ||
; CHECK-NOT: MOV64rm killed %0 | ||
; CHECK: bb.7: | ||
; CHECK-NEXT: MOV64rm %0 | ||
; CHECK-NOT: MOV64rm killed %0 | ||
; CHECK-NEXT: MOV64rm %0 | ||
; CHECK-NOT: MOV64rm killed %0 | ||
; CHECK-NEXT: MOV64rm killed %0 | ||
; FIXME: Dummy PHI to set the property NoPHIs to false. PR38439. | ||
bb.2: | ||
%1:gr64 = PHI undef %1, %bb.2, undef %1, %bb.2 | ||
JMP_1 %bb.2 | ||
... |