LLVM 24.0.0git
Evaluator.cpp
Go to the documentation of this file.
1//===- Evaluator.cpp - LLVM IR evaluator ----------------------------------===//
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// Function evaluator for LLVM IR.
10//
11//===----------------------------------------------------------------------===//
12
14#include "llvm/ADT/DenseMap.h"
15#include "llvm/ADT/STLExtras.h"
19#include "llvm/IR/BasicBlock.h"
20#include "llvm/IR/Constant.h"
21#include "llvm/IR/Constants.h"
22#include "llvm/IR/DataLayout.h"
24#include "llvm/IR/Function.h"
25#include "llvm/IR/GlobalAlias.h"
26#include "llvm/IR/GlobalValue.h"
28#include "llvm/IR/InstrTypes.h"
29#include "llvm/IR/Instruction.h"
32#include "llvm/IR/Type.h"
33#include "llvm/IR/User.h"
34#include "llvm/IR/Value.h"
36#include "llvm/Support/Debug.h"
38
39#define DEBUG_TYPE "evaluator"
40
41using namespace llvm;
42
43static inline bool
45 SmallPtrSetImpl<Constant *> &SimpleConstants,
46 const DataLayout &DL);
47
48/// Return true if the specified constant can be handled by the code generator.
49/// We don't want to generate something like:
50/// void *X = &X/42;
51/// because the code generator doesn't have a relocation that can handle that.
52///
53/// This function should be called if C was not found (but just got inserted)
54/// in SimpleConstants to avoid having to rescan the same constants all the
55/// time.
56static bool
58 SmallPtrSetImpl<Constant *> &SimpleConstants,
59 const DataLayout &DL) {
60 // Simple global addresses are supported, do not allow dllimport or
61 // thread-local globals.
62 if (auto *GV = dyn_cast<GlobalValue>(C))
63 return !GV->hasDLLImportStorageClass() && !GV->isThreadLocal();
64
65 // Simple integer, undef, constant aggregate zero, etc are all supported.
66 if (C->getNumOperands() == 0 || isa<BlockAddress>(C))
67 return true;
68
69 // Aggregate values are safe if all their elements are.
71 for (Value *Op : C->operands())
72 if (!isSimpleEnoughValueToCommit(cast<Constant>(Op), SimpleConstants, DL))
73 return false;
74 return true;
75 }
76
77 // We don't know exactly what relocations are allowed in constant expressions,
78 // so we allow &global+constantoffset, which is safe and uniformly supported
79 // across targets.
81 if (!CE)
82 return false;
83 switch (CE->getOpcode()) {
84 case Instruction::BitCast:
85 // Bitcast is fine if the casted value is fine.
86 return isSimpleEnoughValueToCommit(CE->getOperand(0), SimpleConstants, DL);
87
88 case Instruction::IntToPtr:
89 case Instruction::PtrToInt:
90 // int <=> ptr is fine if the int type is the same size as the
91 // pointer type.
92 if (DL.getTypeSizeInBits(CE->getType()) !=
93 DL.getTypeSizeInBits(CE->getOperand(0)->getType()))
94 return false;
95 return isSimpleEnoughValueToCommit(CE->getOperand(0), SimpleConstants, DL);
96
97 // GEP is fine if it is simple + constant offset.
98 case Instruction::GetElementPtr:
99 for (unsigned i = 1, e = CE->getNumOperands(); i != e; ++i)
100 if (!isa<ConstantInt>(CE->getOperand(i)))
101 return false;
102 return isSimpleEnoughValueToCommit(CE->getOperand(0), SimpleConstants, DL);
103
104 case Instruction::Add:
105 // We allow simple+cst.
106 if (!isa<ConstantInt>(CE->getOperand(1)))
107 return false;
108 return isSimpleEnoughValueToCommit(CE->getOperand(0), SimpleConstants, DL);
109 }
110 return false;
111}
112
113static inline bool
115 SmallPtrSetImpl<Constant *> &SimpleConstants,
116 const DataLayout &DL) {
117 // If we already checked this constant, we win.
118 if (!SimpleConstants.insert(C).second)
119 return true;
120 // Check the constant.
121 return isSimpleEnoughValueToCommitHelper(C, SimpleConstants, DL);
122}
123
124void Evaluator::MutableValue::clear() {
125 if (auto *Agg = dyn_cast_if_present<MutableAggregate *>(Val))
126 delete Agg;
127 Val = nullptr;
128}
129
130Constant *Evaluator::MutableValue::read(Type *Ty, APInt Offset,
131 const DataLayout &DL) const {
132 TypeSize TySize = DL.getTypeStoreSize(Ty);
133 const MutableValue *V = this;
134 while (const auto *Agg = dyn_cast_if_present<MutableAggregate *>(V->Val)) {
135 Type *AggTy = Agg->Ty;
136 std::optional<APInt> Index = DL.getGEPIndexForOffset(AggTy, Offset);
137 if (!Index || Index->uge(Agg->Elements.size()) ||
138 !TypeSize::isKnownLE(TySize, DL.getTypeStoreSize(AggTy)))
139 return nullptr;
140
141 V = &Agg->Elements[Index->getZExtValue()];
142 }
143
144 return ConstantFoldLoadFromConst(cast<Constant *>(V->Val), Ty, Offset, DL);
145}
146
147bool Evaluator::MutableValue::makeMutable() {
149 Type *Ty = C->getType();
150 unsigned NumElements;
151 if (auto *VT = dyn_cast<FixedVectorType>(Ty)) {
152 NumElements = VT->getNumElements();
153 } else if (auto *AT = dyn_cast<ArrayType>(Ty))
154 NumElements = AT->getNumElements();
155 else if (auto *ST = dyn_cast<StructType>(Ty))
156 NumElements = ST->getNumElements();
157 else
158 return false;
159
160 MutableAggregate *MA = new MutableAggregate(Ty);
161 MA->Elements.reserve(NumElements);
162 for (unsigned I = 0; I < NumElements; ++I)
163 MA->Elements.push_back(C->getAggregateElement(I));
164 Val = MA;
165 return true;
166}
167
168bool Evaluator::MutableValue::write(Constant *V, APInt Offset,
169 const DataLayout &DL) {
170 Type *Ty = V->getType();
171 TypeSize TySize = DL.getTypeStoreSize(Ty);
172 MutableValue *MV = this;
173 while (Offset != 0 ||
174 !CastInst::isBitOrNoopPointerCastable(Ty, MV->getType(), DL)) {
175 if (isa<Constant *>(MV->Val) && !MV->makeMutable())
176 return false;
177
178 MutableAggregate *Agg = cast<MutableAggregate *>(MV->Val);
179 Type *AggTy = Agg->Ty;
180 std::optional<APInt> Index = DL.getGEPIndexForOffset(AggTy, Offset);
181 if (!Index || Index->uge(Agg->Elements.size()) ||
182 !TypeSize::isKnownLE(TySize, DL.getTypeStoreSize(AggTy)))
183 return false;
184
185 MV = &Agg->Elements[Index->getZExtValue()];
186 }
187
188 Type *MVType = MV->getType();
189 MV->clear();
190 if (Ty->isIntegerTy() && MVType->isPointerTy())
191 MV->Val = ConstantExpr::getIntToPtr(V, MVType);
192 else if (Ty->isPointerTy() && MVType->isIntegerTy())
193 MV->Val = ConstantExpr::getPtrToInt(V, MVType);
194 else if (Ty != MVType)
195 MV->Val = ConstantExpr::getBitCast(V, MVType);
196 else
197 MV->Val = V;
198 return true;
199}
200
201Constant *Evaluator::MutableAggregate::toConstant() const {
203 for (const MutableValue &MV : Elements)
204 Consts.push_back(MV.toConstant());
205
206 if (auto *ST = dyn_cast<StructType>(Ty))
207 return ConstantStruct::get(ST, Consts);
208 if (auto *AT = dyn_cast<ArrayType>(Ty))
209 return ConstantArray::get(AT, Consts);
210 assert(isa<FixedVectorType>(Ty) && "Must be vector");
211 return ConstantVector::get(Consts);
212}
213
214/// Return the value that would be computed by a load from P after the stores
215/// reflected by 'memory' have been performed. If we can't decide, return null.
216Constant *Evaluator::ComputeLoadResult(Constant *P, Type *Ty) {
217 APInt Offset(DL.getIndexTypeSizeInBits(P->getType()), 0);
218 P = cast<Constant>(P->stripAndAccumulateConstantOffsets(
219 DL, Offset, /* AllowNonInbounds */ true));
220 Offset = Offset.sextOrTrunc(DL.getIndexTypeSizeInBits(P->getType()));
221 if (auto *GV = dyn_cast<GlobalVariable>(P))
222 return ComputeLoadResult(GV, Ty, Offset);
223 return nullptr;
224}
225
226Constant *Evaluator::ComputeLoadResult(GlobalVariable *GV, Type *Ty,
227 const APInt &Offset) {
228 auto It = MutatedMemory.find(GV);
229 if (It != MutatedMemory.end())
230 return It->second.read(Ty, Offset, DL);
231
232 if (!GV->hasDefinitiveInitializer())
233 return nullptr;
234 return ConstantFoldLoadFromConst(GV->getInitializer(), Ty, Offset, DL);
235}
236
238 if (auto *Fn = dyn_cast<Function>(C))
239 return Fn;
240
241 if (auto *Alias = dyn_cast<GlobalAlias>(C))
242 if (auto *Fn = dyn_cast<Function>(Alias->getAliasee()))
243 return Fn;
244 return nullptr;
245}
246
247Function *
248Evaluator::getCalleeWithFormalArgs(CallBase &CB,
249 SmallVectorImpl<Constant *> &Formals) {
250 auto *V = CB.getCalledOperand()->stripPointerCasts();
251 if (auto *Fn = getFunction(getVal(V)))
252 return getFormalParams(CB, Fn, Formals) ? Fn : nullptr;
253 return nullptr;
254}
255
256bool Evaluator::getFormalParams(CallBase &CB, Function *F,
257 SmallVectorImpl<Constant *> &Formals) {
258 auto *FTy = F->getFunctionType();
259 if (FTy != CB.getFunctionType()) {
260 LLVM_DEBUG(dbgs() << "Signature mismatch.\n");
261 return false;
262 }
263
264 for (Value *Arg : CB.args())
265 Formals.push_back(getVal(Arg));
266 return true;
267}
268
269/// Evaluate all instructions in block BB, returning true if successful, false
270/// if we can't evaluate it. NewBB returns the next BB that control flows into,
271/// or null upon return. StrippedPointerCastsForAliasAnalysis is set to true if
272/// we looked through pointer casts to evaluate something.
273bool Evaluator::EvaluateBlock(BasicBlock::iterator CurInst, BasicBlock *&NextBB,
274 bool &StrippedPointerCastsForAliasAnalysis) {
275 // This is the main evaluation loop.
276 while (true) {
277 Constant *InstResult = nullptr;
278
279 LLVM_DEBUG(dbgs() << "Evaluating Instruction: " << *CurInst << "\n");
280
281 if (StoreInst *SI = dyn_cast<StoreInst>(CurInst)) {
282 if (SI->isVolatile()) {
283 LLVM_DEBUG(dbgs() << "Store is volatile! Can not evaluate.\n");
284 return false; // no volatile accesses.
285 }
286 Constant *Ptr = getVal(SI->getOperand(1));
287 Constant *FoldedPtr = ConstantFoldConstant(Ptr, DL, TLI);
288 if (Ptr != FoldedPtr) {
289 LLVM_DEBUG(dbgs() << "Folding constant ptr expression: " << *Ptr);
290 Ptr = FoldedPtr;
291 LLVM_DEBUG(dbgs() << "; To: " << *Ptr << "\n");
292 }
293
294 APInt Offset(DL.getIndexTypeSizeInBits(Ptr->getType()), 0);
296 DL, Offset, /* AllowNonInbounds */ true));
297 Offset = Offset.sextOrTrunc(DL.getIndexTypeSizeInBits(Ptr->getType()));
298 auto *GV = dyn_cast<GlobalVariable>(Ptr);
299 if (!GV || !GV->hasUniqueInitializer()) {
300 LLVM_DEBUG(dbgs() << "Store is not to global with unique initializer: "
301 << *Ptr << "\n");
302 return false;
303 }
304
305 // If this might be too difficult for the backend to handle (e.g. the addr
306 // of one global variable divided by another) then we can't commit it.
307 Constant *Val = getVal(SI->getOperand(0));
308 if (!isSimpleEnoughValueToCommit(Val, SimpleConstants, DL)) {
309 LLVM_DEBUG(dbgs() << "Store value is too complex to evaluate store. "
310 << *Val << "\n");
311 return false;
312 }
313
314 auto Res = MutatedMemory.try_emplace(GV, GV->getInitializer());
315 if (!Res.first->second.write(Val, Offset, DL))
316 return false;
317 } else if (LoadInst *LI = dyn_cast<LoadInst>(CurInst)) {
318 if (LI->isVolatile()) {
320 dbgs() << "Found a Load! Volatile load, can not evaluate.\n");
321 return false; // no volatile accesses.
322 }
323
324 Constant *Ptr = getVal(LI->getOperand(0));
325 Constant *FoldedPtr = ConstantFoldConstant(Ptr, DL, TLI);
326 if (Ptr != FoldedPtr) {
327 Ptr = FoldedPtr;
328 LLVM_DEBUG(dbgs() << "Found a constant pointer expression, constant "
329 "folding: "
330 << *Ptr << "\n");
331 }
332 InstResult = ComputeLoadResult(Ptr, LI->getType());
333 if (!InstResult) {
335 dbgs() << "Failed to compute load result. Can not evaluate load."
336 "\n");
337 return false; // Could not evaluate load.
338 }
339
340 LLVM_DEBUG(dbgs() << "Evaluated load: " << *InstResult << "\n");
341 } else if (AllocaInst *AI = dyn_cast<AllocaInst>(CurInst)) {
342 if (AI->isArrayAllocation()) {
343 LLVM_DEBUG(dbgs() << "Found an array alloca. Can not evaluate.\n");
344 return false; // Cannot handle array allocs.
345 }
346 Type *Ty = AI->getAllocatedType();
347 AllocaTmps.push_back(std::make_unique<GlobalVariable>(
349 AI->getName(), /*TLMode=*/GlobalValue::NotThreadLocal,
350 AI->getType()->getPointerAddressSpace()));
351 InstResult = AllocaTmps.back().get();
352 LLVM_DEBUG(dbgs() << "Found an alloca. Result: " << *InstResult << "\n");
353 } else if (isa<CallInst>(CurInst) || isa<InvokeInst>(CurInst)) {
354 CallBase &CB = *cast<CallBase>(&*CurInst);
355
356 // Cannot handle inline asm.
357 if (CB.isInlineAsm()) {
358 LLVM_DEBUG(dbgs() << "Found inline asm, can not evaluate.\n");
359 return false;
360 }
361
362 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(&CB)) {
363 if (MemSetInst *MSI = dyn_cast<MemSetInst>(II)) {
364 if (MSI->isVolatile()) {
365 LLVM_DEBUG(dbgs() << "Can not optimize a volatile memset "
366 << "intrinsic.\n");
367 return false;
368 }
369
370 auto *LenC = dyn_cast<ConstantInt>(getVal(MSI->getLength()));
371 if (!LenC) {
372 LLVM_DEBUG(dbgs() << "Memset with unknown length.\n");
373 return false;
374 }
375
376 Constant *Ptr = getVal(MSI->getDest());
377 APInt Offset(DL.getIndexTypeSizeInBits(Ptr->getType()), 0);
379 DL, Offset, /* AllowNonInbounds */ true));
380 auto *GV = dyn_cast<GlobalVariable>(Ptr);
381 if (!GV) {
382 LLVM_DEBUG(dbgs() << "Memset with unknown base.\n");
383 return false;
384 }
385
386 Constant *Val = getVal(MSI->getValue());
387 // Avoid the byte-per-byte scan if we're memseting a zeroinitializer
388 // to zero.
389 if (!Val->isNullValue() || MutatedMemory.contains(GV) ||
391 !GV->getInitializer()->isNullValue()) {
392 APInt Len = LenC->getValue();
393 if (Len.ugt(64 * 1024)) {
394 LLVM_DEBUG(dbgs() << "Not evaluating large memset of size "
395 << Len << "\n");
396 return false;
397 }
398
399 while (Len != 0) {
400 Constant *DestVal = ComputeLoadResult(GV, Val->getType(), Offset);
401 if (DestVal != Val) {
402 LLVM_DEBUG(dbgs() << "Memset is not a no-op at offset "
403 << Offset << " of " << *GV << ".\n");
404 return false;
405 }
406 ++Offset;
407 --Len;
408 }
409 }
410
411 LLVM_DEBUG(dbgs() << "Ignoring no-op memset.\n");
412 ++CurInst;
413 continue;
414 }
415
416 if (II->isLifetimeStartOrEnd()) {
417 LLVM_DEBUG(dbgs() << "Ignoring lifetime intrinsic.\n");
418 ++CurInst;
419 continue;
420 }
421
422 if (II->getIntrinsicID() == Intrinsic::invariant_start) {
423 // We don't insert an entry into Values, as it doesn't have a
424 // meaningful return value.
425 if (!II->use_empty()) {
427 << "Found unused invariant_start. Can't evaluate.\n");
428 return false;
429 }
430 ConstantInt *Size = cast<ConstantInt>(II->getArgOperand(0));
431 Value *PtrArg = getVal(II->getArgOperand(1));
432 Value *Ptr = PtrArg->stripPointerCasts();
433 if (GlobalVariable *GV = dyn_cast<GlobalVariable>(Ptr)) {
434 uint64_t MinGVSize = GV->getGlobalSize(DL);
435 if (!Size->isMinusOne() &&
436 Size->getValue().getLimitedValue() >= MinGVSize) {
437 Invariants.insert(GV);
438 LLVM_DEBUG(dbgs() << "Found a global var that is an invariant: "
439 << *GV << "\n");
440 } else {
442 << "Found a global var, but can not treat it as an "
443 "invariant.\n");
444 }
445 }
446 // Continue even if we do nothing.
447 ++CurInst;
448 continue;
449 } else if (II->getIntrinsicID() == Intrinsic::assume) {
450 LLVM_DEBUG(dbgs() << "Skipping assume intrinsic.\n");
451 ++CurInst;
452 continue;
453 } else if (II->getIntrinsicID() == Intrinsic::sideeffect) {
454 LLVM_DEBUG(dbgs() << "Skipping sideeffect intrinsic.\n");
455 ++CurInst;
456 continue;
457 } else if (II->getIntrinsicID() == Intrinsic::pseudoprobe) {
458 LLVM_DEBUG(dbgs() << "Skipping pseudoprobe intrinsic.\n");
459 ++CurInst;
460 continue;
461 } else {
462 Value *Stripped = CurInst->stripPointerCastsForAliasAnalysis();
463 // Only attempt to getVal() if we've actually managed to strip
464 // anything away, or else we'll call getVal() on the current
465 // instruction.
466 if (Stripped != &*CurInst) {
467 InstResult = getVal(Stripped);
468 }
469 if (InstResult) {
471 << "Stripped pointer casts for alias analysis for "
472 "intrinsic call.\n");
473 StrippedPointerCastsForAliasAnalysis = true;
474 InstResult = ConstantExpr::getBitCast(InstResult, II->getType());
475 } else {
476 LLVM_DEBUG(dbgs() << "Unknown intrinsic. Cannot evaluate.\n");
477 return false;
478 }
479 }
480 }
481
482 if (!InstResult) {
483 // Resolve function pointers.
485 Function *Callee = getCalleeWithFormalArgs(CB, Formals);
486 if (!Callee || Callee->isInterposable()) {
487 LLVM_DEBUG(dbgs() << "Can not resolve function pointer.\n");
488 return false; // Cannot resolve.
489 }
490
491 if (Callee->isDeclaration()) {
492 // If this is a function we can constant fold, do it.
493 if (Constant *C = ConstantFoldCall(&CB, Callee, Formals, TLI)) {
494 InstResult = C;
495 LLVM_DEBUG(dbgs() << "Constant folded function call. Result: "
496 << *InstResult << "\n");
497 } else {
498 LLVM_DEBUG(dbgs() << "Can not constant fold function call.\n");
499 return false;
500 }
501 } else {
502 if (Callee->getFunctionType()->isVarArg()) {
504 << "Can not constant fold vararg function call.\n");
505 return false;
506 }
507
508 Constant *RetVal = nullptr;
509 // Execute the call, if successful, use the return value.
510 ValueStack.emplace_back();
511 if (!EvaluateFunction(Callee, RetVal, Formals)) {
512 LLVM_DEBUG(dbgs() << "Failed to evaluate function.\n");
513 return false;
514 }
515 ValueStack.pop_back();
516 InstResult = RetVal;
517 if (InstResult) {
518 LLVM_DEBUG(dbgs() << "Successfully evaluated function. Result: "
519 << *InstResult << "\n\n");
520 } else {
522 << "Successfully evaluated function. Result: 0\n\n");
523 }
524 }
525 }
526 } else if (CurInst->isTerminator()) {
527 LLVM_DEBUG(dbgs() << "Found a terminator instruction.\n");
528
529 if (UncondBrInst *BI = dyn_cast<UncondBrInst>(CurInst)) {
530 NextBB = BI->getSuccessor(0);
531 } else if (CondBrInst *BI = dyn_cast<CondBrInst>(CurInst)) {
532 ConstantInt *Cond = dyn_cast<ConstantInt>(getVal(BI->getCondition()));
533 if (!Cond)
534 return false; // Cannot determine.
535 NextBB = BI->getSuccessor(!Cond->getZExtValue());
536 } else if (SwitchInst *SI = dyn_cast<SwitchInst>(CurInst)) {
537 ConstantInt *Val =
538 dyn_cast<ConstantInt>(getVal(SI->getCondition()));
539 if (!Val) return false; // Cannot determine.
540 NextBB = SI->findCaseValue(Val)->getCaseSuccessor();
541 } else if (IndirectBrInst *IBI = dyn_cast<IndirectBrInst>(CurInst)) {
542 Value *Val = getVal(IBI->getAddress())->stripPointerCasts();
543 if (BlockAddress *BA = dyn_cast<BlockAddress>(Val))
544 NextBB = BA->getBasicBlock();
545 else
546 return false; // Cannot determine.
547 } else if (isa<ReturnInst>(CurInst)) {
548 NextBB = nullptr;
549 } else {
550 // invoke, unwind, resume, unreachable.
551 LLVM_DEBUG(dbgs() << "Can not handle terminator.");
552 return false; // Cannot handle this terminator.
553 }
554
555 // We succeeded at evaluating this block!
556 LLVM_DEBUG(dbgs() << "Successfully evaluated block.\n");
557 return true;
558 } else {
560 for (Value *Op : CurInst->operands())
561 Ops.push_back(getVal(Op));
562 InstResult = ConstantFoldInstOperands(&*CurInst, Ops, DL, TLI);
563 if (!InstResult) {
564 LLVM_DEBUG(dbgs() << "Cannot fold instruction: " << *CurInst << "\n");
565 return false;
566 }
567 LLVM_DEBUG(dbgs() << "Folded instruction " << *CurInst << " to "
568 << *InstResult << "\n");
569 }
570
571 if (!CurInst->use_empty()) {
572 InstResult = ConstantFoldConstant(InstResult, DL, TLI);
573 setVal(&*CurInst, InstResult);
574 }
575
576 // If we just processed an invoke, we finished evaluating the block.
577 if (InvokeInst *II = dyn_cast<InvokeInst>(CurInst)) {
578 NextBB = II->getNormalDest();
579 LLVM_DEBUG(dbgs() << "Found an invoke instruction. Finished Block.\n\n");
580 return true;
581 }
582
583 // Advance program counter.
584 ++CurInst;
585 }
586}
587
588/// Evaluate a call to function F, returning true if successful, false if we
589/// can't evaluate it. ActualArgs contains the formal arguments for the
590/// function.
592 const SmallVectorImpl<Constant*> &ActualArgs) {
593 assert(ActualArgs.size() == F->arg_size() && "wrong number of arguments");
594
595 // Check to see if this function is already executing (recursion). If so,
596 // bail out. TODO: we might want to accept limited recursion.
597 if (is_contained(CallStack, F))
598 return false;
599
600 CallStack.push_back(F);
601
602 // Initialize arguments to the incoming values specified.
603 for (const auto &[ArgNo, Arg] : llvm::enumerate(F->args()))
604 setVal(&Arg, ActualArgs[ArgNo]);
605
606 // ExecutedBlocks - We only handle non-looping, non-recursive code. As such,
607 // we can only evaluate any one basic block at most once. This set keeps
608 // track of what we have executed so we can detect recursive cases etc.
609 SmallPtrSet<BasicBlock*, 32> ExecutedBlocks;
610
611 // CurBB - The current basic block we're evaluating.
612 BasicBlock *CurBB = &F->front();
613
614 BasicBlock::iterator CurInst = CurBB->begin();
615
616 while (true) {
617 BasicBlock *NextBB = nullptr; // Initialized to avoid compiler warnings.
618 LLVM_DEBUG(dbgs() << "Trying to evaluate BB: " << *CurBB << "\n");
619
620 bool StrippedPointerCastsForAliasAnalysis = false;
621
622 if (!EvaluateBlock(CurInst, NextBB, StrippedPointerCastsForAliasAnalysis))
623 return false;
624
625 if (!NextBB) {
626 // Successfully running until there's no next block means that we found
627 // the return. Fill it the return value and pop the call stack.
629 if (RI->getNumOperands()) {
630 // The Evaluator can look through pointer casts as long as alias
631 // analysis holds because it's just a simple interpreter and doesn't
632 // skip memory accesses due to invariant group metadata, but we can't
633 // let users of Evaluator use a value that's been gleaned looking
634 // through stripping pointer casts.
635 if (StrippedPointerCastsForAliasAnalysis &&
636 !RI->getReturnValue()->getType()->isVoidTy()) {
637 return false;
638 }
639 RetVal = getVal(RI->getOperand(0));
640 }
641 CallStack.pop_back();
642 return true;
643 }
644
645 // Okay, we succeeded in evaluating this control flow. See if we have
646 // executed the new block before. If so, we have a looping function,
647 // which we cannot evaluate in reasonable time.
648 if (!ExecutedBlocks.insert(NextBB).second)
649 return false; // looped!
650
651 // Okay, we have never been in this block before. Check to see if there
652 // are any PHI nodes. If so, evaluate them with information about where
653 // we came from.
654 PHINode *PN = nullptr;
655 for (CurInst = NextBB->begin();
656 (PN = dyn_cast<PHINode>(CurInst)); ++CurInst)
657 setVal(PN, getVal(PN->getIncomingValueForBlock(CurBB)));
658
659 // Advance to the next block.
660 CurBB = NextBB;
661 }
662}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
static bool isSimpleEnoughValueToCommitHelper(Constant *C, SmallPtrSetImpl< Constant * > &SimpleConstants, const DataLayout &DL)
Return true if the specified constant can be handled by the code generator.
Definition Evaluator.cpp:57
static bool isSimpleEnoughValueToCommit(Constant *C, SmallPtrSetImpl< Constant * > &SimpleConstants, const DataLayout &DL)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
uint64_t IntrinsicInst * II
#define P(N)
const SmallVectorImpl< MachineOperand > & Cond
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:119
static Function * getFunction(FunctionType *Ty, const Twine &Name, Module *M)
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:461
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
bool isInlineAsm() const
Check if this call is an inline asm statement.
Value * getCalledOperand() const
FunctionType * getFunctionType() const
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
static LLVM_ABI bool isBitOrNoopPointerCastable(Type *SrcTy, Type *DestTy, const DataLayout &DL)
Check whether a bitcast, inttoptr, or ptrtoint cast between these types is valid and a no-op.
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1316
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getPtrToInt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
Definition Constant.h:43
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constant.h:64
const Constant * stripPointerCasts() const
Definition Constant.h:233
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
LLVM_ABI bool EvaluateFunction(Function *F, Constant *&RetVal, const SmallVectorImpl< Constant * > &ActualArgs)
Evaluate a call to function F, returning true if successful, false if we can't evaluate it.
@ InternalLinkage
Rename collisions when linking (static functions).
Definition GlobalValue.h:60
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
LLVM_ABI uint64_t getGlobalSize(const DataLayout &DL) const
Get the size of this global variable in bytes.
Definition Globals.cpp:640
bool hasUniqueInitializer() const
hasUniqueInitializer - Whether the global variable has an initializer, and any changes made to the in...
bool hasDefinitiveInitializer() const
hasDefinitiveInitializer - Whether the global variable has an initializer, and any other instances of...
Value * getIncomingValueForBlock(const BasicBlock *BB) const
Return a value (possibly void), from a function.
Value * getReturnValue() const
Convenience accessor. Returns null if there is no return value.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:282
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:257
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:141
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
LLVM_ABI const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr, bool LookThroughIntToPtr=false) const
Accumulate the constant offset this value has compared to a base pointer.
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:713
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:578
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2554
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:732
LLVM_ABI Constant * ConstantFoldCall(const CallBase *Call, Function *F, ArrayRef< Constant * > Operands, const TargetLibraryInfo *TLI=nullptr, bool AllowNonDeterministic=true)
ConstantFoldCall - Attempt to constant fold a call to the specified function with the specified argum...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
LLVM_ABI Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI Constant * ConstantFoldLoadFromConst(Constant *C, Type *Ty, const APInt &Offset, const DataLayout &DL)
Extract value of C at the given Offset reinterpreted as Ty.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
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...
Definition Casting.h:547
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
LLVM_ABI Constant * ConstantFoldInstOperands(const Instruction *I, ArrayRef< Constant * > Ops, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, bool AllowNonDeterministic=true)
ConstantFoldInstOperands - Attempt to constant fold an instruction with the specified operands.