LLVM 23.0.0git
LoopVersioning.h
Go to the documentation of this file.
1//===- LoopVersioning.h - Utility to version a loop -------------*- 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 file defines a utility class to perform loop versioning. The versioned
10// loop speculates that otherwise may-aliasing memory accesses don't overlap and
11// emits checks to prove this.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_TRANSFORMS_UTILS_LOOPVERSIONING_H
16#define LLVM_TRANSFORMS_UTILS_LOOPVERSIONING_H
17
18#include "llvm/IR/PassManager.h"
21
22namespace llvm {
23
24class Loop;
25class SCEVPredicate;
26class ScalarEvolution;
27class LoopAccessInfo;
28class LoopInfo;
30typedef std::pair<const RuntimeCheckingPtrGroup *,
33
34template <typename T> class ArrayRef;
35
36/// This class emits a version of the loop where run-time checks ensure
37/// that may-alias pointers can't overlap.
38///
39/// It currently only supports single-exit loops and assumes that the loop
40/// already has a preheader.
42public:
43 /// Expects LoopAccessInfo, Loop, LoopInfo, DominatorTree as input.
44 /// It uses runtime check provided by the user. If \p UseLAIChecks is true,
45 /// we will retain the default checks made by LAI. Otherwise, construct an
46 /// object having no checks and we expect the user to add them.
50
51 /// Performs the CFG manipulation part of versioning the loop including
52 /// the DominatorTree and LoopInfo updates.
53 ///
54 /// The loop that was used to construct the class will be the "versioned" loop
55 /// i.e. the loop that will receive control if all the memchecks pass.
56 ///
57 /// This allows the loop transform pass to operate on the same loop regardless
58 /// of whether versioning was necessary or not:
59 ///
60 /// for each loop L:
61 /// analyze L
62 /// if versioning is necessary version L
63 /// transform L
65
66 /// Same but if the client has already precomputed the set of values
67 /// used outside the loop, this API will allows passing that.
68 LLVM_ABI void
69 versionLoop(const SmallVectorImpl<Instruction *> &DefsUsedOutside);
70
71 /// Returns the versioned loop. Control flows here if pointers in the
72 /// loop don't alias (i.e. all memchecks passed). (This loop is actually the
73 /// same as the original loop that we got constructed with.)
74 Loop *getVersionedLoop() { return VersionedLoop; }
75
76 /// Returns the fall-back loop. Control flows here if pointers in the
77 /// loop may alias (i.e. one of the memchecks failed).
78 Loop *getNonVersionedLoop() { return NonVersionedLoop; }
79
80 /// Annotate memory instructions in the versioned loop with no-alias
81 /// metadata based on the memchecks issued.
82 ///
83 /// This is just wrapper that calls prepareNoAliasMetadata and
84 /// annotateInstWithNoAlias on the instructions of the versioned loop.
86
87 /// Returns a pair containing the alias_scope and noalias metadata nodes for
88 /// \p OrigInst, if they exists.
89 LLVM_ABI std::pair<MDNode *, MDNode *>
90 getNoAliasMetadataFor(const Instruction *OrigInst) const;
91
92 /// Set up the aliasing scopes based on the memchecks. This needs to
93 /// be called before the first call to annotateInstWithNoAlias.
95
96 /// Add the noalias annotations to \p VersionedInst.
97 ///
98 /// \p OrigInst is the instruction corresponding to \p VersionedInst in the
99 /// original loop. Initialize the aliasing scopes with
100 /// prepareNoAliasMetadata once before this can be called.
101 LLVM_ABI void annotateInstWithNoAlias(Instruction *VersionedInst,
102 const Instruction *OrigInst);
103
104private:
105 /// Adds the necessary PHI nodes for the versioned loops based on the
106 /// loop-defined values used outside of the loop.
107 ///
108 /// This needs to be called after versionLoop if there are defs in the loop
109 /// that are used outside the loop.
110 void addPHINodes(const SmallVectorImpl<Instruction *> &DefsUsedOutside);
111
112 /// Add the noalias annotations to \p I. Initialize the aliasing
113 /// scopes with prepareNoAliasMetadata once before this can be called.
116 }
117
118 /// The original loop. This becomes the "versioned" one. I.e.,
119 /// control flows here if pointers in the loop don't alias.
120 Loop *VersionedLoop;
121 /// The fall-back loop. I.e. control flows here if pointers in the
122 /// loop may alias (memchecks failed).
123 Loop *NonVersionedLoop = nullptr;
124
125 /// This maps the instructions from VersionedLoop to their counterpart
126 /// in NonVersionedLoop.
128
129 /// The set of alias checks that we are versioning for.
130 SmallVector<RuntimePointerCheck, 4> AliasChecks;
131
132 /// The set of SCEV checks that we are versioning for.
133 const SCEVPredicate &Preds;
134
135 /// Maps a pointer to the pointer checking group that the pointer
136 /// belongs to.
137 DenseMap<const Value *, const RuntimeCheckingPtrGroup *> PtrToGroup;
138
139 /// The alias scope corresponding to a pointer checking group.
140 DenseMap<const RuntimeCheckingPtrGroup *, MDNode *> GroupToScope;
141
142 /// The list of alias scopes that a pointer checking group can't alias.
143 DenseMap<const RuntimeCheckingPtrGroup *, MDNode *>
144 GroupToNonAliasingScopeList;
145
146 /// Analyses used.
147 const LoopAccessInfo &LAI;
148 LoopInfo *LI;
149 DominatorTree *DT;
150 ScalarEvolution *SE;
151};
152
153/// Expose LoopVersioning as a pass. Currently this is only used for
154/// unit-testing. It adds all memchecks necessary to remove all may-aliasing
155/// array accesses from the loop.
156class LoopVersioningPass : public OptionalPassInfoMixin<LoopVersioningPass> {
157public:
159};
160}
161
162#endif
#define LLVM_ABI
Definition Compiler.h:213
This header defines various interfaces for pass management in LLVM.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
FunctionAnalysisManager FAM
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:155
Drive the analysis of memory accesses in the loop.
Expose LoopVersioning as a pass.
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM)
LLVM_ABI void annotateLoopWithNoAlias()
Annotate memory instructions in the versioned loop with no-alias metadata based on the memchecks issu...
Loop * getVersionedLoop()
Returns the versioned loop.
LLVM_ABI void prepareNoAliasMetadata()
Set up the aliasing scopes based on the memchecks.
LLVM_ABI void annotateInstWithNoAlias(Instruction *VersionedInst, const Instruction *OrigInst)
Add the noalias annotations to VersionedInst.
void versionLoop()
Performs the CFG manipulation part of versioning the loop including the DominatorTree and LoopInfo up...
LLVM_ABI std::pair< MDNode *, MDNode * > getNoAliasMetadataFor(const Instruction *OrigInst) const
Returns a pair containing the alias_scope and noalias metadata nodes for OrigInst,...
LLVM_ABI LoopVersioning(const LoopAccessInfo &LAI, ArrayRef< RuntimePointerCheck > Checks, Loop *L, LoopInfo *LI, DominatorTree *DT, ScalarEvolution *SE)
Expects LoopAccessInfo, Loop, LoopInfo, DominatorTree as input.
Loop * getNonVersionedLoop()
Returns the fall-back loop.
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
This class represents an assumption made using SCEV expressions which can be checked at run-time.
The main scalar evolution driver.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is an optimization pass for GlobalISel generic memory operations.
std::pair< const RuntimeCheckingPtrGroup *, const RuntimeCheckingPtrGroup * > RuntimePointerCheck
A memcheck which made up of a pair of grouped pointers.
LLVM_ABI SmallVector< Instruction *, 8 > findDefsUsedOutsideOfLoop(Loop *L)
Returns the instructions that use values defined in the loop.
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
A CRTP mix-in for passes that can be skipped.