[PATCH] D110834: [PHIElimination] Account for INLINEASM_BR when inserting kills
Jay Foad via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 7 02:56:30 PDT 2021
foad updated this revision to Diff 377786.
foad added a comment.
Switch to a MIR test case.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D110834/new/
https://reviews.llvm.org/D110834
Files:
llvm/lib/CodeGen/PHIElimination.cpp
llvm/test/CodeGen/X86/callbr-asm-kill.mir
Index: llvm/test/CodeGen/X86/callbr-asm-kill.mir
===================================================================
--- llvm/test/CodeGen/X86/callbr-asm-kill.mir
+++ llvm/test/CodeGen/X86/callbr-asm-kill.mir
@@ -1,8 +1,9 @@
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -mtriple=x86_64-unknown-linux-gnu -verify-machineinstrs -O2 -run-pass=livevars,phi-node-elimination -o - %s | FileCheck %s
-# FIXME: The COPY from [[MOV64rm]] should not be killed, because there is a
-# subsequent use of [[MOV64rm]] in the INLINEASM_BR instruction.
+# Check that the COPY from [[MOV64rm]] is not killed, because there is a
+# subsequent use of [[MOV64rm]] in the INLINEASM_BR instruction which should be
+# killed instead.
--- |
; ModuleID = '<stdin>'
source_filename = "<stdin>"
@@ -65,8 +66,8 @@
; CHECK-NEXT: $rdi = COPY killed [[COPY3]]
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @foo, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
- ; CHECK-NEXT: [[COPY4:%[0-9]+]]:gr64 = COPY killed [[MOV64rm]]
- ; CHECK-NEXT: INLINEASM_BR &"", 9 /* sideeffect mayload attdialect */, 196654 /* mem:m */, [[MOV64rm]], 1, $noreg, 0, $noreg, 13 /* imm */, blockaddress(@test1, %ir-block.loop)
+ ; CHECK-NEXT: [[COPY4:%[0-9]+]]:gr64 = COPY [[MOV64rm]]
+ ; CHECK-NEXT: INLINEASM_BR &"", 9 /* sideeffect mayload attdialect */, 196654 /* mem:m */, killed [[MOV64rm]], 1, $noreg, 0, $noreg, 13 /* imm */, blockaddress(@test1, %ir-block.loop)
; CHECK-NEXT: JMP_1 %bb.2
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.2.end:
Index: llvm/lib/CodeGen/PHIElimination.cpp
===================================================================
--- llvm/lib/CodeGen/PHIElimination.cpp
+++ llvm/lib/CodeGen/PHIElimination.cpp
@@ -524,9 +524,8 @@
// case, we should mark the last such terminator as being the killing
// block, not the copy.
MachineBasicBlock::iterator KillInst = opBlock.end();
- MachineBasicBlock::iterator FirstTerm = opBlock.getFirstTerminator();
- for (MachineBasicBlock::iterator Term = FirstTerm;
- Term != opBlock.end(); ++Term) {
+ for (MachineBasicBlock::iterator Term = InsertPos; Term != opBlock.end();
+ ++Term) {
if (Term->readsRegister(SrcReg))
KillInst = Term;
}
@@ -536,7 +535,7 @@
if (reusedIncoming || !IncomingReg) {
// We may have to rewind a bit if we didn't insert a copy this time.
- KillInst = FirstTerm;
+ KillInst = InsertPos;
while (KillInst != opBlock.begin()) {
--KillInst;
if (KillInst->isDebugInstr())
@@ -583,9 +582,8 @@
if (!isLiveOut) {
MachineBasicBlock::iterator KillInst = opBlock.end();
- MachineBasicBlock::iterator FirstTerm = opBlock.getFirstTerminator();
- for (MachineBasicBlock::iterator Term = FirstTerm;
- Term != opBlock.end(); ++Term) {
+ for (MachineBasicBlock::iterator Term = InsertPos;
+ Term != opBlock.end(); ++Term) {
if (Term->readsRegister(SrcReg))
KillInst = Term;
}
@@ -595,7 +593,7 @@
if (reusedIncoming || !IncomingReg) {
// We may have to rewind a bit if we didn't just insert a copy.
- KillInst = FirstTerm;
+ KillInst = InsertPos;
while (KillInst != opBlock.begin()) {
--KillInst;
if (KillInst->isDebugInstr())
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D110834.377786.patch
Type: text/x-patch
Size: 3710 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211007/ba5596aa/attachment.bin>
More information about the llvm-commits
mailing list