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