diff --git a/llvm/lib/Target/X86/LLVMBuild.txt b/llvm/lib/Target/X86/LLVMBuild.txt --- a/llvm/lib/Target/X86/LLVMBuild.txt +++ b/llvm/lib/Target/X86/LLVMBuild.txt @@ -30,5 +30,5 @@ type = Library name = X86CodeGen parent = X86 -required_libraries = Analysis AsmPrinter CodeGen Core MC SelectionDAG Support Target X86Desc X86Info GlobalISel ProfileData CFGuard +required_libraries = Analysis AsmPrinter CodeGen Core MC Passes SelectionDAG Support Target X86Desc X86Info GlobalISel ProfileData CFGuard add_to_library_groups = X86 diff --git a/llvm/lib/Target/X86/X86PassRegistry.def b/llvm/lib/Target/X86/X86PassRegistry.def new file mode 100644 --- /dev/null +++ b/llvm/lib/Target/X86/X86PassRegistry.def @@ -0,0 +1,66 @@ +//===- X86PassRegistry.def - Registry of passes for X86 ---------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// X86 pass registry +// +//===----------------------------------------------------------------------===// + +// NOTE: NO INCLUDE GUARD DESIRED! + +#ifndef FUNCTION_PASS +#define FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR) +#endif + +#undef FUNCTION_PASS + +#ifndef DUMMY_FUNCTION_PASS +#define DUMMY_FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR) +#endif +DUMMY_FUNCTION_PASS("x86-win-eh-state", X86WinEHStatePass, ()) +#undef DUMMY_FUNCTION_PASS + +#ifndef MACHINE_FUNCTION_PASS +#define MACHINE_FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR) +#endif + +#undef MACHINE_FUNCTION_PASS + +// PASS_NAME is for mocking machine passes, remove it after all machine passes +// are added new pass manager interface. +#ifndef DUMMY_MACHINE_FUNCTION_PASS +#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR) +#endif +DUMMY_MACHINE_FUNCTION_PASS("x86-isel-dag", X86ISelDagPass, (getTM<X86TargetMachine>(), getOptLevel())) +DUMMY_MACHINE_FUNCTION_PASS("x86-global-basereg", X86GlobalBaseRegPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-condbr-folding", X86CondBrFoldingDummyPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-cmov-converter", X86CmovConverterDummyPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-fixup-setcc", X86FixupSetCCPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-opt-leas", X86OptimizeLEAsPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-callframe-opt", X86CallFrameOptimizationPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-avoid-store-foword-block", X86AvoidStoreForwardingBlocksPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-speculative-load-hardening", X86SpeculativeLoadHardeningPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-flags-copy-lowering", X86FlagsCopyLoweringDummyPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-win-alloc-expander", X86WinAllocaExpanderPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-domain-reassign", X86DomainReassignmentPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-fp-stackifier", X86FloatingPointStackifierPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-expand-pseudo", X86ExpandPseudoPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-exec-domain-fix", X86ExecutionDomainFixPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-indirectbr-tracking", X86IndirectBranchTrackingPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-issue-vzero-upper", X86IssueVZeroUpperPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-fixup-bwinsts", X86FixupBWInstsPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-pad-short-funcs", X86PadShortFunctionsPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-fixup-leas", X86FixupLEAsPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-evex-to-vex-insts", X86EvexToVexInstsPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-discriminate-memops", X86DiscriminateMemOpsPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-insert-prefetch", X86InsertPrefetchPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-insert-x87-wait", X86InsertX87waitPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-retpoline-thunks", X86RetpolineThunksPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-avoid-trailing-call", X86AvoidTrailingCallPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("x86-asm-printer", X86AsmPrinterPass, ()) +DUMMY_MACHINE_FUNCTION_PASS("cleanup-local-dyn-tls", CleanupLocalDynamicTLSPass, ()) +#undef DUMMY_MACHINE_FUNCTION_PASS \ No newline at end of file diff --git a/llvm/lib/Target/X86/X86TargetMachine.h b/llvm/lib/Target/X86/X86TargetMachine.h --- a/llvm/lib/Target/X86/X86TargetMachine.h +++ b/llvm/lib/Target/X86/X86TargetMachine.h @@ -49,6 +49,24 @@ // Set up the pass pipeline. TargetPassConfig *createPassConfig(PassManagerBase &PM) override; + Expected<std::pair<ModulePassManager, MachineFunctionPassManager>> + buildCodeGenPipeline(raw_pwrite_stream &, raw_pwrite_stream *, + CodeGenFileType, CGPassBuilderOption, + MachineFunctionAnalysisManager &, + PassInstrumentationCallbacks *) override; + + Expected<ModulePassManager> + parseIRPipeline(StringRef, CGPassBuilderOption, + MachineFunctionAnalysisManager &, + PassInstrumentationCallbacks *) override; + + Expected<MachineFunctionPassManager> + parseMIRPipeline(StringRef, CGPassBuilderOption, + MachineFunctionAnalysisManager &, + PassInstrumentationCallbacks *) override; + + bool isMachinePass(StringRef Name) const override; + TargetLoweringObjectFile *getObjFileLowering() const override { return TLOF.get(); } diff --git a/llvm/lib/Target/X86/X86TargetMachine.cpp b/llvm/lib/Target/X86/X86TargetMachine.cpp --- a/llvm/lib/Target/X86/X86TargetMachine.cpp +++ b/llvm/lib/Target/X86/X86TargetMachine.cpp @@ -26,6 +26,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Triple.h" #include "llvm/Analysis/TargetTransformInfo.h" +#include "llvm/CodeGen/CodeGenPassBuilder.h" #include "llvm/CodeGen/ExecutionDomainFix.h" #include "llvm/CodeGen/GlobalISel/CallLowering.h" #include "llvm/CodeGen/GlobalISel/IRTranslator.h" @@ -555,3 +556,281 @@ std::unique_ptr<CSEConfigBase> X86PassConfig::getCSEConfig() const { return getStandardCSEConfigForOpt(TM->getOptLevel()); } + +namespace { + +#define DUMMY_FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR) \ + struct PASS_NAME : public PassInfoMixin<PASS_NAME> { \ + template <typename... Ts> PASS_NAME(Ts &&...) {} \ + PreservedAnalyses run(Function &, FunctionAnalysisManager &) { \ + return PreservedAnalyses::all(); \ + } \ + }; +#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR) \ + struct PASS_NAME : public PassInfoMixin<PASS_NAME> { \ + template <typename... Ts> PASS_NAME(Ts &&...) {} \ + PreservedAnalyses run(MachineFunction &, \ + MachineFunctionAnalysisManager &) { \ + return PreservedAnalyses::all(); \ + } \ + static AnalysisKey Key; \ + }; \ + AnalysisKey PASS_NAME::Key; +#include "X86PassRegistry.def" + +/// X86 Code Generator Pass Configuration Options. +class X86CodeGenPassBuilder : public CodeGenPassBuilder<X86CodeGenPassBuilder> { +public: + X86CodeGenPassBuilder(X86TargetMachine &TM, CGPassBuilderOption Opt, + PassInstrumentationCallbacks *PIC) + : CodeGenPassBuilder<X86CodeGenPassBuilder>(TM, Opt, PIC) { + // Target-specific `CGPassBuilderOption` could be overridden here. + } + + Error addTargetPass(AddIRPass &, StringRef) const; + Error addTargetPass(AddMachinePass &, StringRef) const; + void addIRPasses(AddIRPass &) const; + void addPreISel(AddIRPass &) const; + Error addInstSelector(AddMachinePass &) const; + Error addIRTranslator(AddMachinePass &) const; + Error addLegalizeMachineIR(AddMachinePass &) const; + Error addRegBankSelect(AddMachinePass &) const; + Error addGlobalInstructionSelect(AddMachinePass &) const; + void addILPOpts(AddMachinePass &) const; + void addMachineSSAOptimization(AddMachinePass &) const; + void addPreRegAlloc(AddMachinePass &) const; + void addPostRegAlloc(AddMachinePass &) const; + void addPreEmitPass(AddMachinePass &) const; + void addPreEmitPass2(AddMachinePass &) const; + void addPreSched2(AddMachinePass &) const; + void addAsmPrinter(AddMachinePass &, CreateMCStreamer) const; +}; + +} // namespace + +Error X86CodeGenPassBuilder::addTargetPass(AddIRPass &addPass, + StringRef Name) const { +#define FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR) \ + if (Name == NAME) { \ + addPass(PASS_NAME CONSTRUCTOR); \ + return Error::success(); \ + } +#define DUMMY_FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR) \ + if (Name == NAME) { \ + addPass(PASS_NAME CONSTRUCTOR); \ + return Error::success(); \ + } +#include "X86PassRegistry.def" + + return Error::success(); +} + +Error X86CodeGenPassBuilder::addTargetPass(AddMachinePass &addPass, + StringRef Name) const { +#define MACHINE_FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR) \ + if (Name == NAME) { \ + addPass(PASS_NAME CONSTRUCTOR); \ + return Error::success(); \ + } +#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR) \ + if (Name == NAME) { \ + addPass(PASS_NAME CONSTRUCTOR); \ + return Error::success(); \ + } +#include "X86PassRegistry.def" + + return Error::success(); +} + +void X86CodeGenPassBuilder::addIRPasses(AddIRPass &addPass) const { + addPass(AtomicExpandPass()); + + CodeGenPassBuilder::addIRPasses(addPass); + + if (TM.getOptLevel() != CodeGenOpt::None) + addPass(InterleavedAccessPass()); + + // Add passes that handle indirect branch removal and insertion of a retpoline + // thunk. These will be a no-op unless a function subtarget has the retpoline + // feature enabled. + addPass(IndirectBrExpandPass()); + + // Add Control Flow Guard checks. + const Triple &TT = TM.getTargetTriple(); + if (TT.isOSWindows()) { + if (TT.getArch() == Triple::x86_64) { + addPass(CFGuardDispatchPass()); + } else { + addPass(CFGuardCheckPass()); + } + } +} + +Error X86CodeGenPassBuilder::addInstSelector(AddMachinePass &addPass) const { + // Install an instruction selector. + addPass(X86ISelDagPass(getTM<X86TargetMachine>(), getOptLevel())); + + // For ELF, cleanup any local-dynamic TLS accesses. + if (TM.getTargetTriple().isOSBinFormatELF() && + TM.getOptLevel() != CodeGenOpt::None) + addPass(CleanupLocalDynamicTLSPass()); + + addPass(X86GlobalBaseRegPass()); + return Error::success(); +} + +Error X86CodeGenPassBuilder::addIRTranslator(AddMachinePass &addPass) const { + addPass(IRTranslatorPass()); + return Error::success(); +} + +Error X86CodeGenPassBuilder::addLegalizeMachineIR( + AddMachinePass &addPass) const { + addPass(LegalizerPass()); + return Error::success(); +} + +Error X86CodeGenPassBuilder::addRegBankSelect(AddMachinePass &addPass) const { + addPass(RegBankSelectPass()); + return Error::success(); +} + +Error X86CodeGenPassBuilder::addGlobalInstructionSelect( + AddMachinePass &addPass) const { + addPass(InstructionSelectPass()); + return Error::success(); +} + +void X86CodeGenPassBuilder::addILPOpts(AddMachinePass &addPass) const { + if (EnableCondBrFoldingPass) + addPass(X86CondBrFoldingDummyPass()); // TODO + addPass(EarlyIfConverterPass()); + if (EnableMachineCombinerPass) + addPass(MachineCombinerPass()); + addPass(X86CmovConverterDummyPass()); // TODO +} + +void X86CodeGenPassBuilder::addPreISel(AddIRPass &addPass) const { + // Only add this pass for 32-bit x86 Windows. + const Triple &TT = TM.getTargetTriple(); + if (TT.isOSWindows() && TT.getArch() == Triple::x86) + addPass(X86WinEHStatePass()); +} + +void X86CodeGenPassBuilder::addPreRegAlloc(AddMachinePass &addPass) const { + if (TM.getOptLevel() != CodeGenOpt::None) { + addPass(LiveRangeShrinkPass()); + addPass(X86FixupSetCCPass()); + addPass(X86OptimizeLEAsPass()); + addPass(X86CallFrameOptimizationPass()); + addPass(X86AvoidStoreForwardingBlocksPass()); + } + + addPass(X86SpeculativeLoadHardeningPass()); + addPass(X86FlagsCopyLoweringDummyPass()); // TODO: port to NPM and rename + addPass(X86WinAllocaExpanderPass()); +} + +void X86CodeGenPassBuilder::addMachineSSAOptimization( + AddMachinePass &addPass) const { + addPass(X86DomainReassignmentPass()); + CodeGenPassBuilder::addMachineSSAOptimization(addPass); +} + +void X86CodeGenPassBuilder::addPostRegAlloc(AddMachinePass &addPass) const { + addPass(X86FloatingPointStackifierPass()); +} + +void X86CodeGenPassBuilder::addPreSched2(AddMachinePass &addPass) const { + addPass(X86ExpandPseudoPass()); +} + +void X86CodeGenPassBuilder::addPreEmitPass(AddMachinePass &addPass) const { + if (getOptLevel() != CodeGenOpt::None) { + addPass(X86ExecutionDomainFixPass()); + addPass(BreakFalseDepsPass()); + } + + addPass(X86IndirectBranchTrackingPass()); + + addPass(X86IssueVZeroUpperPass()); + + if (getOptLevel() != CodeGenOpt::None) { + addPass(X86FixupBWInstsPass()); + addPass(X86PadShortFunctionsPass()); + addPass(X86FixupLEAsPass()); + } + addPass(X86EvexToVexInstsPass()); + addPass(X86DiscriminateMemOpsPass()); + addPass(X86InsertPrefetchPass()); + addPass(X86InsertX87waitPass()); +} + +void X86CodeGenPassBuilder::addPreEmitPass2(AddMachinePass &addPass) const { + const Triple &TT = TM.getTargetTriple(); + const MCAsmInfo *MAI = TM.getMCAsmInfo(); + + addPass(X86RetpolineThunksPass()); + + // Insert extra int3 instructions after trailing call instructions to avoid + // issues in the unwinder. + if (TT.isOSWindows() && TT.getArch() == Triple::x86_64) + addPass(X86AvoidTrailingCallPass()); + + // Verify basic block incoming and outgoing cfa offset and register values and + // correct CFA calculation rule where needed by inserting appropriate CFI + // instructions. + if (!TT.isOSDarwin() && + (!TT.isOSWindows() || + MAI->getExceptionHandlingType() == ExceptionHandling::DwarfCFI)) + addPass(CFIInstrInserterPass()); + // Identify valid longjmp targets for Windows Control Flow Guard. + if (TT.isOSWindows()) + addPass(CFGuardLongjmpPass()); +} + +void X86CodeGenPassBuilder::addAsmPrinter(AddMachinePass &addPass, + CreateMCStreamer callback) const { + addPass(X86AsmPrinterPass(callback)); +} + +Expected<std::pair<ModulePassManager, MachineFunctionPassManager>> +X86TargetMachine::buildCodeGenPipeline(raw_pwrite_stream &Out, + raw_pwrite_stream *DwoOut, + CodeGenFileType FileType, + CGPassBuilderOption Opts, + MachineFunctionAnalysisManager &MFAM, + PassInstrumentationCallbacks *PIC) { + X86CodeGenPassBuilder X86CGPB{*this, Opts, PIC}; + X86CGPB.registerAnalyses(MFAM); + return X86CGPB.buildPipeline(Out, DwoOut, FileType); +} + +Expected<ModulePassManager> X86TargetMachine::parseIRPipeline( + StringRef PipelineText, CGPassBuilderOption Opts, + MachineFunctionAnalysisManager &MFAM, PassInstrumentationCallbacks *PIC) { + X86CodeGenPassBuilder X86CGPB{*this, Opts, PIC}; + X86CGPB.registerAnalyses(MFAM); + return X86CGPB.parseIRPipeline(PipelineText); +} + +Expected<MachineFunctionPassManager> X86TargetMachine::parseMIRPipeline( + StringRef PipelineText, CGPassBuilderOption Opts, + MachineFunctionAnalysisManager &MFAM, PassInstrumentationCallbacks *PIC) { + X86CodeGenPassBuilder X86CGPB{*this, Opts, PIC}; + X86CGPB.registerAnalyses(MFAM); + return X86CGPB.parseMIRPipeline(PipelineText); +} + +bool X86TargetMachine::isMachinePass(StringRef Name) const { +#define MACHINE_FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR) \ + if (Name == NAME) \ + return true; +#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR) \ + if (Name == NAME) \ + return true; +#include "X86PassRegistry.def" +#include "llvm/CodeGen/MachinePassRegistry.def" + + return false; +} diff --git a/llvm/test/CodeGen/Generic/llc-start-stop-instance-errors.ll b/llvm/test/CodeGen/Generic/llc-start-stop-instance-errors.ll --- a/llvm/test/CodeGen/Generic/llc-start-stop-instance-errors.ll +++ b/llvm/test/CodeGen/Generic/llc-start-stop-instance-errors.ll @@ -1,4 +1,6 @@ ; RUN: not --crash llc -debug-pass=Structure -stop-after=dead-mi-elimination,arst %s -o /dev/null 2>&1 \ ; RUN: | FileCheck -check-prefix=NOT-NUM %s +; RUN: not --crash llc -enable-new-pm -debug-pass-manager -stop-after=dead-mi-elimination,arst %s -o /dev/null 2>&1 \ +; RUN: | FileCheck -check-prefix=NOT-NUM %s ; NOT-NUM: LLVM ERROR: invalid pass instance specifier dead-mi-elimination,arst diff --git a/llvm/test/CodeGen/Generic/new-pm/llc-start-stop.ll b/llvm/test/CodeGen/Generic/new-pm/llc-start-stop.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/Generic/new-pm/llc-start-stop.ll @@ -0,0 +1,48 @@ +; RUN: llc < %s -enable-new-pm -debug-pass-manager -stop-after=verify \ +; RUN: -o /dev/null 2>&1 | FileCheck %s -check-prefix=STOP-AFTER +; STOP-AFTER: Running pass: AtomicExpandPass +; STOP-AFTER-NEXT: Running pass: VerifierPass +; STOP-AFTER-NOT: Running pass: + +; RUN: llc < %s -enable-new-pm -debug-pass-manager -stop-before=verify \ +; RUN: -o /dev/null 2>&1 | FileCheck %s -check-prefix=STOP-BEFORE +; STOP-BEFORE: Running pass: AtomicExpandPass +; STOP-BEFORE-NOT: Running pass: + +; RUN: llc < %s -enable-new-pm -debug-pass-manager -start-after=verify \ +; RUN: -o /dev/null 2>&1 | FileCheck %s -check-prefix=START-AFTER +; START-AFTER: Running pass: ModuleToFunctionPassAdaptor +; START-AFTER: Starting llvm::Function pass manager run +; START-AFTER-NOT: Running pass: +; START-AFTER: Running pass: {{.*}}LoopStrengthReducePass + +; RUN: llc < %s -enable-new-pm -debug-pass-manager -start-before=verify \ +; RUN: -o /dev/null 2>&1 | FileCheck %s -check-prefix=START-BEFORE +; START-BEFORE: Running pass: ModuleToFunctionPassAdaptor +; START-BEFORE: Starting llvm::Function pass manager run +; START-BEFORE-NOT: Running pass: +; START-BEFORE: Running pass: VerifierPass + +; RUN: not --crash llc < %s -enable-new-pm -start-before=nonexistent -o /dev/null 2>&1 \ +; RUN: | FileCheck %s -check-prefix=NONEXISTENT-START-BEFORE +; RUN: not --crash llc < %s -enable-new-pm -stop-before=nonexistent -o /dev/null 2>&1 \ +; RUN: | FileCheck %s -check-prefix=NONEXISTENT-STOP-BEFORE +; RUN: not --crash llc < %s -enable-new-pm -start-after=nonexistent -o /dev/null 2>&1 \ +; RUN: | FileCheck %s -check-prefix=NONEXISTENT-START-AFTER +; RUN: not --crash llc < %s -enable-new-pm -stop-after=nonexistent -o /dev/null 2>&1 \ +; RUN: | FileCheck %s -check-prefix=NONEXISTENT-STOP-AFTER +; NONEXISTENT-START-BEFORE: "nonexistent" pass could not be found. +; NONEXISTENT-STOP-BEFORE: "nonexistent" pass could not be found. +; NONEXISTENT-START-AFTER: "nonexistent" pass could not be found. +; NONEXISTENT-STOP-AFTER: "nonexistent" pass could not be found. + +; RUN: not --crash llc < %s -enable-new-pm -start-before=verify -start-after=verify \ +; RUN: -o /dev/null 2>&1 | FileCheck %s -check-prefix=DOUBLE-START +; RUN: not --crash llc < %s -enable-new-pm -stop-before=verify -stop-after=verify \ +; RUN: -o /dev/null 2>&1 | FileCheck %s -check-prefix=DOUBLE-STOP +; DOUBLE-START: start-before and start-after specified! +; DOUBLE-STOP: stop-before and stop-after specified! + +define void @f() { + ret void +} diff --git a/llvm/test/CodeGen/X86/new-pm/O0-pipeline.ll b/llvm/test/CodeGen/X86/new-pm/O0-pipeline.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/X86/new-pm/O0-pipeline.ll @@ -0,0 +1,73 @@ +; When EXPENSIVE_CHECKS are enabled, the machine verifier appears between each +; pass. Ignore it with 'grep -v'. +; RUN: llc -mtriple=x86_64-- -O0 -debug-pass-manager -enable-new-pm < %s \ +; RUN: -o /dev/null 2>&1 | grep -v 'Verify generated machine code' | FileCheck %s + +; REQUIRES: asserts + +; CHECK-LABEL: Running analysis: PassInstrumentationAnalysis +; CHECK-NEXT: Starting llvm::Module pass manager run. +; CHECK-NEXT: Running pass: PreISelIntrinsicLoweringPass +; CHECK-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PassManager{{.*}}> +; CHECK-NEXT: Running analysis: InnerAnalysisManagerProxy +; CHECK-NEXT: Running analysis: PassInstrumentationAnalysis +; CHECK-NEXT: Starting llvm::Function pass manager run. +; CHECK-NEXT: Running pass: AtomicExpandPass +; CHECK-NEXT: Running pass: VerifierPass +; CHECK-NEXT: Running analysis: VerifierAnalysis +; CHECK-NEXT: Running pass: GCLoweringPass +; CHECK-NEXT: Running pass: ShadowStackGCLoweringPass +; CHECK-NEXT: Running pass: LowerConstantIntrinsicsPass +; CHECK-NEXT: Running pass: UnreachableBlockElimPass +; CHECK-NEXT: Running pass: EntryExitInstrumenterPass +; CHECK-NEXT: Invalidating all non-preserved analyses for: +; CHECK-NEXT: Invalidating analysis: VerifierAnalysis +; CHECK-NEXT: Running pass: ScalarizeMaskedMemIntrinPass +; CHECK-NEXT: Running pass: ExpandReductionsPass +; CHECK-NEXT: Running analysis: TargetIRAnalysis +; CHECK-NEXT: Running pass: IndirectBrExpandPass +; CHECK-NEXT: Running pass: DwarfEHPass +; CHECK-NEXT: Running pass: SafeStackPass +; CHECK-NEXT: Running pass: StackProtectorPass +; CHECK-NEXT: Running pass: VerifierPass +; CHECK-NEXT: Running analysis: VerifierAnalysis +; CHECK-NEXT: Finished llvm::Function pass manager run. +; CHECK-NEXT: Invalidating all non-preserved analyses for: +; CHECK-NEXT: Finished llvm::Module pass manager run. +; CHECK-NEXT: Running analysis: MachineModuleAnalysis +; CHECK-NEXT: Starting llvm::MachineFunction pass manager run. +; CHECK-NEXT: Running analysis: PassInstrumentationAnalysis +; CHECK-NEXT: Running pass: {{.*}}X86ISelDagPass +; CHECK-NEXT: Running pass: {{.*}}X86GlobalBaseRegPass +; CHECK-NEXT: Running pass: FinalizeISelPass +; CHECK-NEXT: Running pass: LocalStackSlotPass +; CHECK-NEXT: Running pass: {{.*}}X86SpeculativeLoadHardeningPass +; CHECK-NEXT: Running pass: {{.*}}X86FlagsCopyLoweringDummyPass +; CHECK-NEXT: Running pass: {{.*}}X86WinAllocaExpanderPass +; CHECK-NEXT: Running pass: PHIEliminationPass +; CHECK-NEXT: Running pass: TwoAddressInstructionPass +; CHECK-NEXT: Running pass: RAFastPass +; CHECK-NEXT: Running pass: {{.*}}X86FloatingPointStackifierPass +; CHECK-NEXT: Running pass: PrologEpilogInserterPass +; CHECK-NEXT: Running pass: ExpandPostRAPseudosPass +; CHECK-NEXT: Running pass: {{.*}}X86ExpandPseudoPass +; CHECK-NEXT: Running pass: FEntryInserterPass +; CHECK-NEXT: Running pass: XRayInstrumentationPass +; CHECK-NEXT: Running pass: PatchableFunctionPass +; CHECK-NEXT: Running pass: {{.*}}X86IndirectBranchTrackingPass +; CHECK-NEXT: Running pass: {{.*}}X86IssueVZeroUpperPass +; CHECK-NEXT: Running pass: {{.*}}X86EvexToVexInstsPass +; CHECK-NEXT: Running pass: {{.*}}X86DiscriminateMemOpsPass +; CHECK-NEXT: Running pass: {{.*}}X86InsertPrefetchPass +; CHECK-NEXT: Running pass: {{.*}}X86InsertX87waitPass +; CHECK-NEXT: Running pass: FuncletLayoutPass +; CHECK-NEXT: Running pass: StackMapLivenessPass +; CHECK-NEXT: Running pass: LiveDebugValuesPass +; CHECK-NEXT: Running pass: {{.*}}X86RetpolineThunksPass +; CHECK-NEXT: Running pass: CFIInstrInserterPass +; CHECK-NEXT: Running pass: {{.*}}X86AsmPrinterPass +; CHECK-NEXT: Finished llvm::MachineFunction pass manager run. + +define void @f() { + ret void +} diff --git a/llvm/test/CodeGen/X86/new-pm/llc-start-stop-instance.ll b/llvm/test/CodeGen/X86/new-pm/llc-start-stop-instance.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/X86/new-pm/llc-start-stop-instance.ll @@ -0,0 +1,35 @@ +; RUN: llc -mtriple=x86_64-- -enable-new-pm -debug-pass-manager -stop-after=verify,1 \ +; RUN: %s -o /dev/null 2>&1 | FileCheck -check-prefix=STOP-AFTER-1 %s + +; RUN: llc -mtriple=x86_64-- -enable-new-pm -debug-pass-manager -stop-after=verify,0 \ +; RUN: %s -o /dev/null 2>&1 | FileCheck -check-prefix=STOP-AFTER-0 %s + +; RUN: llc -mtriple=x86_64-- -enable-new-pm -debug-pass-manager -stop-before=verify,1 \ +; RUN: %s -o /dev/null 2>&1 | FileCheck -check-prefix=STOP-BEFORE-1 %s + +; RUN: llc -mtriple=x86_64-- -enable-new-pm -debug-pass-manager -start-before=verify,1 \ +; RUN: %s -o /dev/null 2>&1 | FileCheck -check-prefix=START-BEFORE-1 %s + +; RUN: llc -mtriple=x86_64-- -enable-new-pm -debug-pass-manager -start-after=verify,1 \ +; RUN: %s -o /dev/null 2>&1 | FileCheck -check-prefix=START-AFTER-1 %s + + +; STOP-AFTER-1: Running pass: VerifierPass +; STOP-AFTER-1: Running pass: VerifierPass + +; STOP-AFTER-0-NOT: Running pass: VerifierPass +; STOP-AFTER-0: Running pass: VerifierPass +; STOP-AFTER-0-NOT: Running pass: VerifierPass + +; STOP-BEFORE-1: Running pass: VerifierPass +; STOP-BEFORE-1-NOT: Running pass: VerifierPass + +; START-BEFORE-1-NOT: Running pass: VerifierPass +; START-BEFORE-1: Running pass: VerifierPass +; START-BEFORE-1-NOT: Running pass: VerifierPass + +; START-AFTER-1-NOT: Running pass: VerifierPass + +define void @f() { + ret void +} diff --git a/llvm/test/CodeGen/X86/new-pm/opt-pipeline.ll b/llvm/test/CodeGen/X86/new-pm/opt-pipeline.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/X86/new-pm/opt-pipeline.ll @@ -0,0 +1,135 @@ +; When EXPENSIVE_CHECKS are enabled, the machine verifier appears between each +; pass. Ignore it with 'grep -v'. +; RUN: llc -mtriple=x86_64-- -O1 -debug-pass-manager -enable-new-pm < %s \ +; RUN: -o /dev/null 2>&1 | FileCheck %s +; RUN: llc -mtriple=x86_64-- -O2 -debug-pass-manager -enable-new-pm < %s \ +; RUN: -o /dev/null 2>&1 | FileCheck %s +; RUN: llc -mtriple=x86_64-- -O3 -debug-pass-manager -enable-new-pm < %s \ +; RUN: -o /dev/null 2>&1 | FileCheck %s + +; REQUIRES: asserts + +; CHECK-LABEL: Running analysis: PassInstrumentationAnalysis +; CHECK-NEXT: Starting llvm::Module pass manager run. +; CHECK-NEXT: Running pass: PreISelIntrinsicLoweringPass +; CHECK-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PassManager{{.*}}> +; CHECK-NEXT: Running analysis: InnerAnalysisManagerProxy +; CHECK-NEXT: Running analysis: PassInstrumentationAnalysis +; CHECK-NEXT: Starting llvm::Function pass manager run. +; CHECK-NEXT: Running pass: AtomicExpandPass +; CHECK-NEXT: Running pass: VerifierPass +; CHECK-NEXT: Running analysis: VerifierAnalysis +; CHECK-NEXT: Running pass: FunctionToLoopPassAdaptor<{{.*}}LoopStrengthReducePass{{.*}}> +; CHECK-NEXT: Starting llvm::Function pass manager run. +; CHECK-NEXT: Running pass: LoopSimplifyPass +; CHECK-NEXT: Running analysis: LoopAnalysis +; CHECK-NEXT: Running analysis: DominatorTreeAnalysis +; CHECK-NEXT: Running analysis: AssumptionAnalysis +; CHECK-NEXT: Running pass: LCSSAPass +; CHECK-NEXT: Finished llvm::Function pass manager run. +; CHECK-NEXT: Running pass: MergeICmpsPass +; CHECK-NEXT: Running analysis: TargetLibraryAnalysis +; CHECK-NEXT: Running analysis: TargetIRAnalysis +; CHECK-NEXT: Running analysis: AAManager +; CHECK-NEXT: Running pass: ExpandMemCmpPass +; CHECK-NEXT: Running pass: GCLoweringPass +; CHECK-NEXT: Running pass: ShadowStackGCLoweringPass +; CHECK-NEXT: Running pass: LowerConstantIntrinsicsPass +; CHECK-NEXT: Running pass: UnreachableBlockElimPass +; CHECK-NEXT: Running pass: ConstantHoistingPass +; CHECK-NEXT: Running analysis: BlockFrequencyAnalysis +; CHECK-NEXT: Running analysis: BranchProbabilityAnalysis +; CHECK-NEXT: Running analysis: PostDominatorTreeAnalysis +; CHECK-NEXT: Running analysis: OuterAnalysisManagerProxy +; CHECK-NEXT: Running pass: PartiallyInlineLibCallsPass +; CHECK-NEXT: Running pass: EntryExitInstrumenterPass +; CHECK-NEXT: Invalidating all non-preserved analyses for: +; CHECK-NEXT: Invalidating analysis: VerifierAnalysis +; CHECK-NEXT: Running pass: ScalarizeMaskedMemIntrinPass +; CHECK-NEXT: Running pass: ExpandReductionsPass +; CHECK-NEXT: Running pass: InterleavedAccessPass +; CHECK-NEXT: Running pass: IndirectBrExpandPass +; CHECK-NEXT: Running pass: CodeGenPreparePass +; CHECK-NEXT: Running pass: DwarfEHPass +; CHECK-NEXT: Running pass: SafeStackPass +; CHECK-NEXT: Running pass: StackProtectorPass +; CHECK-NEXT: Running pass: VerifierPass +; CHECK-NEXT: Running analysis: VerifierAnalysis +; CHECK-NEXT: Finished llvm::Function pass manager run. +; CHECK-NEXT: Invalidating all non-preserved analyses for: +; CHECK-NEXT: Finished llvm::Module pass manager run. +; CHECK-NEXT: Running analysis: MachineModuleAnalysis +; CHECK-NEXT: Starting llvm::MachineFunction pass manager run. +; CHECK-NEXT: Running analysis: PassInstrumentationAnalysis +; CHECK-NEXT: Running pass: {{.*}}X86ISelDagPass +; CHECK-NEXT: Running pass: {{.*}}CleanupLocalDynamicTLSPass +; CHECK-NEXT: Running pass: {{.*}}X86GlobalBaseRegPass +; CHECK-NEXT: Running pass: FinalizeISelPass +; CHECK-NEXT: Running pass: {{.*}}X86DomainReassignmentPass +; CHECK-NEXT: Running pass: EarlyTailDuplicatePass +; CHECK-NEXT: Running pass: OptimizePHIsPass +; CHECK-NEXT: Running pass: StackColoringPass +; CHECK-NEXT: Running pass: LocalStackSlotPass +; CHECK-NEXT: Running pass: DeadMachineInstructionElimPass +; CHECK-NEXT: Running pass: EarlyIfConverterPass +; CHECK-NEXT: Running pass: MachineCombinerPass +; CHECK-NEXT: Running pass: {{.*}}X86CmovConverterDummyPass +; CHECK-NEXT: Running pass: EarlyMachineLICMPass +; CHECK-NEXT: Running pass: MachineCSEPass +; CHECK-NEXT: Running pass: MachineSinkingPass +; CHECK-NEXT: Running pass: PeepholeOptimizerPass +; CHECK-NEXT: Running pass: DeadMachineInstructionElimPass +; CHECK-NEXT: Running pass: LiveRangeShrinkPass +; CHECK-NEXT: Running pass: {{.*}}X86FixupSetCCPass +; CHECK-NEXT: Running pass: {{.*}}X86OptimizeLEAsPass +; CHECK-NEXT: Running pass: {{.*}}X86CallFrameOptimizationPass +; CHECK-NEXT: Running pass: {{.*}}X86AvoidStoreForwardingBlocksPass +; CHECK-NEXT: Running pass: {{.*}}X86SpeculativeLoadHardeningPass +; CHECK-NEXT: Running pass: {{.*}}X86FlagsCopyLoweringDummyPass +; CHECK-NEXT: Running pass: {{.*}}X86WinAllocaExpanderPass +; CHECK-NEXT: Running pass: DetectDeadLanesPass +; CHECK-NEXT: Running pass: ProcessImplicitDefsPass +; CHECK-NEXT: Running pass: PHIEliminationPass +; CHECK-NEXT: Running pass: TwoAddressInstructionPass +; CHECK-NEXT: Running pass: RegisterCoalescerPass +; CHECK-NEXT: Running pass: RenameIndependentSubregsPass +; CHECK-NEXT: Running pass: MachineSchedulerPass +; CHECK-NEXT: Running pass: RAGreedyPass +; CHECK-NEXT: Running pass: VirtRegRewriterPass +; CHECK-NEXT: Running pass: StackSlotColoringPass +; CHECK-NEXT: Running pass: {{.*}}X86FloatingPointStackifierPass +; CHECK-NEXT: Running pass: PostRAMachineSinkingPass +; CHECK-NEXT: Running pass: ShrinkWrapPass +; CHECK-NEXT: Running pass: PrologEpilogInserterPass +; CHECK-NEXT: Running pass: BranchFolderPass +; CHECK-NEXT: Running pass: TailDuplicatePass +; CHECK-NEXT: Running pass: MachineCopyPropagationPass +; CHECK-NEXT: Running pass: ExpandPostRAPseudosPass +; CHECK-NEXT: Running pass: {{.*}}X86ExpandPseudoPass +; CHECK-NEXT: Running pass: PostRASchedulerPass +; CHECK-NEXT: Running pass: MachineBlockPlacementPass +; CHECK-NEXT: Running pass: FEntryInserterPass +; CHECK-NEXT: Running pass: XRayInstrumentationPass +; CHECK-NEXT: Running pass: PatchableFunctionPass +; CHECK-NEXT: Running pass: {{.*}}X86ExecutionDomainFixPass +; CHECK-NEXT: Running pass: BreakFalseDepsPass +; CHECK-NEXT: Running pass: {{.*}}X86IndirectBranchTrackingPass +; CHECK-NEXT: Running pass: {{.*}}X86IssueVZeroUpperPass +; CHECK-NEXT: Running pass: {{.*}}X86FixupBWInstsPass +; CHECK-NEXT: Running pass: {{.*}}X86PadShortFunctionsPass +; CHECK-NEXT: Running pass: {{.*}}X86FixupLEAsPass +; CHECK-NEXT: Running pass: {{.*}}X86EvexToVexInstsPass +; CHECK-NEXT: Running pass: {{.*}}X86DiscriminateMemOpsPass +; CHECK-NEXT: Running pass: {{.*}}X86InsertPrefetchPass +; CHECK-NEXT: Running pass: {{.*}}X86InsertX87waitPass +; CHECK-NEXT: Running pass: FuncletLayoutPass +; CHECK-NEXT: Running pass: StackMapLivenessPass +; CHECK-NEXT: Running pass: LiveDebugValuesPass +; CHECK-NEXT: Running pass: {{.*}}X86RetpolineThunksPass +; CHECK-NEXT: Running pass: CFIInstrInserterPass +; CHECK-NEXT: Running pass: {{.*}}X86AsmPrinterPass +; CHECK-NEXT: Finished llvm::MachineFunction pass manager run. + +define void @f() { + ret void +}