LLVM 24.0.0git
LICM.h
Go to the documentation of this file.
1//===- LICM.h - Loop Invariant Code Motion Pass -------*- C++ -*-===//
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 pass performs loop invariant code motion, attempting to remove as much
10// code from the body of a loop as possible. It does this by either hoisting
11// code into the preheader block, or by sinking code to the exit blocks if it is
12// safe. This pass also promotes must-aliased memory locations in the loop to
13// live in registers, thus hoisting and sinking "invariant" loads and stores.
14//
15// This pass uses alias analysis for two purposes:
16//
17// 1. Moving loop invariant loads and calls out of loops. If we can determine
18// that a load or call inside of a loop never aliases anything stored to,
19// we can hoist it or sink it like any other instruction.
20// 2. Scalar Promotion of Memory - If there is a store instruction inside of
21// the loop, we try to move the store to happen AFTER the loop instead of
22// inside of the loop. This can only happen if a few conditions are true:
23// A. The pointer stored through is loop invariant
24// B. There are no stores or loads in the loop which _may_ alias the
25// pointer. There are no calls in the loop which mod/ref the pointer.
26// If these conditions are true, we can promote the loads and stores in the
27// loop of the pointer to use a temporary alloca'd variable. We then use
28// the SSAUpdater to construct the appropriate SSA form for the value.
29//
30//===----------------------------------------------------------------------===//
31
32#ifndef LLVM_TRANSFORMS_SCALAR_LICM_H
33#define LLVM_TRANSFORMS_SCALAR_LICM_H
34
36#include "llvm/IR/PassManager.h"
37
38namespace llvm {
39
40class LPMUpdater;
41class Loop;
42class LoopNest;
43
44/// Returns -licm-mssa-optimization-cap.
46/// Returns -licm-mssa-max-acc-promotion.
48
65
66/// Performs Loop Invariant Code Motion Pass.
67class LICMPass : public OptionalPassInfoMixin<LICMPass> {
68 LICMOptions Opts;
69
70public:
71 LICMPass(unsigned MssaOptCap, unsigned MssaNoAccForPromotionCap,
72 bool AllowSpeculation)
73 : LICMPass(LICMOptions(MssaOptCap, MssaNoAccForPromotionCap,
74 AllowSpeculation)) {}
75 LICMPass(LICMOptions Opts) : Opts(Opts) {}
76
79 LPMUpdater &U);
80
81 LLVM_ABI void
83 function_ref<StringRef(StringRef)> MapClassName2PassName);
84};
85
86/// Performs LoopNest Invariant Code Motion Pass.
87class LNICMPass : public OptionalPassInfoMixin<LNICMPass> {
88 LICMOptions Opts;
89
90public:
91 LNICMPass(unsigned MssaOptCap, unsigned MssaNoAccForPromotionCap,
92 bool AllowSpeculation)
93 : LNICMPass(LICMOptions(MssaOptCap, MssaNoAccForPromotionCap,
94 AllowSpeculation)) {}
95 LNICMPass(LICMOptions Opts) : Opts(Opts) {}
96
99 LPMUpdater &U);
100
101 LLVM_ABI void
103 function_ref<StringRef(StringRef)> MapClassName2PassName);
104};
105} // end namespace llvm
106
107#endif // LLVM_TRANSFORMS_SCALAR_LICM_H
#define LLVM_ABI
Definition Compiler.h:215
This header defines various interfaces for pass management in LLVM.
This header provides classes for managing per-loop analyses.
LICMPass(unsigned MssaOptCap, unsigned MssaNoAccForPromotionCap, bool AllowSpeculation)
Definition LICM.h:71
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
Definition LICM.cpp:284
LICMPass(LICMOptions Opts)
Definition LICM.h:75
LLVM_ABI PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
Definition LICM.cpp:262
LLVM_ABI PreservedAnalyses run(LoopNest &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
Definition LICM.cpp:294
LNICMPass(LICMOptions Opts)
Definition LICM.h:95
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
Definition LICM.cpp:324
LNICMPass(unsigned MssaOptCap, unsigned MssaNoAccForPromotionCap, bool AllowSpeculation)
Definition LICM.h:91
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
This class represents a loop nest and can be used to query its properties.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
This is an optimization pass for GlobalISel generic memory operations.
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
LLVM_ABI unsigned getLicmMssaNoAccForPromotionCap()
Returns -licm-mssa-max-acc-promotion.
Definition LICM.cpp:123
LLVM_ABI unsigned getLicmMssaOptCap()
Returns -licm-mssa-optimization-cap.
Definition LICM.cpp:119
unsigned MssaOptCap
Definition LICM.h:50
unsigned MssaNoAccForPromotionCap
Definition LICM.h:51
bool AllowSpeculation
Definition LICM.h:52
LICMOptions(unsigned MssaOptCap, unsigned MssaNoAccForPromotionCap, bool AllowSpeculation)
Definition LICM.h:59
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...
A CRTP mix-in for passes that can be skipped.