From: Francis Visoiu Mistrih Date: Fri, 5 Apr 2019 20:18:21 +0000 (+0000) Subject: [X86] Preserve operand flag when expanding TCRETURNri X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=051d4978f8dc5cd11c005c94585c16c2b0d01c7c;p=llvm [X86] Preserve operand flag when expanding TCRETURNri 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 --- diff --git a/lib/Target/X86/X86.h b/lib/Target/X86/X86.h index f1492265ccc..01f7c00aa51 100644 --- a/lib/Target/X86/X86.h +++ b/lib/Target/X86/X86.h @@ -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 &); diff --git a/lib/Target/X86/X86ExpandPseudo.cpp b/lib/Target/X86/X86ExpandPseudo.cpp index f587dd61629..99d4ce64427 100644 --- a/lib/Target/X86/X86ExpandPseudo.cpp +++ b/lib/Target/X86/X86ExpandPseudo.cpp @@ -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); diff --git a/lib/Target/X86/X86TargetMachine.cpp b/lib/Target/X86/X86TargetMachine.cpp index 89c5d2d6628..d0006650cf8 100644 --- a/lib/Target/X86/X86TargetMachine.cpp +++ b/lib/Target/X86/X86TargetMachine.cpp @@ -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 index 00000000000..71d2ebdb06b --- /dev/null +++ b/test/CodeGen/X86/tailcall-pseudo-64.mir @@ -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 index 00000000000..af52a4ddef7 --- /dev/null +++ b/test/CodeGen/X86/tailcall-pseudo.mir @@ -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 + +...