]> granicus.if.org Git - llvm/commitdiff
[X86] Preserve operand flag when expanding TCRETURNri
authorFrancis Visoiu Mistrih <francisvm@yahoo.com>
Fri, 5 Apr 2019 20:18:21 +0000 (20:18 +0000)
committerFrancis Visoiu Mistrih <francisvm@yahoo.com>
Fri, 5 Apr 2019 20:18:21 +0000 (20:18 +0000)
The expansion of TCRETURNri(64) would not keep operand flags like
undef/renamable/etc. which can result in machine verifier issues.

Also add plumbing to be able to use `-run-pass=x86-pseudo`.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357808 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86.h
lib/Target/X86/X86ExpandPseudo.cpp
lib/Target/X86/X86TargetMachine.cpp
test/CodeGen/X86/tailcall-pseudo-64.mir [new file with mode: 0644]
test/CodeGen/X86/tailcall-pseudo.mir [new file with mode: 0644]

index f1492265ccc9b37043891e072d0ee74e58168ceb..01f7c00aa516437f6c08effe5c164c664f2ff868 100644 (file)
@@ -136,6 +136,7 @@ void initializeWinEHStatePassPass(PassRegistry &);
 void initializeX86AvoidSFBPassPass(PassRegistry &);
 void initializeX86CallFrameOptimizationPass(PassRegistry &);
 void initializeX86CmovConverterPassPass(PassRegistry &);
+void initializeX86ExpandPseudoPass(PassRegistry&);
 void initializeX86CondBrFoldingPassPass(PassRegistry &);
 void initializeX86DomainReassignmentPass(PassRegistry &);
 void initializeX86ExecutionDomainFixPass(PassRegistry &);
index f587dd616291f183cf846bd0d93d5bf3878465aa..99d4ce64427f2f811015739052be7f269919a9d1 100644 (file)
@@ -26,6 +26,7 @@
 using namespace llvm;
 
 #define DEBUG_TYPE "x86-pseudo"
+#define X86_EXPAND_PSEUDO_NAME "X86 pseudo instruction expansion pass"
 
 namespace {
 class X86ExpandPseudo : public MachineFunctionPass {
@@ -65,8 +66,12 @@ private:
   bool ExpandMBB(MachineBasicBlock &MBB);
 };
 char X86ExpandPseudo::ID = 0;
+
 } // End anonymous namespace.
 
+INITIALIZE_PASS(X86ExpandPseudo, DEBUG_TYPE, X86_EXPAND_PSEUDO_NAME, false,
+                false)
+
 void X86ExpandPseudo::ExpandICallBranchFunnel(
     MachineBasicBlock *MBB, MachineBasicBlock::iterator MBBI) {
   MachineBasicBlock *JTMBB = MBB;
@@ -253,12 +258,14 @@ bool X86ExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
       for (unsigned i = 0; i != 5; ++i)
         MIB.add(MBBI->getOperand(i));
     } else if (Opcode == X86::TCRETURNri64) {
+      JumpTarget.setIsKill();
       BuildMI(MBB, MBBI, DL,
               TII->get(IsWin64 ? X86::TAILJMPr64_REX : X86::TAILJMPr64))
-          .addReg(JumpTarget.getReg(), RegState::Kill);
+          .add(JumpTarget);
     } else {
+      JumpTarget.setIsKill();
       BuildMI(MBB, MBBI, DL, TII->get(X86::TAILJMPr))
-          .addReg(JumpTarget.getReg(), RegState::Kill);
+          .add(JumpTarget);
     }
 
     MachineInstr &NewMI = *std::prev(MBBI);
index 89c5d2d66289c18091ec26e8e653e09ff70f2206..d0006650cf868b5a538f022b7a5215b95f45b786 100644 (file)
@@ -71,6 +71,7 @@ extern "C" void LLVMInitializeX86Target() {
   initializeFixupLEAPassPass(PR);
   initializeX86CallFrameOptimizationPass(PR);
   initializeX86CmovConverterPassPass(PR);
+  initializeX86ExpandPseudoPass(PR);
   initializeX86ExecutionDomainFixPass(PR);
   initializeX86DomainReassignmentPass(PR);
   initializeX86AvoidSFBPassPass(PR);
diff --git a/test/CodeGen/X86/tailcall-pseudo-64.mir b/test/CodeGen/X86/tailcall-pseudo-64.mir
new file mode 100644 (file)
index 0000000..71d2ebd
--- /dev/null
@@ -0,0 +1,10 @@
+#RUN: llc -verify-machineinstrs -mtriple=x86_64-apple-darwin -o - -run-pass=x86-pseudo %s | FileCheck %s
+---
+name:            tail_call_fail_64
+tracksRegLiveness: true
+body:             |
+  bb.0:
+    TCRETURNri64 undef renamable $rax, 0, csr_64, implicit $rsp, implicit $ssp
+    ; CHECK: TAILJMPr64 killed undef renamable $rax, csr_64, implicit $rsp, implicit $ssp
+
+...
diff --git a/test/CodeGen/X86/tailcall-pseudo.mir b/test/CodeGen/X86/tailcall-pseudo.mir
new file mode 100644 (file)
index 0000000..af52a4d
--- /dev/null
@@ -0,0 +1,10 @@
+#RUN: llc -verify-machineinstrs -mtriple=i386-apple-darwin -o - -run-pass=x86-pseudo %s | FileCheck %s
+---
+name:            tail_call_fail
+tracksRegLiveness: true
+body:             |
+  bb.0:
+    TCRETURNri undef renamable $eax, 0, csr_32, implicit $esp, implicit $ssp
+    ; CHECK: TAILJMPr killed undef renamable $eax, csr_32, implicit $esp, implicit $ssp
+
+...