[PATCH] D11696: [x86] machine combiner reassociation: mark EFLAGS operand as 'dead'
Sanjay Patel
spatel at rotateright.com
Fri Jul 31 15:28:14 PDT 2015
spatel created this revision.
spatel added reviewers: Gerolf, kbsmith1, qcolombet.
spatel added a subscriber: llvm-commits.
In the commentary for D11660, I noted that I wasn't sure if it was alright to create new integer machine instructions without also creating the implicit EFLAGS operand. From what I can see, the implicit operand is always created by the MachineInstrBuilder based on the instruction type, so we don't have to do that explicitly. However, in reviewing the debug output, I noticed that the operand was not marked as 'dead'. I think the machine combiner should do that to preserve future optimization opportunities that may be checking for that dead EFLAGS operand themselves.
http://reviews.llvm.org/D11696
Files:
lib/Target/X86/X86InstrInfo.cpp
test/CodeGen/X86/machine-combiner-int.ll
Index: test/CodeGen/X86/machine-combiner-int.ll
===================================================================
--- test/CodeGen/X86/machine-combiner-int.ll
+++ test/CodeGen/X86/machine-combiner-int.ll
@@ -1,4 +1,5 @@
-; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=x86-64 < %s | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -print-machineinstrs -o /dev/null 2>&1 | FileCheck %s --check-prefix=DEAD
; Verify that integer multiplies are reassociated. The first multiply in
; each test should be independent of the result of the preceding add (lea).
@@ -23,6 +24,12 @@
; CHECK-NEXT: imull %ecx, %edx
; CHECK-NEXT: imull %edx, %eax
; CHECK-NEXT: retq
+
+; DEAD-LABEL: Machine InstCombiner:
+; DEAD: ADD32rr
+; DEAD-NEXT: IMUL32rr{{.*}}%EFLAGS<imp-def,dead>
+; DEAD-NEXT: IMUL32rr{{.*}}%EFLAGS<imp-def,dead>
+
%t0 = add i32 %x0, %x1
%t1 = mul i32 %x2, %t0
%t2 = mul i32 %x3, %t1
Index: lib/Target/X86/X86InstrInfo.cpp
===================================================================
--- lib/Target/X86/X86InstrInfo.cpp
+++ lib/Target/X86/X86InstrInfo.cpp
@@ -6503,15 +6503,31 @@
BuildMI(*MF, Prev.getDebugLoc(), TII->get(Opcode), NewVR)
.addReg(RegX, getKillRegState(KillX))
.addReg(RegY, getKillRegState(KillY));
- InsInstrs.push_back(MIB1);
-
MachineInstrBuilder MIB2 =
BuildMI(*MF, Root.getDebugLoc(), TII->get(Opcode), RegC)
.addReg(RegA, getKillRegState(KillA))
.addReg(NewVR, getKillRegState(true));
- InsInstrs.push_back(MIB2);
- // Record old instructions for deletion.
+ // Integer instructions define an implicit EFLAGS source register operand.
+ // Mark those operands as dead to be helpful to subsequent iterations of this
+ // pass or other passes.
+ if (MIB1->getNumOperands() == 4) {
+ MachineOperand &Eflags1 = MIB1->getOperand(3);
+ assert(Eflags1.isReg() && Eflags1.getReg() == X86::EFLAGS &&
+ "Unexpected operand in reassociable instruction");
+ Eflags1.setIsDead();
+
+ assert(MIB2->getNumOperands() == 4 &&
+ "Unexpected instruction type for reassociation");
+ MachineOperand &Eflags2 = MIB2->getOperand(3);
+ assert(Eflags2.isReg() && Eflags2.getReg() == X86::EFLAGS &&
+ "Unexpected operand in reassociable instruction");
+ Eflags2.setIsDead();
+ }
+
+ // Record new instructions for insertion and old instructions for deletion.
+ InsInstrs.push_back(MIB1);
+ InsInstrs.push_back(MIB2);
DelInstrs.push_back(&Prev);
DelInstrs.push_back(&Root);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D11696.31173.patch
Type: text/x-patch
Size: 2635 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150731/37d77782/attachment.bin>
More information about the llvm-commits
mailing list