Coverage Report

Created: 2024-01-17 10:31

/src/llvm-project/llvm/lib/Analysis/LoopPass.cpp
Line
Count
Source (jump to first uncovered line)
1
//===- LoopPass.cpp - Loop Pass and Loop Pass Manager ---------------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file implements LoopPass and LPPassManager. All loop optimization
10
// and transformation passes are derived from LoopPass. LPPassManager is
11
// responsible for managing LoopPasses.
12
//
13
//===----------------------------------------------------------------------===//
14
15
#include "llvm/Analysis/LoopPass.h"
16
#include "llvm/Analysis/LoopInfo.h"
17
#include "llvm/IR/Dominators.h"
18
#include "llvm/IR/LLVMContext.h"
19
#include "llvm/IR/OptBisect.h"
20
#include "llvm/IR/PassTimingInfo.h"
21
#include "llvm/IR/PrintPasses.h"
22
#include "llvm/InitializePasses.h"
23
#include "llvm/Support/Debug.h"
24
#include "llvm/Support/TimeProfiler.h"
25
#include "llvm/Support/Timer.h"
26
#include "llvm/Support/raw_ostream.h"
27
using namespace llvm;
28
29
#define DEBUG_TYPE "loop-pass-manager"
30
31
namespace {
32
33
/// PrintLoopPass - Print a Function corresponding to a Loop.
34
///
35
class PrintLoopPassWrapper : public LoopPass {
36
  raw_ostream &OS;
37
  std::string Banner;
38
39
public:
40
  static char ID;
41
0
  PrintLoopPassWrapper() : LoopPass(ID), OS(dbgs()) {}
42
  PrintLoopPassWrapper(raw_ostream &OS, const std::string &Banner)
43
0
      : LoopPass(ID), OS(OS), Banner(Banner) {}
44
45
0
  void getAnalysisUsage(AnalysisUsage &AU) const override {
46
0
    AU.setPreservesAll();
47
0
  }
48
49
0
  bool runOnLoop(Loop *L, LPPassManager &) override {
50
0
    auto BBI = llvm::find_if(L->blocks(), [](BasicBlock *BB) { return BB; });
51
0
    if (BBI != L->blocks().end() &&
52
0
        isFunctionInPrintList((*BBI)->getParent()->getName())) {
53
0
      printLoop(*L, OS, Banner);
54
0
    }
55
0
    return false;
56
0
  }
57
58
0
  StringRef getPassName() const override { return "Print Loop IR"; }
59
};
60
61
char PrintLoopPassWrapper::ID = 0;
62
}
63
64
//===----------------------------------------------------------------------===//
65
// LPPassManager
66
//
67
68
char LPPassManager::ID = 0;
69
70
44.7k
LPPassManager::LPPassManager() : FunctionPass(ID) {
71
44.7k
  LI = nullptr;
72
44.7k
  CurrentLoop = nullptr;
73
44.7k
}
74
75
// Insert loop into loop nest (LoopInfo) and loop queue (LQ).
76
0
void LPPassManager::addLoop(Loop &L) {
77
0
  if (L.isOutermost()) {
78
    // This is the top level loop.
79
0
    LQ.push_front(&L);
80
0
    return;
81
0
  }
82
83
  // Insert L into the loop queue after the parent loop.
84
0
  for (auto I = LQ.begin(), E = LQ.end(); I != E; ++I) {
85
0
    if (*I == L.getParentLoop()) {
86
      // deque does not support insert after.
87
0
      ++I;
88
0
      LQ.insert(I, 1, &L);
89
0
      return;
90
0
    }
91
0
  }
92
0
}
93
94
// Recurse through all subloops and all loops  into LQ.
95
33.0k
static void addLoopIntoQueue(Loop *L, std::deque<Loop *> &LQ) {
96
33.0k
  LQ.push_back(L);
97
33.0k
  for (Loop *I : reverse(*L))
98
6.56k
    addLoopIntoQueue(I, LQ);
99
33.0k
}
100
101
/// Pass Manager itself does not invalidate any analysis info.
102
44.7k
void LPPassManager::getAnalysisUsage(AnalysisUsage &Info) const {
103
  // LPPassManager needs LoopInfo. In the long term LoopInfo class will
104
  // become part of LPPassManager.
105
44.7k
  Info.addRequired<LoopInfoWrapperPass>();
106
44.7k
  Info.addRequired<DominatorTreeWrapperPass>();
107
44.7k
  Info.setPreservesAll();
108
44.7k
}
109
110
0
void LPPassManager::markLoopAsDeleted(Loop &L) {
111
0
  assert((&L == CurrentLoop || CurrentLoop->contains(&L)) &&
112
0
         "Must not delete loop outside the current loop tree!");
113
  // If this loop appears elsewhere within the queue, we also need to remove it
114
  // there. However, we have to be careful to not remove the back of the queue
115
  // as that is assumed to match the current loop.
116
0
  assert(LQ.back() == CurrentLoop && "Loop queue back isn't the current loop!");
117
0
  llvm::erase(LQ, &L);
118
119
0
  if (&L == CurrentLoop) {
120
0
    CurrentLoopDeleted = true;
121
    // Add this loop back onto the back of the queue to preserve our invariants.
122
0
    LQ.push_back(&L);
123
0
  }
124
0
}
125
126
/// run - Execute all of the passes scheduled for execution.  Keep track of
127
/// whether any of the passes modifies the function, and if so, return true.
128
146k
bool LPPassManager::runOnFunction(Function &F) {
129
146k
  auto &LIWP = getAnalysis<LoopInfoWrapperPass>();
130
146k
  LI = &LIWP.getLoopInfo();
131
146k
  Module &M = *F.getParent();
132
#if 0
133
  DominatorTree *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
134
#endif
135
146k
  bool Changed = false;
136
137
  // Collect inherited analysis from Module level pass manager.
138
146k
  populateInheritedAnalysis(TPM->activeStack);
139
140
  // Populate the loop queue in reverse program order. There is no clear need to
141
  // process sibling loops in either forward or reverse order. There may be some
142
  // advantage in deleting uses in a later loop before optimizing the
143
  // definitions in an earlier loop. If we find a clear reason to process in
144
  // forward order, then a forward variant of LoopPassManager should be created.
145
  //
146
  // Note that LoopInfo::iterator visits loops in reverse program
147
  // order. Here, reverse_iterator gives us a forward order, and the LoopQueue
148
  // reverses the order a third time by popping from the back.
149
146k
  for (Loop *L : reverse(*LI))
150
26.5k
    addLoopIntoQueue(L, LQ);
151
152
146k
  if (LQ.empty()) // No loops, skip calling finalizers
153
126k
    return false;
154
155
  // Initialization
156
33.0k
  for (Loop *L : LQ) {
157
119k
    for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
158
86.1k
      LoopPass *P = getContainedPass(Index);
159
86.1k
      Changed |= P->doInitialization(L, *this);
160
86.1k
    }
161
33.0k
  }
162
163
  // Walk Loops
164
20.6k
  unsigned InstrCount, FunctionSize = 0;
165
20.6k
  StringMap<std::pair<unsigned, unsigned>> FunctionToInstrCount;
166
20.6k
  bool EmitICRemark = M.shouldEmitInstrCountChangedRemark();
167
  // Collect the initial size of the module and the function we're looking at.
168
20.6k
  if (EmitICRemark) {
169
0
    InstrCount = initSizeRemarkInfo(M, FunctionToInstrCount);
170
0
    FunctionSize = F.getInstructionCount();
171
0
  }
172
53.7k
  while (!LQ.empty()) {
173
33.0k
    CurrentLoopDeleted = false;
174
33.0k
    CurrentLoop = LQ.back();
175
176
    // Run all passes on the current Loop.
177
119k
    for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
178
86.1k
      LoopPass *P = getContainedPass(Index);
179
180
86.1k
      llvm::TimeTraceScope LoopPassScope("RunLoopPass", P->getPassName());
181
182
86.1k
      dumpPassInfo(P, EXECUTION_MSG, ON_LOOP_MSG,
183
86.1k
                   CurrentLoop->getHeader()->getName());
184
86.1k
      dumpRequiredSet(P);
185
186
86.1k
      initializeAnalysisImpl(P);
187
188
86.1k
      bool LocalChanged = false;
189
86.1k
      {
190
86.1k
        PassManagerPrettyStackEntry X(P, *CurrentLoop->getHeader());
191
86.1k
        TimeRegion PassTimer(getPassTimer(P));
192
#ifdef EXPENSIVE_CHECKS
193
        uint64_t RefHash = P->structuralHash(F);
194
#endif
195
86.1k
        LocalChanged = P->runOnLoop(CurrentLoop, *this);
196
197
#ifdef EXPENSIVE_CHECKS
198
        if (!LocalChanged && (RefHash != P->structuralHash(F))) {
199
          llvm::errs() << "Pass modifies its input and doesn't report it: "
200
                       << P->getPassName() << "\n";
201
          llvm_unreachable("Pass modifies its input and doesn't report it");
202
        }
203
#endif
204
205
86.1k
        Changed |= LocalChanged;
206
86.1k
        if (EmitICRemark) {
207
0
          unsigned NewSize = F.getInstructionCount();
208
          // Update the size of the function, emit a remark, and update the
209
          // size of the module.
210
0
          if (NewSize != FunctionSize) {
211
0
            int64_t Delta = static_cast<int64_t>(NewSize) -
212
0
                            static_cast<int64_t>(FunctionSize);
213
0
            emitInstrCountChangedRemark(P, M, Delta, InstrCount,
214
0
                                        FunctionToInstrCount, &F);
215
0
            InstrCount = static_cast<int64_t>(InstrCount) + Delta;
216
0
            FunctionSize = NewSize;
217
0
          }
218
0
        }
219
86.1k
      }
220
221
86.1k
      if (LocalChanged)
222
10.4k
        dumpPassInfo(P, MODIFICATION_MSG, ON_LOOP_MSG,
223
10.4k
                     CurrentLoopDeleted ? "<deleted loop>"
224
10.4k
                                        : CurrentLoop->getName());
225
86.1k
      dumpPreservedSet(P);
226
227
86.1k
      if (!CurrentLoopDeleted) {
228
        // Manually check that this loop is still healthy. This is done
229
        // instead of relying on LoopInfo::verifyLoop since LoopInfo
230
        // is a function pass and it's really expensive to verify every
231
        // loop in the function every time. That level of checking can be
232
        // enabled with the -verify-loop-info option.
233
86.1k
        {
234
86.1k
          TimeRegion PassTimer(getPassTimer(&LIWP));
235
86.1k
          CurrentLoop->verifyLoop();
236
86.1k
        }
237
        // Here we apply same reasoning as in the above case. Only difference
238
        // is that LPPassManager might run passes which do not require LCSSA
239
        // form (LoopPassPrinter for example). We should skip verification for
240
        // such passes.
241
        // FIXME: Loop-sink currently break LCSSA. Fix it and reenable the
242
        // verification!
243
#if 0
244
        if (mustPreserveAnalysisID(LCSSAVerificationPass::ID))
245
          assert(CurrentLoop->isRecursivelyLCSSAForm(*DT, *LI));
246
#endif
247
248
        // Then call the regular verifyAnalysis functions.
249
86.1k
        verifyPreservedAnalysis(P);
250
251
86.1k
        F.getContext().yield();
252
86.1k
      }
253
254
86.1k
      if (LocalChanged)
255
10.4k
        removeNotPreservedAnalysis(P);
256
86.1k
      recordAvailableAnalysis(P);
257
86.1k
      removeDeadPasses(P,
258
86.1k
                       CurrentLoopDeleted ? "<deleted>"
259
86.1k
                                          : CurrentLoop->getHeader()->getName(),
260
86.1k
                       ON_LOOP_MSG);
261
262
86.1k
      if (CurrentLoopDeleted)
263
        // Do not run other passes on this loop.
264
0
        break;
265
86.1k
    }
266
267
    // If the loop was deleted, release all the loop passes. This frees up
268
    // some memory, and avoids trouble with the pass manager trying to call
269
    // verifyAnalysis on them.
270
33.0k
    if (CurrentLoopDeleted) {
271
0
      for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
272
0
        Pass *P = getContainedPass(Index);
273
0
        freePass(P, "<deleted>", ON_LOOP_MSG);
274
0
      }
275
0
    }
276
277
    // Pop the loop from queue after running all passes.
278
33.0k
    LQ.pop_back();
279
33.0k
  }
280
281
  // Finalization
282
75.8k
  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
283
55.2k
    LoopPass *P = getContainedPass(Index);
284
55.2k
    Changed |= P->doFinalization();
285
55.2k
  }
286
287
20.6k
  return Changed;
288
146k
}
289
290
/// Print passes managed by this manager
291
0
void LPPassManager::dumpPassStructure(unsigned Offset) {
292
0
  errs().indent(Offset*2) << "Loop Pass Manager\n";
293
0
  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
294
0
    Pass *P = getContainedPass(Index);
295
0
    P->dumpPassStructure(Offset + 1);
296
0
    dumpLastUses(P, Offset+1);
297
0
  }
298
0
}
299
300
301
//===----------------------------------------------------------------------===//
302
// LoopPass
303
304
Pass *LoopPass::createPrinterPass(raw_ostream &O,
305
0
                                  const std::string &Banner) const {
306
0
  return new PrintLoopPassWrapper(O, Banner);
307
0
}
308
309
// Check if this pass is suitable for the current LPPassManager, if
310
// available. This pass P is not suitable for a LPPassManager if P
311
// is not preserving higher level analysis info used by other
312
// LPPassManager passes. In such case, pop LPPassManager from the
313
// stack. This will force assignPassManager() to create new
314
// LPPassManger as expected.
315
112k
void LoopPass::preparePassManager(PMStack &PMS) {
316
317
  // Find LPPassManager
318
112k
  while (!PMS.empty() &&
319
112k
         PMS.top()->getPassManagerType() > PMT_LoopPassManager)
320
0
    PMS.pop();
321
322
  // If this pass is destroying high level information that is used
323
  // by other passes that are managed by LPM then do not insert
324
  // this pass in current LPM. Use new LPPassManager.
325
112k
  if (PMS.top()->getPassManagerType() == PMT_LoopPassManager &&
326
112k
      !PMS.top()->preserveHigherLevelAnalysis(this))
327
8.28k
    PMS.pop();
328
112k
}
329
330
/// Assign pass manager to manage this pass.
331
void LoopPass::assignPassManager(PMStack &PMS,
332
112k
                                 PassManagerType PreferredType) {
333
  // Find LPPassManager
334
112k
  while (!PMS.empty() &&
335
112k
         PMS.top()->getPassManagerType() > PMT_LoopPassManager)
336
0
    PMS.pop();
337
338
112k
  LPPassManager *LPPM;
339
112k
  if (PMS.top()->getPassManagerType() == PMT_LoopPassManager)
340
68.0k
    LPPM = (LPPassManager*)PMS.top();
341
44.7k
  else {
342
    // Create new Loop Pass Manager if it does not exist.
343
44.7k
    assert (!PMS.empty() && "Unable to create Loop Pass Manager");
344
0
    PMDataManager *PMD = PMS.top();
345
346
    // [1] Create new Loop Pass Manager
347
44.7k
    LPPM = new LPPassManager();
348
44.7k
    LPPM->populateInheritedAnalysis(PMS);
349
350
    // [2] Set up new manager's top level manager
351
44.7k
    PMTopLevelManager *TPM = PMD->getTopLevelManager();
352
44.7k
    TPM->addIndirectPassManager(LPPM);
353
354
    // [3] Assign manager to manage this new manager. This may create
355
    // and push new managers into PMS
356
44.7k
    Pass *P = LPPM->getAsPass();
357
44.7k
    TPM->schedulePass(P);
358
359
    // [4] Push new manager into PMS
360
44.7k
    PMS.push(LPPM);
361
44.7k
  }
362
363
0
  LPPM->add(this);
364
112k
}
365
366
0
static std::string getDescription(const Loop &L) {
367
0
  return "loop";
368
0
}
369
370
59.6k
bool LoopPass::skipLoop(const Loop *L) const {
371
59.6k
  const Function *F = L->getHeader()->getParent();
372
59.6k
  if (!F)
373
0
    return false;
374
  // Check the opt bisect limit.
375
59.6k
  OptPassGate &Gate = F->getContext().getOptPassGate();
376
59.6k
  if (Gate.isEnabled() &&
377
59.6k
      !Gate.shouldRunPass(this->getPassName(), getDescription(*L)))
378
0
    return true;
379
  // Check for the OptimizeNone attribute.
380
59.6k
  if (F->hasOptNone()) {
381
    // FIXME: Report this to dbgs() only once per function.
382
0
    LLVM_DEBUG(dbgs() << "Skipping pass '" << getPassName() << "' in function "
383
0
                      << F->getName() << "\n");
384
    // FIXME: Delete loop from pass manager's queue?
385
0
    return true;
386
0
  }
387
59.6k
  return false;
388
59.6k
}
389
390
8.28k
LCSSAVerificationPass::LCSSAVerificationPass() : FunctionPass(ID) {
391
8.28k
  initializeLCSSAVerificationPassPass(*PassRegistry::getPassRegistry());
392
8.28k
}
393
394
char LCSSAVerificationPass::ID = 0;
395
INITIALIZE_PASS(LCSSAVerificationPass, "lcssa-verification", "LCSSA Verifier",
396
                false, false)