LLVM 20.0.0git
Utils.h
Go to the documentation of this file.
1//===- Utils.h --------------------------------------------------*- 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// Collector for SandboxIR related convenience functions that don't belong in
10// other classes.
11
12#ifndef LLVM_SANDBOXIR_UTILS_H
13#define LLVM_SANDBOXIR_UTILS_H
14
20#include "llvm/IR/Verifier.h"
23#include <optional>
24
25namespace llvm::sandboxir {
26
27class Utils {
28public:
29 /// \Returns the expected type of \p Value V. For most Values this is
30 /// equivalent to getType, but for stores returns the stored type, rather
31 /// than void, and for ReturnInsts returns the returned type.
32 static Type *getExpectedType(const Value *V) {
33 if (auto *I = dyn_cast<Instruction>(V)) {
34 // A Return's value operand can be null if it returns void.
35 if (auto *RI = dyn_cast<ReturnInst>(I)) {
36 if (RI->getReturnValue() == nullptr)
37 return RI->getType();
38 }
39 return getExpectedValue(I)->getType();
40 }
41 return V->getType();
42 }
43
44 /// \Returns the expected Value for this instruction. For most instructions,
45 /// this is the instruction itself, but for stores returns the stored
46 /// operand, and for ReturnInstructions returns the returned value.
48 if (auto *SI = dyn_cast<StoreInst>(I))
49 return SI->getValueOperand();
50 if (auto *RI = dyn_cast<ReturnInst>(I))
51 return RI->getReturnValue();
52 return const_cast<Instruction *>(I);
53 }
54
55 /// \Returns the base Value for load or store instruction \p LSI.
56 template <typename LoadOrStoreT>
57 static Value *getMemInstructionBase(const LoadOrStoreT *LSI) {
58 static_assert(std::is_same_v<LoadOrStoreT, LoadInst> ||
59 std::is_same_v<LoadOrStoreT, StoreInst>,
60 "Expected sandboxir::Load or sandboxir::Store!");
61 return LSI->Ctx.getOrCreateValue(
62 getUnderlyingObject(LSI->getPointerOperand()->Val));
63 }
64
65 /// \Returns the number of bits of \p Ty.
66 static unsigned getNumBits(Type *Ty, const DataLayout &DL) {
67 return DL.getTypeSizeInBits(Ty->LLVMTy);
68 }
69
70 /// \Returns the number of bits required to represent the operands or return
71 /// value of \p V in \p DL.
72 static unsigned getNumBits(Value *V, const DataLayout &DL) {
73 Type *Ty = getExpectedType(V);
74 return getNumBits(Ty, DL);
75 }
76
77 /// \Returns the number of bits required to represent the operands or
78 /// return value of \p I.
79 static unsigned getNumBits(Instruction *I) {
80 return I->getDataLayout().getTypeSizeInBits(getExpectedType(I)->LLVMTy);
81 }
82
83 /// Equivalent to MemoryLocation::getOrNone(I).
84 static std::optional<llvm::MemoryLocation>
86 return llvm::MemoryLocation::getOrNone(cast<llvm::Instruction>(I->Val));
87 }
88
89 /// \Returns the gap between the memory locations accessed by \p I0 and
90 /// \p I1 in bytes.
91 template <typename LoadOrStoreT>
92 static std::optional<int> getPointerDiffInBytes(LoadOrStoreT *I0,
93 LoadOrStoreT *I1,
94 ScalarEvolution &SE) {
95 static_assert(std::is_same_v<LoadOrStoreT, LoadInst> ||
96 std::is_same_v<LoadOrStoreT, StoreInst>,
97 "Expected sandboxir::Load or sandboxir::Store!");
98 llvm::Value *Opnd0 = I0->getPointerOperand()->Val;
99 llvm::Value *Opnd1 = I1->getPointerOperand()->Val;
100 llvm::Value *Ptr0 = getUnderlyingObject(Opnd0);
101 llvm::Value *Ptr1 = getUnderlyingObject(Opnd1);
102 if (Ptr0 != Ptr1)
103 return false;
105 return getPointersDiff(ElemTy, Opnd0, ElemTy, Opnd1, I0->getDataLayout(),
106 SE, /*StrictCheck=*/false, /*CheckType=*/false);
107 }
108
109 /// \Returns true if \p I0 accesses a memory location lower than \p I1.
110 /// Returns false if the difference cannot be determined, if the memory
111 /// locations are equal, or if I1 accesses a memory location greater than I0.
112 template <typename LoadOrStoreT>
113 static bool atLowerAddress(LoadOrStoreT *I0, LoadOrStoreT *I1,
114 ScalarEvolution &SE) {
115 auto Diff = getPointerDiffInBytes(I0, I1, SE);
116 if (!Diff)
117 return false;
118 return *Diff > 0;
119 }
120
121 /// Equivalent to BatchAA::getModRefInfo().
122 static ModRefInfo
124 const std::optional<MemoryLocation> &OptLoc) {
125 return BatchAA.getModRefInfo(cast<llvm::Instruction>(I->Val), OptLoc);
126 }
127
128 /// Equivalent to llvm::verifyFunction().
129 /// \Returns true if the IR is broken.
130 static bool verifyFunction(const Function *F, raw_ostream &OS) {
131 const auto &LLVMF = *cast<llvm::Function>(F->Val);
132 return llvm::verifyFunction(LLVMF, &OS);
133 }
134};
135
136} // namespace llvm::sandboxir
137
138#endif // LLVM_SANDBOXIR_UTILS_H
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
This file provides utility analysis objects describing memory locations.
raw_pwrite_stream & OS
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
ModRefInfo getModRefInfo(const Instruction *I, const std::optional< MemoryLocation > &OptLoc)
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:63
static std::optional< MemoryLocation > getOrNone(const Instruction *Inst)
The main scalar evolution driver.
LLVMContext & getContext() const
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
static IntegerType * getInt8Ty(LLVMContext &C)
LLVM Value Representation.
Definition: Value.h:74
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
Value * getOrCreateValue(llvm::Value *LLVMV)
Get or create a sandboxir::Value for an existing LLVM IR LLVMV.
Definition: Context.h:122
A sandboxir::User with operands, opcode and linked with previous/next instructions in an instruction ...
Definition: Instruction.h:42
Just like llvm::Type these are immutable, unique, never get freed and can only be created via static ...
Definition: Type.h:43
llvm::Type * LLVMTy
Definition: Type.h:45
static unsigned getNumBits(Value *V, const DataLayout &DL)
\Returns the number of bits required to represent the operands or return value of V in DL.
Definition: Utils.h:72
static bool atLowerAddress(LoadOrStoreT *I0, LoadOrStoreT *I1, ScalarEvolution &SE)
\Returns true if I0 accesses a memory location lower than I1.
Definition: Utils.h:113
static std::optional< int > getPointerDiffInBytes(LoadOrStoreT *I0, LoadOrStoreT *I1, ScalarEvolution &SE)
\Returns the gap between the memory locations accessed by I0 and I1 in bytes.
Definition: Utils.h:92
static ModRefInfo aliasAnalysisGetModRefInfo(BatchAAResults &BatchAA, const Instruction *I, const std::optional< MemoryLocation > &OptLoc)
Equivalent to BatchAA::getModRefInfo().
Definition: Utils.h:123
static unsigned getNumBits(Type *Ty, const DataLayout &DL)
\Returns the number of bits of Ty.
Definition: Utils.h:66
static Type * getExpectedType(const Value *V)
\Returns the expected type of Value V.
Definition: Utils.h:32
static unsigned getNumBits(Instruction *I)
\Returns the number of bits required to represent the operands or return value of I.
Definition: Utils.h:79
static std::optional< llvm::MemoryLocation > memoryLocationGetOrNone(const Instruction *I)
Equivalent to MemoryLocation::getOrNone(I).
Definition: Utils.h:85
static Value * getMemInstructionBase(const LoadOrStoreT *LSI)
\Returns the base Value for load or store instruction LSI.
Definition: Utils.h:57
static bool verifyFunction(const Function *F, raw_ostream &OS)
Equivalent to llvm::verifyFunction().
Definition: Utils.h:130
static Value * getExpectedValue(const Instruction *I)
\Returns the expected Value for this instruction.
Definition: Utils.h:47
A SandboxIR Value has users. This is the base class.
Definition: Value.h:63
Context & Ctx
All values point to the context.
Definition: Value.h:173
Type * getType() const
Definition: Value.cpp:46
std::optional< int > getPointersDiff(Type *ElemTyA, Value *PtrA, Type *ElemTyB, Value *PtrB, const DataLayout &DL, ScalarEvolution &SE, bool StrictCheck=false, bool CheckType=true)
Returns the distance between the pointers PtrA and PtrB iff they are compatible and it is possible to...
bool verifyFunction(const Function &F, raw_ostream *OS=nullptr)
Check a function for errors, useful for use when debugging a pass.
Definition: Verifier.cpp:7301
const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=6)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
Definition: ModRef.h:27