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