//===- bolt/Passes/DataflowInfoManager.cpp --------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // // This file implements the DataflowInfoManager class. // //===----------------------------------------------------------------------===// #include "bolt/Passes/DataflowInfoManager.h" namespace llvm { namespace bolt { ReachingDefOrUse &DataflowInfoManager::getReachingDefs() { if (RD) return *RD; assert(RA && "RegAnalysis required"); RD.reset(new ReachingDefOrUse(*RA, BF, std::nullopt, AllocatorId)); RD->run(); return *RD; } void DataflowInfoManager::invalidateReachingDefs() { RD.reset(nullptr); } ReachingDefOrUse &DataflowInfoManager::getReachingUses() { if (RU) return *RU; assert(RA && "RegAnalysis required"); RU.reset(new ReachingDefOrUse(*RA, BF, std::nullopt, AllocatorId)); RU->run(); return *RU; } void DataflowInfoManager::invalidateReachingUses() { RU.reset(nullptr); } LivenessAnalysis &DataflowInfoManager::getLivenessAnalysis() { if (LA) return *LA; assert(RA && "RegAnalysis required"); LA.reset(new LivenessAnalysis(*RA, BF, AllocatorId)); LA->run(); return *LA; } void DataflowInfoManager::invalidateLivenessAnalysis() { LA.reset(nullptr); } StackReachingUses &DataflowInfoManager::getStackReachingUses() { if (SRU) return *SRU; assert(FA && "FrameAnalysis required"); SRU.reset(new StackReachingUses(*FA, BF, AllocatorId)); SRU->run(); return *SRU; } void DataflowInfoManager::invalidateStackReachingUses() { SRU.reset(nullptr); } DominatorAnalysis &DataflowInfoManager::getDominatorAnalysis() { if (DA) return *DA; DA.reset(new DominatorAnalysis(BF, AllocatorId)); DA->run(); return *DA; } void DataflowInfoManager::invalidateDominatorAnalysis() { DA.reset(nullptr); } DominatorAnalysis &DataflowInfoManager::getPostDominatorAnalysis() { if (PDA) return *PDA; PDA.reset(new DominatorAnalysis(BF, AllocatorId)); PDA->run(); return *PDA; } void DataflowInfoManager::invalidatePostDominatorAnalysis() { PDA.reset(nullptr); } StackPointerTracking &DataflowInfoManager::getStackPointerTracking() { if (SPT) return *SPT; SPT.reset(new StackPointerTracking(BF, AllocatorId)); SPT->run(); return *SPT; } void DataflowInfoManager::invalidateStackPointerTracking() { invalidateStackAllocationAnalysis(); SPT.reset(nullptr); } ReachingInsns &DataflowInfoManager::getReachingInsns() { if (RI) return *RI; RI.reset(new ReachingInsns(BF, AllocatorId)); RI->run(); return *RI; } void DataflowInfoManager::invalidateReachingInsns() { RI.reset(nullptr); } ReachingInsns &DataflowInfoManager::getReachingInsnsBackwards() { if (RIB) return *RIB; RIB.reset(new ReachingInsns(BF, AllocatorId)); RIB->run(); return *RIB; } void DataflowInfoManager::invalidateReachingInsnsBackwards() { RIB.reset(nullptr); } StackAllocationAnalysis &DataflowInfoManager::getStackAllocationAnalysis() { if (SAA) return *SAA; SAA.reset( new StackAllocationAnalysis(BF, getStackPointerTracking(), AllocatorId)); SAA->run(); return *SAA; } void DataflowInfoManager::invalidateStackAllocationAnalysis() { SAA.reset(nullptr); } std::unordered_map & DataflowInfoManager::getInsnToBBMap() { if (InsnToBB) return *InsnToBB; InsnToBB.reset(new std::unordered_map()); for (BinaryBasicBlock &BB : BF) { for (MCInst &Inst : BB) (*InsnToBB)[&Inst] = &BB; } return *InsnToBB; } void DataflowInfoManager::invalidateInsnToBBMap() { InsnToBB.reset(nullptr); } void DataflowInfoManager::invalidateAll() { invalidateReachingDefs(); invalidateReachingUses(); invalidateLivenessAnalysis(); invalidateStackReachingUses(); invalidateDominatorAnalysis(); invalidatePostDominatorAnalysis(); invalidateStackPointerTracking(); invalidateReachingInsns(); invalidateReachingInsnsBackwards(); invalidateStackAllocationAnalysis(); invalidateInsnToBBMap(); } } // end namespace bolt } // end namespace llvm