LLVM: include/llvm/Support/ModRef.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14#ifndef LLVM_SUPPORT_MODREF_H
15#define LLVM_SUPPORT_MODREF_H
16
21
22namespace llvm {
23
24
25
26
27
39
55
56
58
59
61
63
65
67
69
72
73
76
78};
79
80template class MemoryEffectsBase {
81public:
83
84private:
86
87 static constexpr uint32_t BitsPerLoc = 2;
88 static constexpr uint32_t LocMask = (1 << BitsPerLoc) - 1;
89
92 }
93
95
96 void setModRef(Location Loc, ModRefInfo MR) {
97 Data &= ~(LocMask << getLocationPos(Loc));
98 Data |= static_cast<uint32_t>(MR) << getLocationPos(Loc);
99 }
100
101public:
102
107
108
109
111
112
113
116 setModRef(Loc, MR);
117 }
118
119
123
124
125 static MemoryEffectsBase none() {
127 }
128
129
133
134
138
139
141 return MemoryEffectsBase(Location::ArgMem, MR);
142 }
143
144
147 return MemoryEffectsBase(Location::InaccessibleMem, MR);
148 }
149
150
152 return MemoryEffectsBase(Location::ErrnoMem, MR);
153 }
154
155
157 return MemoryEffectsBase(Location::Other, MR);
158 }
159
160
161
164 MemoryEffectsBase FRMB = none();
165 FRMB.setModRef(Location::ArgMem, MR);
166 FRMB.setModRef(Location::InaccessibleMem, MR);
167 return FRMB;
168 }
169
170
174 MemoryEffectsBase FRMB = none();
175 FRMB.setModRef(Location::ArgMem, ArgMR);
176 FRMB.setModRef(Location::ErrnoMem, ErrnoMR);
177 return FRMB;
178 }
179
180
181
183 return MemoryEffectsBase(Data);
184 }
185
186
187
191
192
194 return ModRefInfo((Data >> getLocationPos(Loc)) & LocMask);
195 }
196
197
199 MemoryEffectsBase ME = *this;
200 ME.setModRef(Loc, MR);
201 return ME;
202 }
203
204
206 MemoryEffectsBase ME = *this;
208 return ME;
209 }
210
211
218
219
221
222
224
225
227
228
232
233
237
238
242
243
247
248
249
255
256
258 return MemoryEffectsBase(Data & Other.Data);
259 }
260
261
263 Data &= Other.Data;
264 return *this;
265 }
266
267
269 return MemoryEffectsBase(Data | Other.Data);
270 }
271
272
274 Data |= Other.Data;
275 return *this;
276 }
277
278
280 return MemoryEffectsBase(Data & ~Other.Data);
281 }
282
283
288
289
291
292
294};
295
296
297
298
299
300
302
303
305
306
308
309
319
323
327
331
335
340
344
348
352
353LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, CaptureComponents CC);
354
355
356
357
358
362
363public:
366 : OtherComponents(OtherComponents), RetComponents(RetComponents) {}
367
369 : OtherComponents(Components), RetComponents(Components) {}
370
371
373
374
376
377
382
383
385
386
388
389
390
392
393
394
395 operator CaptureComponents() const { return OtherComponents | RetComponents; }
396
398 return OtherComponents == Other.OtherComponents &&
399 RetComponents == Other.RetComponents;
400 }
401
403
404
407 RetComponents | Other.RetComponents);
408 }
409
410
413 RetComponents & Other.RetComponents);
414 }
415
416
418 OtherComponents |= Other.OtherComponents;
419 RetComponents |= Other.RetComponents;
420 return *this;
421 }
422
423
425 OtherComponents &= Other.OtherComponents;
426 RetComponents &= Other.RetComponents;
427 return *this;
428 }
429
434
435
436
440};
441
443
444}
445
446#endif
unsigned const MachineRegisterInfo * MRI
Analysis containing CSE Info
Provides some synthesis utilities to produce sequences of values.
Represents which components of the pointer may be captured in which location.
Definition ModRef.h:359
static CaptureInfo createFromIntValue(uint32_t Data)
Definition ModRef.h:430
CaptureComponents getOtherComponents() const
Get components potentially captured through locations other than the return value.
Definition ModRef.h:391
static CaptureInfo none()
Create CaptureInfo that does not capture any components of the pointer.
Definition ModRef.h:372
bool operator==(CaptureInfo Other) const
Definition ModRef.h:397
bool operator!=(CaptureInfo Other) const
Definition ModRef.h:402
static CaptureInfo retOnly(CaptureComponents RetComponents=CaptureComponents::All)
Create CaptureInfo that may only capture via the return value.
Definition ModRef.h:379
static CaptureInfo all()
Create CaptureInfo that may capture all components of the pointer.
Definition ModRef.h:375
CaptureInfo operator&(CaptureInfo Other) const
Compute intersection of CaptureInfos.
Definition ModRef.h:411
CaptureInfo & operator|=(CaptureInfo Other)
Compute union of CaptureInfos in-place.
Definition ModRef.h:417
CaptureComponents getRetComponents() const
Get components potentially captured by the return value.
Definition ModRef.h:387
CaptureInfo(CaptureComponents OtherComponents, CaptureComponents RetComponents)
Definition ModRef.h:364
CaptureInfo & operator&=(CaptureInfo Other)
Compute intersection of CaptureInfos in-place.
Definition ModRef.h:424
CaptureInfo operator|(CaptureInfo Other) const
Compute union of CaptureInfos.
Definition ModRef.h:405
bool isRetOnly() const
Whether the pointer is only captured via the return value.
Definition ModRef.h:384
uint32_t toIntValue() const
Convert CaptureInfo into an encoded integer value (used by captures attribute).
Definition ModRef.h:437
CaptureInfo(CaptureComponents Components)
Definition ModRef.h:368
MemoryEffectsBase operator&(MemoryEffectsBase Other) const
Intersect with other MemoryEffectsBase.
Definition ModRef.h:257
static MemoryEffectsBase readOnly()
Create MemoryEffectsBase that can read any memory.
Definition ModRef.h:130
bool onlyWritesMemory() const
Whether this function only (at most) writes memory.
Definition ModRef.h:226
MemoryEffectsBase getWithoutLoc(Location Loc) const
Get new MemoryEffectsBase with NoModRef on the given Loc.
Definition ModRef.h:205
MemoryEffectsBase & operator|=(MemoryEffectsBase Other)
Union (in-place) with other MemoryEffectsBase.
Definition ModRef.h:273
MemoryEffectsBase getWithModRef(Location Loc, ModRefInfo MR) const
Get new MemoryEffectsBase with modified ModRefInfo for Loc.
Definition ModRef.h:198
bool operator!=(MemoryEffectsBase Other) const
Check whether this is different from other MemoryEffectsBase.
Definition ModRef.h:293
MemoryEffectsBase operator-(MemoryEffectsBase Other) const
Subtract other MemoryEffectsBase.
Definition ModRef.h:279
bool doesNotAccessMemory() const
Whether this function accesses no memory.
Definition ModRef.h:220
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffectsBase that can only access argument memory.
Definition ModRef.h:140
MemoryEffectsBase(ModRefInfo MR)
Create MemoryEffectsBase that can access any location with the given ModRefInfo.
Definition ModRef.h:114
bool doesAccessArgPointees() const
Whether this function may access argument memory.
Definition ModRef.h:234
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffectsBase that can only access inaccessible memory.
Definition ModRef.h:146
bool onlyAccessesInaccessibleMem() const
Whether this function only (at most) accesses inaccessible memory.
Definition ModRef.h:239
MemoryEffectsBase(Location Loc, ModRefInfo MR)
Create MemoryEffectsBase that can access only the given location with the given ModRefInfo.
Definition ModRef.h:110
ModRefInfo getModRef(Location Loc) const
Get ModRefInfo for the given Location.
Definition ModRef.h:193
MemoryEffectsBase & operator&=(MemoryEffectsBase Other)
Intersect (in-place) with other MemoryEffectsBase.
Definition ModRef.h:262
ModRefInfo getModRef() const
Get ModRefInfo for any location.
Definition ModRef.h:212
LocationEnum Location
Definition ModRef.h:82
bool onlyAccessesArgPointees() const
Whether this function only (at most) accesses argument memory.
Definition ModRef.h:229
bool onlyReadsMemory() const
Whether this function only (at most) reads memory.
Definition ModRef.h:223
static MemoryEffectsBase errnoMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffectsBase that can only access errno memory.
Definition ModRef.h:151
static MemoryEffectsBase createFromIntValue(uint32_t Data)
Create MemoryEffectsBase from an encoded integer value (used by memory attribute).
Definition ModRef.h:182
MemoryEffectsBase & operator-=(MemoryEffectsBase Other)
Subtract (in-place) with other MemoryEffectsBase.
Definition ModRef.h:284
static MemoryEffectsBase writeOnly()
Create MemoryEffectsBase that can write any memory.
Definition ModRef.h:135
MemoryEffectsBase operator|(MemoryEffectsBase Other) const
Union with other MemoryEffectsBase.
Definition ModRef.h:268
static MemoryEffectsBase otherMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffectsBase that can only access other memory.
Definition ModRef.h:156
static auto locations()
Returns iterator over all supported location kinds.
Definition ModRef.h:103
bool onlyAccessesErrnoMem() const
Whether this function only (at most) accesses errno memory.
Definition ModRef.h:244
uint32_t toIntValue() const
Convert MemoryEffectsBase into an encoded integer value (used by memory attribute).
Definition ModRef.h:188
static MemoryEffectsBase inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffectsBase that can only access inaccessible or argument memory.
Definition ModRef.h:163
static MemoryEffectsBase argumentOrErrnoMemOnly(ModRefInfo ArgMR=ModRefInfo::ModRef, ModRefInfo ErrnoMR=ModRefInfo::ModRef)
Create MemoryEffectsBase that can only access argument or errno memory.
Definition ModRef.h:172
static MemoryEffectsBase none()
Create MemoryEffectsBase that cannot read or write any memory.
Definition ModRef.h:125
bool operator==(MemoryEffectsBase Other) const
Check whether this is the same as other MemoryEffectsBase.
Definition ModRef.h:290
bool onlyAccessesInaccessibleOrArgMem() const
Whether this function only (at most) accesses argument and inaccessible memory.
Definition ModRef.h:250
static MemoryEffectsBase unknown()
Create MemoryEffectsBase that can read and write any memory.
Definition ModRef.h:120
This class implements an extremely fast bulk output stream that can only output to a stream.
This is an optimization pass for GlobalISel generic memory operations.
bool capturesReadProvenanceOnly(CaptureComponents CC)
Definition ModRef.h:336
bool capturesAddressIsNullOnly(CaptureComponents CC)
Definition ModRef.h:328
auto enum_seq_inclusive(EnumT Begin, EnumT End)
Iterate over an enum type from Begin to End inclusive.
bool capturesAddress(CaptureComponents CC)
Definition ModRef.h:332
constexpr force_iteration_on_noniterable_enum_t force_iteration_on_noniterable_enum
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
Definition ModRef.h:301
MemoryEffects FunctionModRefBehavior
Definition ModRef.h:307
bool capturesFullProvenance(CaptureComponents CC)
Definition ModRef.h:341
bool isModSet(const ModRefInfo MRI)
Definition ModRef.h:49
bool isModOrRefSet(const ModRefInfo MRI)
Definition ModRef.h:43
CaptureComponents
Components of the pointer that may be captured.
Definition ModRef.h:310
@ None
Definition ModRef.h:311
@ Provenance
Definition ModRef.h:315
@ ReadProvenance
Definition ModRef.h:314
@ AddressIsNull
Definition ModRef.h:312
@ All
Definition ModRef.h:316
@ Address
Definition ModRef.h:313
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
Definition ModRef.h:28
@ Ref
The access may reference the value stored in memory.
Definition ModRef.h:32
@ ModRef
The access may reference and may modify the value stored in memory.
Definition ModRef.h:36
@ Mod
The access may modify the value stored in memory.
Definition ModRef.h:34
@ LLVM_MARK_AS_BITMASK_ENUM
Definition ModRef.h:37
@ NoModRef
The access neither references nor modifies the value stored in memory.
Definition ModRef.h:30
IRMemLocation
The locations at which a function might access memory.
Definition ModRef.h:60
@ ErrnoMem
Errno memory.
Definition ModRef.h:66
@ ArgMem
Access to memory via argument pointers.
Definition ModRef.h:62
@ FirstTarget
Definition ModRef.h:75
@ TargetMem1
Definition ModRef.h:71
@ TargetMem0
Represents target specific state.
Definition ModRef.h:70
@ Other
Any other memory.
Definition ModRef.h:68
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
@ InaccessibleMem
Memory that is inaccessible via LLVM IR.
Definition ModRef.h:64
FunctionAddr VTableAddr uintptr_t uintptr_t Data
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
bool isModAndRefSet(const ModRefInfo MRI)
Definition ModRef.h:46
bool capturesAnything(CaptureComponents CC)
Definition ModRef.h:324
bool capturesAll(CaptureComponents CC)
Definition ModRef.h:349
bool capturesNothing(CaptureComponents CC)
Definition ModRef.h:320
bool isNoModRef(const ModRefInfo MRI)
Definition ModRef.h:40
bool capturesAnyProvenance(CaptureComponents CC)
Definition ModRef.h:345
bool isRefSet(const ModRefInfo MRI)
Definition ModRef.h:52