//===----- PostRAHazardRecognizer.cpp - hazard recognizer -----------------===// // // 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 // //===----------------------------------------------------------------------===// // /// \file /// This runs the hazard recognizer and emits noops when necessary. This /// gives targets a way to run the hazard recognizer without running one of /// the schedulers. Example use cases for this pass would be: /// /// - Targets that need the hazard recognizer to be run at -O0. /// - Targets that want to guarantee that hazards at the beginning of /// scheduling regions are handled correctly. The post-RA scheduler is /// a top-down scheduler, but when there are multiple scheduling regions /// in a basic block, it visits the regions in bottom-up order. This /// makes it impossible for the scheduler to gauranttee it can correctly /// handle hazards at the beginning of scheduling regions. /// /// This pass traverses all the instructions in a program in top-down order. /// In contrast to the instruction scheduling passes, this pass never resets /// the hazard recognizer to ensure it can correctly handles noop hazards at /// the beginning of blocks. // //===----------------------------------------------------------------------===// #include "llvm/ADT/Statistic.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/ScheduleHazardRecognizer.h" #include "llvm/CodeGen/TargetInstrInfo.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" #include "llvm/InitializePasses.h" #include "llvm/Pass.h" usingnamespacellvm; #define DEBUG_TYPE … STATISTIC(NumNoops, "Number of noops inserted"); namespace { class PostRAHazardRecognizer : public MachineFunctionPass { … }; char PostRAHazardRecognizer::ID = …; } char &llvm::PostRAHazardRecognizerID = …; INITIALIZE_PASS(…) bool PostRAHazardRecognizer::runOnMachineFunction(MachineFunction &Fn) { … }