1*2f09f445SMaksim Panchenko //===- bolt/Passes/DataflowInfoManager.cpp --------------------------------===//
2a34c753fSRafael Auler //
3a34c753fSRafael Auler // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a34c753fSRafael Auler // See https://llvm.org/LICENSE.txt for license information.
5a34c753fSRafael Auler // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a34c753fSRafael Auler //
7a34c753fSRafael Auler //===----------------------------------------------------------------------===//
8a34c753fSRafael Auler //
9*2f09f445SMaksim Panchenko // This file implements the DataflowInfoManager class.
10*2f09f445SMaksim Panchenko //
11a34c753fSRafael Auler //===----------------------------------------------------------------------===//
12a34c753fSRafael Auler 
13a34c753fSRafael Auler #include "bolt/Passes/DataflowInfoManager.h"
14a34c753fSRafael Auler 
15a34c753fSRafael Auler namespace llvm {
16a34c753fSRafael Auler namespace bolt {
17a34c753fSRafael Auler 
getReachingDefs()18a34c753fSRafael Auler ReachingDefOrUse</*Def=*/true> &DataflowInfoManager::getReachingDefs() {
19a34c753fSRafael Auler   if (RD)
20a34c753fSRafael Auler     return *RD;
21a34c753fSRafael Auler   assert(RA && "RegAnalysis required");
2260b09997SMaksim Panchenko   RD.reset(new ReachingDefOrUse<true>(*RA, BF, None, AllocatorId));
23a34c753fSRafael Auler   RD->run();
24a34c753fSRafael Auler   return *RD;
25a34c753fSRafael Auler }
26a34c753fSRafael Auler 
invalidateReachingDefs()2740c2e0faSMaksim Panchenko void DataflowInfoManager::invalidateReachingDefs() { RD.reset(nullptr); }
28a34c753fSRafael Auler 
getReachingUses()29a34c753fSRafael Auler ReachingDefOrUse</*Def=*/false> &DataflowInfoManager::getReachingUses() {
30a34c753fSRafael Auler   if (RU)
31a34c753fSRafael Auler     return *RU;
32a34c753fSRafael Auler   assert(RA && "RegAnalysis required");
3360b09997SMaksim Panchenko   RU.reset(new ReachingDefOrUse<false>(*RA, BF, None, AllocatorId));
34a34c753fSRafael Auler   RU->run();
35a34c753fSRafael Auler   return *RU;
36a34c753fSRafael Auler }
37a34c753fSRafael Auler 
invalidateReachingUses()3840c2e0faSMaksim Panchenko void DataflowInfoManager::invalidateReachingUses() { RU.reset(nullptr); }
39a34c753fSRafael Auler 
getLivenessAnalysis()40a34c753fSRafael Auler LivenessAnalysis &DataflowInfoManager::getLivenessAnalysis() {
41a34c753fSRafael Auler   if (LA)
42a34c753fSRafael Auler     return *LA;
43a34c753fSRafael Auler   assert(RA && "RegAnalysis required");
4460b09997SMaksim Panchenko   LA.reset(new LivenessAnalysis(*RA, BF, AllocatorId));
45a34c753fSRafael Auler   LA->run();
46a34c753fSRafael Auler   return *LA;
47a34c753fSRafael Auler }
48a34c753fSRafael Auler 
invalidateLivenessAnalysis()4940c2e0faSMaksim Panchenko void DataflowInfoManager::invalidateLivenessAnalysis() { LA.reset(nullptr); }
50a34c753fSRafael Auler 
getStackReachingUses()51a34c753fSRafael Auler StackReachingUses &DataflowInfoManager::getStackReachingUses() {
52a34c753fSRafael Auler   if (SRU)
53a34c753fSRafael Auler     return *SRU;
54a34c753fSRafael Auler   assert(FA && "FrameAnalysis required");
5560b09997SMaksim Panchenko   SRU.reset(new StackReachingUses(*FA, BF, AllocatorId));
56a34c753fSRafael Auler   SRU->run();
57a34c753fSRafael Auler   return *SRU;
58a34c753fSRafael Auler }
59a34c753fSRafael Auler 
invalidateStackReachingUses()6040c2e0faSMaksim Panchenko void DataflowInfoManager::invalidateStackReachingUses() { SRU.reset(nullptr); }
61a34c753fSRafael Auler 
getDominatorAnalysis()62a34c753fSRafael Auler DominatorAnalysis<false> &DataflowInfoManager::getDominatorAnalysis() {
63a34c753fSRafael Auler   if (DA)
64a34c753fSRafael Auler     return *DA;
6560b09997SMaksim Panchenko   DA.reset(new DominatorAnalysis<false>(BF, AllocatorId));
66a34c753fSRafael Auler   DA->run();
67a34c753fSRafael Auler   return *DA;
68a34c753fSRafael Auler }
69a34c753fSRafael Auler 
invalidateDominatorAnalysis()7040c2e0faSMaksim Panchenko void DataflowInfoManager::invalidateDominatorAnalysis() { DA.reset(nullptr); }
71a34c753fSRafael Auler 
getPostDominatorAnalysis()72a34c753fSRafael Auler DominatorAnalysis<true> &DataflowInfoManager::getPostDominatorAnalysis() {
73a34c753fSRafael Auler   if (PDA)
74a34c753fSRafael Auler     return *PDA;
7560b09997SMaksim Panchenko   PDA.reset(new DominatorAnalysis<true>(BF, AllocatorId));
76a34c753fSRafael Auler   PDA->run();
77a34c753fSRafael Auler   return *PDA;
78a34c753fSRafael Auler }
79a34c753fSRafael Auler 
invalidatePostDominatorAnalysis()80a34c753fSRafael Auler void DataflowInfoManager::invalidatePostDominatorAnalysis() {
81a34c753fSRafael Auler   PDA.reset(nullptr);
82a34c753fSRafael Auler }
83a34c753fSRafael Auler 
getStackPointerTracking()84a34c753fSRafael Auler StackPointerTracking &DataflowInfoManager::getStackPointerTracking() {
85a34c753fSRafael Auler   if (SPT)
86a34c753fSRafael Auler     return *SPT;
8760b09997SMaksim Panchenko   SPT.reset(new StackPointerTracking(BF, AllocatorId));
88a34c753fSRafael Auler   SPT->run();
89a34c753fSRafael Auler   return *SPT;
90a34c753fSRafael Auler }
91a34c753fSRafael Auler 
invalidateStackPointerTracking()92a34c753fSRafael Auler void DataflowInfoManager::invalidateStackPointerTracking() {
93a34c753fSRafael Auler   invalidateStackAllocationAnalysis();
94a34c753fSRafael Auler   SPT.reset(nullptr);
95a34c753fSRafael Auler }
96a34c753fSRafael Auler 
getReachingInsns()97a34c753fSRafael Auler ReachingInsns<false> &DataflowInfoManager::getReachingInsns() {
98a34c753fSRafael Auler   if (RI)
99a34c753fSRafael Auler     return *RI;
10060b09997SMaksim Panchenko   RI.reset(new ReachingInsns<false>(BF, AllocatorId));
101a34c753fSRafael Auler   RI->run();
102a34c753fSRafael Auler   return *RI;
103a34c753fSRafael Auler }
104a34c753fSRafael Auler 
invalidateReachingInsns()10540c2e0faSMaksim Panchenko void DataflowInfoManager::invalidateReachingInsns() { RI.reset(nullptr); }
106a34c753fSRafael Auler 
getReachingInsnsBackwards()107a34c753fSRafael Auler ReachingInsns<true> &DataflowInfoManager::getReachingInsnsBackwards() {
108a34c753fSRafael Auler   if (RIB)
109a34c753fSRafael Auler     return *RIB;
11060b09997SMaksim Panchenko   RIB.reset(new ReachingInsns<true>(BF, AllocatorId));
111a34c753fSRafael Auler   RIB->run();
112a34c753fSRafael Auler   return *RIB;
113a34c753fSRafael Auler }
114a34c753fSRafael Auler 
invalidateReachingInsnsBackwards()115a34c753fSRafael Auler void DataflowInfoManager::invalidateReachingInsnsBackwards() {
116a34c753fSRafael Auler   RIB.reset(nullptr);
117a34c753fSRafael Auler }
118a34c753fSRafael Auler 
getStackAllocationAnalysis()119a34c753fSRafael Auler StackAllocationAnalysis &DataflowInfoManager::getStackAllocationAnalysis() {
120a34c753fSRafael Auler   if (SAA)
121a34c753fSRafael Auler     return *SAA;
12260b09997SMaksim Panchenko   SAA.reset(
12360b09997SMaksim Panchenko       new StackAllocationAnalysis(BF, getStackPointerTracking(), AllocatorId));
124a34c753fSRafael Auler   SAA->run();
125a34c753fSRafael Auler   return *SAA;
126a34c753fSRafael Auler }
127a34c753fSRafael Auler 
invalidateStackAllocationAnalysis()128a34c753fSRafael Auler void DataflowInfoManager::invalidateStackAllocationAnalysis() {
129a34c753fSRafael Auler   SAA.reset(nullptr);
130a34c753fSRafael Auler }
131a34c753fSRafael Auler 
132a34c753fSRafael Auler std::unordered_map<const MCInst *, BinaryBasicBlock *> &
getInsnToBBMap()133a34c753fSRafael Auler DataflowInfoManager::getInsnToBBMap() {
134a34c753fSRafael Auler   if (InsnToBB)
135a34c753fSRafael Auler     return *InsnToBB;
136a34c753fSRafael Auler   InsnToBB.reset(new std::unordered_map<const MCInst *, BinaryBasicBlock *>());
137a34c753fSRafael Auler   for (BinaryBasicBlock &BB : BF) {
138a34c753fSRafael Auler     for (MCInst &Inst : BB)
139a34c753fSRafael Auler       (*InsnToBB)[&Inst] = &BB;
140a34c753fSRafael Auler   }
141a34c753fSRafael Auler   return *InsnToBB;
142a34c753fSRafael Auler }
143a34c753fSRafael Auler 
invalidateInsnToBBMap()14440c2e0faSMaksim Panchenko void DataflowInfoManager::invalidateInsnToBBMap() { InsnToBB.reset(nullptr); }
145a34c753fSRafael Auler 
invalidateAll()146a34c753fSRafael Auler void DataflowInfoManager::invalidateAll() {
147a34c753fSRafael Auler   invalidateReachingDefs();
148a34c753fSRafael Auler   invalidateReachingUses();
149a34c753fSRafael Auler   invalidateLivenessAnalysis();
150a34c753fSRafael Auler   invalidateStackReachingUses();
151a34c753fSRafael Auler   invalidateDominatorAnalysis();
152a34c753fSRafael Auler   invalidatePostDominatorAnalysis();
153a34c753fSRafael Auler   invalidateStackPointerTracking();
154a34c753fSRafael Auler   invalidateReachingInsns();
155a34c753fSRafael Auler   invalidateReachingInsnsBackwards();
156a34c753fSRafael Auler   invalidateStackAllocationAnalysis();
157a34c753fSRafael Auler   invalidateInsnToBBMap();
158a34c753fSRafael Auler }
159a34c753fSRafael Auler 
160a34c753fSRafael Auler } // end namespace bolt
161a34c753fSRafael Auler } // end namespace llvm
162