#include "Interface/IR/Passes.h" #include "Interface/IR/Passes/RegisterAllocationPass.h" #include "Interface/IR/PassManager.h" namespace FEXCore::IR { void PassManager::AddDefaultPasses() { Passes.emplace_back(std::unique_ptr(CreateRedundantContextLoadElimination())); Passes.emplace_back(std::unique_ptr(CreateConstProp())); Passes.emplace_back(std::unique_ptr(CreateRedundantFlagCalculationEliminination())); // Passes.emplace_back(std::unique_ptr(CreateDeadFlagCalculationEliminination())); Passes.emplace_back(std::unique_ptr(CreateSyscallOptimization())); Passes.emplace_back(std::unique_ptr(CreatePassDeadContextStoreElimination())); Passes.emplace_back(std::unique_ptr(CreatePassDeadCodeElimination())); // If the IR is compacted post-RA then the node indexing gets messed up and the backend isn't able to find the register assigned to a node // Compact before IR, don't worry about RA generating spills/fills Passes.emplace_back(std::unique_ptr(CreateIRCompaction())); } void PassManager::AddDefaultValidationPasses() { // Passes.emplace_back(std::unique_ptr(Validation::CreateIRValidation())); } bool PassManager::Run(OpDispatchBuilder *Disp) { bool Changed = false; for (auto const &Pass : Passes) { Changed |= Pass->Run(Disp); } return Changed; } }