summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Lavin <markus.lavin@ericsson.com>2019-01-03 08:36:06 +0000
committerMarkus Lavin <markus.lavin@ericsson.com>2019-01-03 08:36:06 +0000
commit72b9deb21f12469d025e96fdb9af6aa316f96a47 (patch)
treee54a3161d5cc443bda46ad2c4ff333c18f8e2228
parent74e7d26090be48fb99b2c69e48ec66b5007390f3 (diff)
downloadbcm5719-llvm-72b9deb21f12469d025e96fdb9af6aa316f96a47.tar.gz
bcm5719-llvm-72b9deb21f12469d025e96fdb9af6aa316f96a47.zip
[CodeGen] Skip over dbg-instr in twoaddr pass
A DBG_VALUE between a two-address instruction and a following COPY would prevent rescheduleMIBelowKill optimization inside TwoAddressInstructionPass. Differential Revision: https://reviews.llvm.org/D55987 llvm-svn: 350289
-rw-r--r--llvm/lib/CodeGen/TwoAddressInstructionPass.cpp9
-rw-r--r--llvm/test/CodeGen/X86/twoaddr-dbg-value.mir27
2 files changed, 33 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp b/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp
index 2e2fe72e539..4b72f6a84ca 100644
--- a/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp
+++ b/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp
@@ -929,9 +929,12 @@ rescheduleMIBelowKill(MachineBasicBlock::iterator &mi,
MachineBasicBlock::iterator Begin = MI;
MachineBasicBlock::iterator AfterMI = std::next(Begin);
MachineBasicBlock::iterator End = AfterMI;
- while (End->isCopy() &&
- regOverlapsSet(Defs, End->getOperand(1).getReg(), TRI)) {
- Defs.push_back(End->getOperand(0).getReg());
+ while (End != MBB->end()) {
+ End = skipDebugInstructionsForward(End, MBB->end());
+ if (End->isCopy() && regOverlapsSet(Defs, End->getOperand(1).getReg(), TRI))
+ Defs.push_back(End->getOperand(0).getReg());
+ else
+ break;
++End;
}
diff --git a/llvm/test/CodeGen/X86/twoaddr-dbg-value.mir b/llvm/test/CodeGen/X86/twoaddr-dbg-value.mir
new file mode 100644
index 00000000000..f2d6c5df582
--- /dev/null
+++ b/llvm/test/CodeGen/X86/twoaddr-dbg-value.mir
@@ -0,0 +1,27 @@
+# RUN: llc -run-pass=livevars,twoaddressinstruction -mtriple=x86_64-- -o - %s | FileCheck %s
+---
+name: foo
+tracksRegLiveness: true
+body: |
+ bb.0:
+ liveins: $edi
+
+ %0:gr32 = COPY killed $edi
+ %1:gr32 = COPY killed %0
+ %4:gr32 = XOR32ri8 %1, 1, implicit-def dead $eflags
+ DBG_VALUE %4
+ %5:gr32 = COPY %4
+ PUSH32r killed %1, implicit-def $esp, implicit $esp
+ $eax = COPY killed %5
+ RETQ implicit killed $eax
+
+...
+
+# Verify that the DBG_VALUE instruction does not inhibit
+# TwoAddressInstructionPass::rescheduleMIBelowKill optimization
+
+# CHECK: PUSH32r %1, implicit-def $esp, implicit $esp
+# CHECK-NEXT: %2:gr32 = COPY killed %1
+# CHECK-NEXT: %2:gr32 = XOR32ri8 %2, 1, implicit-def dead $eflags
+# CHECK-NEXT: DBG_VALUE %2
+# CHECK-NEXT: %3:gr32 = COPY killed %2
OpenPOWER on IntegriCloud