1f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser//===- RegionInfo.cpp - SESE region detection analysis --------------------===// 2f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// 3f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// The LLVM Compiler Infrastructure 4f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// 5f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// This file is distributed under the University of Illinois Open Source 6f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// License. See LICENSE.TXT for details. 7f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// 8f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser//===----------------------------------------------------------------------===// 9f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// Detects single entry single exit regions in the control flow graph. 10f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser//===----------------------------------------------------------------------===// 11f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 12f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser#include "llvm/Analysis/RegionInfo.h" 13f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser#include "llvm/ADT/PostOrderIterator.h" 14f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser#include "llvm/ADT/Statistic.h" 15082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser#include "llvm/Analysis/LoopInfo.h" 16ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Analysis/RegionInfoImpl.h" 17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Analysis/RegionIterator.h" 18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/PassManager.h" 19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/CommandLine.h" 20f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser#include "llvm/Support/Debug.h" 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/ErrorHandling.h" 22f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#ifndef NDEBUG 23f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/Analysis/RegionPrinter.h" 24f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#endif 25f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 26f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosserusing namespace llvm; 27f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "region" 29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 3037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesnamespace llvm { 3137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestemplate class RegionBase<RegionTraits<Function>>; 3237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestemplate class RegionNodeBase<RegionTraits<Function>>; 3337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestemplate class RegionInfoBase<RegionTraits<Function>>; 3437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 3537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 3637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesSTATISTIC(numRegions, "The # of regions"); 3737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesSTATISTIC(numSimpleRegions, "The # of simple regions"); 3837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 39f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// Always verify if expensive checking is enabled. 40f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 41f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosserstatic cl::opt<bool,true> 4237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesVerifyRegionInfoX( 4337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines "verify-region-info", 4437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines cl::location(RegionInfoBase<RegionTraits<Function>>::VerifyRegionInfo), 4537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines cl::desc("Verify region info (time consuming)")); 46f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 47f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 4837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstatic cl::opt<Region::PrintStyle, true> printStyleX("print-region-style", 4937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines cl::location(RegionInfo::printStyle), 50cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser cl::Hidden, 51f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser cl::desc("style of printing regions"), 52f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser cl::values( 53cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser clEnumValN(Region::PrintNone, "none", "print no details"), 54cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser clEnumValN(Region::PrintBB, "bb", 5523a22a29441b8b7d948e6ff7c2afb39e6528cfbdHongbin Zheng "print regions in detail with block_iterator"), 56cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser clEnumValN(Region::PrintRN, "rn", 57cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser "print regions in detail with element_iterator"), 58f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser clEnumValEnd)); 59f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 60c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser 6137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===----------------------------------------------------------------------===// 6237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// Region implementation 6337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// 64f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 6537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesRegion::Region(BasicBlock *Entry, BasicBlock *Exit, 6637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines RegionInfo* RI, 6737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines DominatorTree *DT, Region *Parent) : 6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines RegionBase<RegionTraits<Function>>(Entry, Exit, RI, DT, Parent) { 69f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 70f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser} 71f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 7237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesRegion::~Region() { } 73f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 74f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser//===----------------------------------------------------------------------===// 75f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// RegionInfo implementation 76f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// 77f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 7837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesRegionInfo::RegionInfo() : 7937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines RegionInfoBase<RegionTraits<Function>>() { 80f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 81f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser} 82f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 8337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesRegionInfo::~RegionInfo() { 84f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 85f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser} 86f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 87f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid RegionInfo::updateStatistics(Region *R) { 88f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser ++numRegions; 89f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 90f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser // TODO: Slow. Should only be enabled if -stats is used. 9137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (R->isSimple()) 9237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ++numSimpleRegions; 93f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser} 94f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 9537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid RegionInfo::recalculate(Function &F, DominatorTree *DT_, 9637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines PostDominatorTree *PDT_, DominanceFrontier *DF_) { 9737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines DT = DT_; 9837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines PDT = PDT_; 9937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines DF = DF_; 100f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 10137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines TopLevelRegion = new Region(&F.getEntryBlock(), nullptr, 10237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines this, DT, nullptr); 10337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines updateStatistics(TopLevelRegion); 10437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines calculate(F); 105f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser} 106f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 107f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#ifndef NDEBUG 108f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid RegionInfo::view() { viewRegion(this); } 109f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 110f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid RegionInfo::viewOnly() { viewRegionOnly(this); } 111f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#endif 112f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 11337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===----------------------------------------------------------------------===// 11437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// RegionInfoPass implementation 11537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// 116f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 11737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesRegionInfoPass::RegionInfoPass() : FunctionPass(ID) { 11837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines initializeRegionInfoPassPass(*PassRegistry::getPassRegistry()); 119f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser} 120f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 12137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesRegionInfoPass::~RegionInfoPass() { 122f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 123f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser} 124f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 12537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesbool RegionInfoPass::runOnFunction(Function &F) { 126f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser releaseMemory(); 127f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 12837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines auto DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree(); 129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto PDT = &getAnalysis<PostDominatorTreeWrapperPass>().getPostDomTree(); 130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto DF = &getAnalysis<DominanceFrontierWrapperPass>().getDominanceFrontier(); 131f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 13237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines RI.recalculate(F, DT, PDT, DF); 13337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 134f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser} 135f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 13637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid RegionInfoPass::releaseMemory() { 13737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines RI.releaseMemory(); 13837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 139f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 14037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid RegionInfoPass::verifyAnalysis() const { 14137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines RI.verifyAnalysis(); 142f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser} 143f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 14437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid RegionInfoPass::getAnalysisUsage(AnalysisUsage &AU) const { 145f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser AU.setPreservesAll(); 14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AU.addRequiredTransitive<DominatorTreeWrapperPass>(); 147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar AU.addRequired<PostDominatorTreeWrapperPass>(); 148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar AU.addRequired<DominanceFrontierWrapperPass>(); 149f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser} 150f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 15137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid RegionInfoPass::print(raw_ostream &OS, const Module *) const { 15237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines RI.print(OS); 153f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser} 154f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 15537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_DUMP_METHOD void RegionInfoPass::dump() const { 15737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines RI.dump(); 158f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser} 15937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#endif 160f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 16137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hineschar RegionInfoPass::ID = 0; 162592316c4198023431799f8e597860b31ea7116c9Tobias Grosser 16337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesINITIALIZE_PASS_BEGIN(RegionInfoPass, "regions", 1642ab36d350293c77fc8941ce1023e4899df7e3a82Owen Anderson "Detect single entry single exit regions", true, true) 16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesINITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) 166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarINITIALIZE_PASS_DEPENDENCY(PostDominatorTreeWrapperPass) 167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarINITIALIZE_PASS_DEPENDENCY(DominanceFrontierWrapperPass) 16837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesINITIALIZE_PASS_END(RegionInfoPass, "regions", 169ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson "Detect single entry single exit regions", true, true) 170f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 171f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// Create methods available outside of this file, to use them 172f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by 173f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// the link time optimization. 174f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 175f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grossernamespace llvm { 176f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser FunctionPass *createRegionInfoPass() { 17737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return new RegionInfoPass(); 178f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser } 179f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser} 180f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser 181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===// 182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// RegionInfoAnalysis implementation 183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 185de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarchar RegionInfoAnalysis::PassID; 186de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 187de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarRegionInfo RegionInfoAnalysis::run(Function &F, AnalysisManager<Function> &AM) { 188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar RegionInfo RI; 189de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto *DT = &AM.getResult<DominatorTreeAnalysis>(F); 190de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto *PDT = &AM.getResult<PostDominatorTreeAnalysis>(F); 191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto *DF = &AM.getResult<DominanceFrontierAnalysis>(F); 192de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar RI.recalculate(F, DT, PDT, DF); 194de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return RI; 195de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarRegionInfoPrinterPass::RegionInfoPrinterPass(raw_ostream &OS) 198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar : OS(OS) {} 199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarPreservedAnalyses RegionInfoPrinterPass::run(Function &F, 201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar FunctionAnalysisManager &AM) { 202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS << "Region Tree for function: " << F.getName() << "\n"; 203de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar AM.getResult<RegionInfoAnalysis>(F).print(OS); 204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 205de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return PreservedAnalyses::all(); 206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 207de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 208de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarPreservedAnalyses RegionInfoVerifierPass::run(Function &F, 209de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar AnalysisManager<Function> &AM) { 210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar AM.getResult<RegionInfoAnalysis>(F).verifyAnalysis(); 211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return PreservedAnalyses::all(); 213de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 214