28 if (!BB.getTerminator())
39 std::vector<BasicBlock *> ret;
48 ret.push_back(
Node->getBlock());
59 std::vector<BasicBlock *> ret;
66 ret.push_back(Child->getBlock());
68 while (Idx < ret.size()) {
72 ret.push_back(Child->getBlock());
89std::pair<GlobalVariable *, bool>
97 bool DidCreate =
false;
101 RS.sample(
nullptr, 1);
113 M->getDataLayout().getDefaultGlobalsAddressSpace());
115 return {GV, DidCreate};
127 if (M && M->getTargetTriple().isAMDGCN()) {
130 if (pointerType && pointerType->getAddressSpace() == 8) {
152static std::pair<Instruction *, SmallVector<Instruction *>>
154 const Twine &LoadName) {
162 return std::make_pair(Load, NewInsts);
167 for (
auto it = NewInsts.
rbegin(); it != NewInsts.
rend(); ++it) {
168 (*it)->eraseFromParent();
176 bool allowConstant) {
177 auto MatchesPred = [&Srcs, &Pred](
Value *V) {
return Pred.matches(Srcs, V); };
187 return RS.getSelection();
194 for (
uint64_t i = 0; i <
F->arg_size(); i++) {
195 Args.push_back(
F->getArg(i));
199 return RS.getSelection();
205 std::shuffle(Dominators.begin(), Dominators.end(),
Rand);
213 return RS.getSelection();
221 Type *Ty = GV->getValueType();
231 if (Pred.matches(Srcs, LoadGV)) {
237 if (GV->use_empty()) {
238 GV->eraseFromParent();
244 return newSource(BB, Insts, Srcs, Pred, allowConstant);
257 bool allowConstant) {
268 IP = ++
I->getIterator();
269 assert(IP != BB.
end() &&
"guaranteed by the findPointer");
272 Type *AccessTy = RS.getSelection()->getType();
275 auto [NewLoad, NewInsts] =
279 if (Pred.matches(Srcs, NewLoad))
280 RS.sample(NewLoad, RS.totalWeight());
287 Value *newSrc = RS.getSelection();
296 newSrc =
new LoadInst(Ty, Alloca,
"L",
299 newSrc =
new LoadInst(Ty, Alloca,
"L", &BB);
306 const Value *Replacement) {
310 switch (
I->getOpcode()) {
311 case Instruction::GetElementPtr:
312 case Instruction::ExtractElement:
313 case Instruction::ExtractValue:
319 case Instruction::InsertValue:
320 case Instruction::InsertElement:
321 case Instruction::ShuffleVector:
328 case Instruction::Switch:
329 case Instruction::CondBr:
333 case Instruction::Call:
334 case Instruction::Invoke:
335 case Instruction::CallBr: {
343 if (!Callee->getIntrinsicID() && OperandNo == 0)
345 return !Callee->hasParamAttribute(OperandNo, Attribute::ImmArg);
360 auto findSinkAndConnect =
363 for (
auto &
I : Instructions) {
364 for (
Use &U :
I->operands())
369 Use *Sink = RS.getSelection();
370 User *U = Sink->getUser();
371 unsigned OpNo = Sink->getOperandNo();
372 U->setOperand(OpNo, V);
381 Sink = findSinkAndConnect(Insts);
387 std::shuffle(Dominators.begin(), Dominators.end(),
Rand);
400 std::shuffle(Dominatees.begin(), Dominatees.end(),
Rand);
402 std::vector<Instruction *> Instructions;
404 Instructions.push_back(&
I);
405 Sink = findSinkAndConnect(Instructions);
417 auto [GV, DidCreate] =
434 Type *Ty = V->getType();
450 if (Inst->isTerminator())
453 return Inst->getType()->isPointerTy();
456 return RS.getSelection();
470 for (
uint64_t i = 0; i < ArgNum; i++) {
493 Type *RetTy =
F->getReturnType();
496 new AllocaInst(RetTy,
DL.getAllocaAddrSpace(),
"RP", BB);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Module.h This file contains the declarations for the Module class.
static bool isCompatibleReplacement(const Instruction *I, const Use &Operand, const Value *Replacement)
static Value * buildTargetLegalPtr(Module *M, Value *Ptr, InsertPosition IP, const Twine &Name, SmallVector< Instruction * > *NewInsts)
static void eraseNewInstructions(SmallVector< Instruction * > &NewInsts)
static std::pair< Instruction *, SmallVector< Instruction * > > buildTargetLegalLoad(Type *AccessTy, Value *Ptr, InsertPosition IP, Module *M, const Twine &LoadName)
static Instruction * buildTargetLegalStore(Value *Val, Value *Ptr, InsertPosition IP, Module *M)
static std::vector< BasicBlock * > getDominators(BasicBlock *BB)
Return a vector of Blocks that dominates this block, excluding current block.
static DominatorTree getDomTree(Function &F)
static std::vector< BasicBlock * > getDominatees(BasicBlock *BB)
Return a vector of Blocks that is dominated by this block, excluding current block.
This class represents a conversion between pointers from one address space to another.
an instruction to allocate memory on the stack
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
const T & back() const
back - Get the last element.
LLVM Basic Block Representation.
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
const Function * getParent() const
Return the enclosing method, or null if none.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
LLVM_ABI const Module * getModule() const
Return the module owning the function this basic block belongs to, or nullptr if the function does no...
This is an important base class in LLVM.
A parsed version of the target data layout string in and methods for querying it.
iterator_range< iterator > children()
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
Module * getParent()
Get the module that this global value is contained inside of...
LinkageTypes
An enumeration for the kinds of linkage for global values.
@ ExternalLinkage
Externally visible function.
This is an important class for using LLVM in a threaded context.
An instruction for reading from memory.
A Module instance is used to store all the information related to an LLVM module.
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
static ReturnInst * Create(LLVMContext &C, Value *retVal=nullptr, InsertPosition InsertBefore=nullptr)
void push_back(const T &Elt)
reverse_iterator rbegin()
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
This function has undefined behavior.
A Use represents the edge between a Value definition and its users.
LLVM_ABI unsigned getOperandNo() const
Return the operand # of this use in its User.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
A matcher/generator for finding suitable values for the next source in an operation's partially compl...
self_iterator getIterator()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static SourcePred onlyType(Type *Only)
static SourcePred anyType()
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
DomTreeNodeBase< BasicBlock > DomTreeNode
ReservoirSampler< ElT, GenT > makeSampler(GenT &RandGen, RangeT &&Items)
iterator_range< filter_iterator< detail::IterOfRange< RangeT >, PredicateT > > make_filter_range(RangeT &&Range, PredicateT Pred)
Convenience function that takes a range of elements and a predicate, and return a new filter_iterator...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
T uniform(GenT &Gen, T Min, T Max)
Return a uniformly distributed random value between Min and Max.
LLVM_ABI Function * createFunctionDeclaration(Module &M, uint64_t ArgNum)
SmallVector< Type *, 16 > KnownTypes
LLVM_ABI std::pair< GlobalVariable *, bool > findOrCreateGlobalVariable(Module *M, ArrayRef< Value * > Srcs, fuzzerop::SourcePred Pred)
Find or create a global variable.
LLVM_ABI Value * findOrCreateSource(BasicBlock &BB, ArrayRef< Instruction * > Insts)
Find a "source" for some operation, which will be used in one of the operation's operands.
LLVM_ABI AllocaInst * createStackMemory(Function *F, Type *Ty, Value *Init=nullptr)
Create a stack memory at the head of the function, store Init to the memory if provided.
LLVM_ABI Instruction * newSink(BasicBlock &BB, ArrayRef< Instruction * > Insts, Value *V)
Create a user for V in BB.
LLVM_ABI Function * createFunctionDefinition(Module &M, uint64_t ArgNum)
LLVM_ABI Value * newSource(BasicBlock &BB, ArrayRef< Instruction * > Insts, ArrayRef< Value * > Srcs, fuzzerop::SourcePred Pred, bool allowConstant=true)
Create some Value suitable as a source for some operation.
LLVM_ABI Instruction * connectToSink(BasicBlock &BB, ArrayRef< Instruction * > Insts, Value *V)
Find a viable user for V in Insts, which should all be contained in BB.
@ SinkToInstInCurBlock
TODO: Also consider pointers in function argument.
LLVM_ABI Value * findPointer(BasicBlock &BB, ArrayRef< Instruction * > Insts)
LLVM_ABI Type * randomType()
Return a uniformly choosen type from AllowedTypes.