LLVM 22.0.0git
Lint.cpp
Go to the documentation of this file.
1//===-- Lint.cpp - Check for common errors in LLVM IR ---------------------===//
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// This pass statically checks for common and easily-identified constructs
10// which produce undefined or likely unintended behavior in LLVM IR.
11//
12// It is not a guarantee of correctness, in two ways. First, it isn't
13// comprehensive. There are checks which could be done statically which are
14// not yet implemented. Some of these are indicated by TODO comments, but
15// those aren't comprehensive either. Second, many conditions cannot be
16// checked statically. This pass does no dynamic instrumentation, so it
17// can't check for all possible problems.
18//
19// Another limitation is that it assumes all code will be executed. A store
20// through a null pointer in a basic block which is never reached is harmless,
21// but this pass will warn about it anyway. This is the main reason why most
22// of these checks live here instead of in the Verifier pass.
23//
24// Optimization passes may make conditions that this pass checks for more or
25// less obvious. If an optimization pass appears to be introducing a warning,
26// it may be that the optimization pass is merely exposing an existing
27// condition in the code.
28//
29// This code may be run before instcombine. In many cases, instcombine checks
30// for the same kinds of things and turns instructions with undefined behavior
31// into unreachable (or equivalent). Because of this, this pass makes some
32// effort to look through bitcasts and so on.
33//
34//===----------------------------------------------------------------------===//
35
36#include "llvm/Analysis/Lint.h"
37#include "llvm/ADT/APInt.h"
38#include "llvm/ADT/ArrayRef.h"
40#include "llvm/ADT/Twine.h"
46#include "llvm/Analysis/Loads.h"
52#include "llvm/IR/Argument.h"
53#include "llvm/IR/BasicBlock.h"
54#include "llvm/IR/Constant.h"
55#include "llvm/IR/Constants.h"
56#include "llvm/IR/DataLayout.h"
58#include "llvm/IR/Dominators.h"
59#include "llvm/IR/Function.h"
61#include "llvm/IR/InstVisitor.h"
62#include "llvm/IR/InstrTypes.h"
63#include "llvm/IR/Instruction.h"
66#include "llvm/IR/Module.h"
67#include "llvm/IR/PassManager.h"
68#include "llvm/IR/Type.h"
69#include "llvm/IR/Value.h"
74#include <cassert>
75#include <cstdint>
76#include <iterator>
77#include <string>
78
79using namespace llvm;
80
81namespace {
82namespace MemRef {
83static const unsigned Read = 1;
84static const unsigned Write = 2;
85static const unsigned Callee = 4;
86static const unsigned Branchee = 8;
87} // end namespace MemRef
88
89class Lint : public InstVisitor<Lint> {
90 friend class InstVisitor<Lint>;
91
93
94 void visitCallBase(CallBase &CB);
95 void visitMemoryReference(Instruction &I, const MemoryLocation &Loc,
96 MaybeAlign Alignment, Type *Ty, unsigned Flags);
97
103 void visitXor(BinaryOperator &I);
104 void visitSub(BinaryOperator &I);
105 void visitLShr(BinaryOperator &I);
106 void visitAShr(BinaryOperator &I);
107 void visitShl(BinaryOperator &I);
108 void visitSDiv(BinaryOperator &I);
109 void visitUDiv(BinaryOperator &I);
110 void visitSRem(BinaryOperator &I);
111 void visitURem(BinaryOperator &I);
118
119 Value *findValue(Value *V, bool OffsetOk) const;
120 Value *findValueImpl(Value *V, bool OffsetOk,
121 SmallPtrSetImpl<Value *> &Visited) const;
122
123public:
124 Module *Mod;
125 const Triple &TT;
126 const DataLayout *DL;
127 AliasAnalysis *AA;
128 AssumptionCache *AC;
129 DominatorTree *DT;
131
132 std::string Messages;
133 raw_string_ostream MessagesStr;
134
135 Lint(Module *Mod, const DataLayout *DL, AliasAnalysis *AA,
137 : Mod(Mod), TT(Mod->getTargetTriple()), DL(DL), AA(AA), AC(AC), DT(DT),
138 TLI(TLI), MessagesStr(Messages) {}
139
140 void WriteValues(ArrayRef<const Value *> Vs) {
141 for (const Value *V : Vs) {
142 if (!V)
143 continue;
144 if (isa<Instruction>(V)) {
145 MessagesStr << *V << '\n';
146 } else {
147 V->printAsOperand(MessagesStr, true, Mod);
148 MessagesStr << '\n';
149 }
150 }
151 }
152
153 /// A check failed, so printout out the condition and the message.
154 ///
155 /// This provides a nice place to put a breakpoint if you want to see why
156 /// something is not correct.
157 void CheckFailed(const Twine &Message) { MessagesStr << Message << '\n'; }
158
159 /// A check failed (with values to print).
160 ///
161 /// This calls the Message-only version so that the above is easier to set
162 /// a breakpoint on.
163 template <typename T1, typename... Ts>
164 void CheckFailed(const Twine &Message, const T1 &V1, const Ts &... Vs) {
165 CheckFailed(Message);
166 WriteValues({V1, Vs...});
167 }
168};
169} // end anonymous namespace
170
171// Check - We know that cond should be true, if not print an error message.
172#define Check(C, ...) \
173 do { \
174 if (!(C)) { \
175 CheckFailed(__VA_ARGS__); \
176 return; \
177 } \
178 } while (false)
179
180void Lint::visitFunction(Function &F) {
181 // This isn't undefined behavior, it's just a little unusual, and it's a
182 // fairly common mistake to neglect to name a function.
183 Check(F.hasName() || F.hasLocalLinkage(),
184 "Unusual: Unnamed function with non-local linkage", &F);
185
186 // TODO: Check for irreducible control flow.
187}
188
189void Lint::visitCallBase(CallBase &I) {
190 Value *Callee = I.getCalledOperand();
191
192 visitMemoryReference(I, MemoryLocation::getAfter(Callee), std::nullopt,
193 nullptr, MemRef::Callee);
194
195 if (Function *F = dyn_cast<Function>(findValue(Callee,
196 /*OffsetOk=*/false))) {
197 Check(I.getCallingConv() == F->getCallingConv(),
198 "Undefined behavior: Caller and callee calling convention differ",
199 &I);
200
201 FunctionType *FT = F->getFunctionType();
202 unsigned NumActualArgs = I.arg_size();
203
204 Check(FT->isVarArg() ? FT->getNumParams() <= NumActualArgs
205 : FT->getNumParams() == NumActualArgs,
206 "Undefined behavior: Call argument count mismatches callee "
207 "argument count",
208 &I);
209
210 Check(FT->getReturnType() == I.getType(),
211 "Undefined behavior: Call return type mismatches "
212 "callee return type",
213 &I);
214
215 // Check argument types (in case the callee was casted) and attributes.
216 // TODO: Verify that caller and callee attributes are compatible.
217 Function::arg_iterator PI = F->arg_begin(), PE = F->arg_end();
218 auto AI = I.arg_begin(), AE = I.arg_end();
219 for (; AI != AE; ++AI) {
220 Value *Actual = *AI;
221 if (PI != PE) {
222 Argument *Formal = &*PI++;
223 Check(Formal->getType() == Actual->getType(),
224 "Undefined behavior: Call argument type mismatches "
225 "callee parameter type",
226 &I);
227
228 // Check that noalias arguments don't alias other arguments. This is
229 // not fully precise because we don't know the sizes of the dereferenced
230 // memory regions.
231 if (Formal->hasNoAliasAttr() && Actual->getType()->isPointerTy()) {
232 AttributeList PAL = I.getAttributes();
233 unsigned ArgNo = 0;
234 for (auto *BI = I.arg_begin(); BI != AE; ++BI, ++ArgNo) {
235 // Skip ByVal arguments since they will be memcpy'd to the callee's
236 // stack so we're not really passing the pointer anyway.
237 if (PAL.hasParamAttr(ArgNo, Attribute::ByVal))
238 continue;
239 // If both arguments are readonly, they have no dependence.
240 if (Formal->onlyReadsMemory() && I.onlyReadsMemory(ArgNo))
241 continue;
242 // Skip readnone arguments since those are guaranteed not to be
243 // dereferenced anyway.
244 if (I.doesNotAccessMemory(ArgNo))
245 continue;
246 if (AI != BI && (*BI)->getType()->isPointerTy() &&
247 !isa<ConstantPointerNull>(*BI)) {
248 AliasResult Result = AA->alias(*AI, *BI);
249 Check(Result != AliasResult::MustAlias &&
251 "Unusual: noalias argument aliases another argument", &I);
252 }
253 }
254 }
255
256 // Check that an sret argument points to valid memory.
257 if (Formal->hasStructRetAttr() && Actual->getType()->isPointerTy()) {
258 Type *Ty = Formal->getParamStructRetType();
259 MemoryLocation Loc(
260 Actual, LocationSize::precise(DL->getTypeStoreSize(Ty)));
261 visitMemoryReference(I, Loc, DL->getABITypeAlign(Ty), Ty,
262 MemRef::Read | MemRef::Write);
263 }
264
265 // Check that ABI attributes for the function and call-site match.
266 unsigned ArgNo = AI->getOperandNo();
267 Attribute::AttrKind ABIAttributes[] = {
268 Attribute::ZExt, Attribute::SExt, Attribute::InReg,
269 Attribute::ByVal, Attribute::ByRef, Attribute::InAlloca,
270 Attribute::Preallocated, Attribute::StructRet};
271 AttributeList CallAttrs = I.getAttributes();
272 for (Attribute::AttrKind Attr : ABIAttributes) {
273 Attribute CallAttr = CallAttrs.getParamAttr(ArgNo, Attr);
274 Attribute FnAttr = F->getParamAttribute(ArgNo, Attr);
275 Check(CallAttr.isValid() == FnAttr.isValid(),
276 Twine("Undefined behavior: ABI attribute ") +
278 " not present on both function and call-site",
279 &I);
280 if (CallAttr.isValid() && FnAttr.isValid()) {
281 Check(CallAttr == FnAttr,
282 Twine("Undefined behavior: ABI attribute ") +
284 " does not have same argument for function and call-site",
285 &I);
286 }
287 }
288 }
289 }
290 }
291
292 if (const auto *CI = dyn_cast<CallInst>(&I)) {
293 if (CI->isTailCall()) {
294 const AttributeList &PAL = CI->getAttributes();
295 unsigned ArgNo = 0;
296 for (Value *Arg : I.args()) {
297 // Skip ByVal arguments since they will be memcpy'd to the callee's
298 // stack anyway.
299 if (PAL.hasParamAttr(ArgNo++, Attribute::ByVal))
300 continue;
301 Value *Obj = findValue(Arg, /*OffsetOk=*/true);
302 Check(!isa<AllocaInst>(Obj),
303 "Undefined behavior: Call with \"tail\" keyword references "
304 "alloca",
305 &I);
306 }
307 }
308 }
309
310 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(&I))
311 switch (II->getIntrinsicID()) {
312 default:
313 break;
314
315 // TODO: Check more intrinsics
316
317 case Intrinsic::memcpy:
318 case Intrinsic::memcpy_inline: {
319 MemCpyInst *MCI = cast<MemCpyInst>(&I);
320 visitMemoryReference(I, MemoryLocation::getForDest(MCI),
321 MCI->getDestAlign(), nullptr, MemRef::Write);
322 visitMemoryReference(I, MemoryLocation::getForSource(MCI),
323 MCI->getSourceAlign(), nullptr, MemRef::Read);
324
325 // Check that the memcpy arguments don't overlap. The AliasAnalysis API
326 // isn't expressive enough for what we really want to do. Known partial
327 // overlap is not distinguished from the case where nothing is known.
329 if (const ConstantInt *Len =
330 dyn_cast<ConstantInt>(findValue(MCI->getLength(),
331 /*OffsetOk=*/false)))
332 if (Len->getValue().isIntN(32))
333 Size = LocationSize::precise(Len->getValue().getZExtValue());
334 Check(AA->alias(MCI->getSource(), Size, MCI->getDest(), Size) !=
336 "Undefined behavior: memcpy source and destination overlap", &I);
337 break;
338 }
339 case Intrinsic::memmove: {
340 MemMoveInst *MMI = cast<MemMoveInst>(&I);
341 visitMemoryReference(I, MemoryLocation::getForDest(MMI),
342 MMI->getDestAlign(), nullptr, MemRef::Write);
343 visitMemoryReference(I, MemoryLocation::getForSource(MMI),
344 MMI->getSourceAlign(), nullptr, MemRef::Read);
345 break;
346 }
347 case Intrinsic::memset:
348 case Intrinsic::memset_inline: {
349 MemSetInst *MSI = cast<MemSetInst>(&I);
350 visitMemoryReference(I, MemoryLocation::getForDest(MSI),
351 MSI->getDestAlign(), nullptr, MemRef::Write);
352 break;
353 }
354 case Intrinsic::vastart:
355 // vastart in non-varargs function is rejected by the verifier
356 visitMemoryReference(I, MemoryLocation::getForArgument(&I, 0, TLI),
357 std::nullopt, nullptr, MemRef::Read | MemRef::Write);
358 break;
359 case Intrinsic::vacopy:
360 visitMemoryReference(I, MemoryLocation::getForArgument(&I, 0, TLI),
361 std::nullopt, nullptr, MemRef::Write);
362 visitMemoryReference(I, MemoryLocation::getForArgument(&I, 1, TLI),
363 std::nullopt, nullptr, MemRef::Read);
364 break;
365 case Intrinsic::vaend:
366 visitMemoryReference(I, MemoryLocation::getForArgument(&I, 0, TLI),
367 std::nullopt, nullptr, MemRef::Read | MemRef::Write);
368 break;
369
370 case Intrinsic::stackrestore:
371 // Stackrestore doesn't read or write memory, but it sets the
372 // stack pointer, which the compiler may read from or write to
373 // at any time, so check it for both readability and writeability.
374 visitMemoryReference(I, MemoryLocation::getForArgument(&I, 0, TLI),
375 std::nullopt, nullptr, MemRef::Read | MemRef::Write);
376 break;
377 case Intrinsic::get_active_lane_mask:
378 if (auto *TripCount = dyn_cast<ConstantInt>(I.getArgOperand(1)))
379 Check(!TripCount->isZero(),
380 "get_active_lane_mask: operand #2 "
381 "must be greater than 0",
382 &I);
383 break;
384 }
385}
386
387void Lint::visitReturnInst(ReturnInst &I) {
388 Function *F = I.getParent()->getParent();
389 Check(!F->doesNotReturn(),
390 "Unusual: Return statement in function with noreturn attribute", &I);
391
392 if (Value *V = I.getReturnValue()) {
393 Value *Obj = findValue(V, /*OffsetOk=*/true);
394 Check(!isa<AllocaInst>(Obj), "Unusual: Returning alloca value", &I);
395 }
396}
397
398// TODO: Check that the reference is in bounds.
399// TODO: Check readnone/readonly function attributes.
400void Lint::visitMemoryReference(Instruction &I, const MemoryLocation &Loc,
401 MaybeAlign Align, Type *Ty, unsigned Flags) {
402 // If no memory is being referenced, it doesn't matter if the pointer
403 // is valid.
404 if (Loc.Size.isZero())
405 return;
406
407 Value *Ptr = const_cast<Value *>(Loc.Ptr);
408 Value *UnderlyingObject = findValue(Ptr, /*OffsetOk=*/true);
409 Check(!isa<ConstantPointerNull>(UnderlyingObject),
410 "Undefined behavior: Null pointer dereference", &I);
411 Check(!isa<UndefValue>(UnderlyingObject),
412 "Undefined behavior: Undef pointer dereference", &I);
413 Check(!isa<ConstantInt>(UnderlyingObject) ||
414 !cast<ConstantInt>(UnderlyingObject)->isMinusOne(),
415 "Unusual: All-ones pointer dereference", &I);
416 Check(!isa<ConstantInt>(UnderlyingObject) ||
417 !cast<ConstantInt>(UnderlyingObject)->isOne(),
418 "Unusual: Address one pointer dereference", &I);
419
420 if (Flags & MemRef::Write) {
421 if (TT.isAMDGPU())
423 UnderlyingObject->getType()->getPointerAddressSpace()),
424 "Undefined behavior: Write to memory in const addrspace", &I);
425
426 if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(UnderlyingObject))
427 Check(!GV->isConstant(), "Undefined behavior: Write to read-only memory",
428 &I);
429 Check(!isa<Function>(UnderlyingObject) &&
430 !isa<BlockAddress>(UnderlyingObject),
431 "Undefined behavior: Write to text section", &I);
432 }
433 if (Flags & MemRef::Read) {
434 Check(!isa<Function>(UnderlyingObject), "Unusual: Load from function body",
435 &I);
436 Check(!isa<BlockAddress>(UnderlyingObject),
437 "Undefined behavior: Load from block address", &I);
438 }
439 if (Flags & MemRef::Callee) {
440 Check(!isa<BlockAddress>(UnderlyingObject),
441 "Undefined behavior: Call to block address", &I);
442 }
443 if (Flags & MemRef::Branchee) {
444 Check(!isa<Constant>(UnderlyingObject) ||
445 isa<BlockAddress>(UnderlyingObject),
446 "Undefined behavior: Branch to non-blockaddress", &I);
447 }
448
449 // Check for buffer overflows and misalignment.
450 // Only handles memory references that read/write something simple like an
451 // alloca instruction or a global variable.
452 int64_t Offset = 0;
454 // OK, so the access is to a constant offset from Ptr. Check that Ptr is
455 // something we can handle and if so extract the size of this base object
456 // along with its alignment.
458 MaybeAlign BaseAlign;
459
460 if (AllocaInst *AI = dyn_cast<AllocaInst>(Base)) {
461 Type *ATy = AI->getAllocatedType();
462 if (!AI->isArrayAllocation() && ATy->isSized() && !ATy->isScalableTy())
463 BaseSize = DL->getTypeAllocSize(ATy).getFixedValue();
464 BaseAlign = AI->getAlign();
465 } else if (GlobalVariable *GV = dyn_cast<GlobalVariable>(Base)) {
466 // If the global may be defined differently in another compilation unit
467 // then don't warn about funky memory accesses.
468 if (GV->hasDefinitiveInitializer()) {
469 Type *GTy = GV->getValueType();
470 if (GTy->isSized())
471 BaseSize = DL->getTypeAllocSize(GTy);
472 BaseAlign = GV->getAlign();
473 if (!BaseAlign && GTy->isSized())
474 BaseAlign = DL->getABITypeAlign(GTy);
475 }
476 }
477
478 // Accesses from before the start or after the end of the object are not
479 // defined.
480 Check(!Loc.Size.hasValue() || Loc.Size.isScalable() ||
481 BaseSize == MemoryLocation::UnknownSize ||
482 (Offset >= 0 && Offset + Loc.Size.getValue() <= BaseSize),
483 "Undefined behavior: Buffer overflow", &I);
484
485 // Accesses that say that the memory is more aligned than it is are not
486 // defined.
487 if (!Align && Ty && Ty->isSized())
488 Align = DL->getABITypeAlign(Ty);
489 if (BaseAlign && Align)
490 Check(*Align <= commonAlignment(*BaseAlign, Offset),
491 "Undefined behavior: Memory reference address is misaligned", &I);
492 }
493}
494
495void Lint::visitLoadInst(LoadInst &I) {
496 visitMemoryReference(I, MemoryLocation::get(&I), I.getAlign(), I.getType(),
497 MemRef::Read);
498}
499
500void Lint::visitStoreInst(StoreInst &I) {
501 visitMemoryReference(I, MemoryLocation::get(&I), I.getAlign(),
502 I.getOperand(0)->getType(), MemRef::Write);
503}
504
505void Lint::visitAtomicCmpXchgInst(AtomicCmpXchgInst &I) {
506 visitMemoryReference(I, MemoryLocation::get(&I), I.getAlign(),
507 I.getOperand(0)->getType(), MemRef::Write);
508}
509
510void Lint::visitAtomicRMWInst(AtomicRMWInst &I) {
511 visitMemoryReference(I, MemoryLocation::get(&I), I.getAlign(),
512 I.getOperand(0)->getType(), MemRef::Write);
513}
514
515void Lint::visitXor(BinaryOperator &I) {
516 Check(!isa<UndefValue>(I.getOperand(0)) || !isa<UndefValue>(I.getOperand(1)),
517 "Undefined result: xor(undef, undef)", &I);
518}
519
520void Lint::visitSub(BinaryOperator &I) {
521 Check(!isa<UndefValue>(I.getOperand(0)) || !isa<UndefValue>(I.getOperand(1)),
522 "Undefined result: sub(undef, undef)", &I);
523}
524
525void Lint::visitLShr(BinaryOperator &I) {
526 if (ConstantInt *CI = dyn_cast<ConstantInt>(findValue(I.getOperand(1),
527 /*OffsetOk=*/false)))
528 Check(CI->getValue().ult(cast<IntegerType>(I.getType())->getBitWidth()),
529 "Undefined result: Shift count out of range", &I);
530}
531
532void Lint::visitAShr(BinaryOperator &I) {
533 if (ConstantInt *CI =
534 dyn_cast<ConstantInt>(findValue(I.getOperand(1), /*OffsetOk=*/false)))
535 Check(CI->getValue().ult(cast<IntegerType>(I.getType())->getBitWidth()),
536 "Undefined result: Shift count out of range", &I);
537}
538
539void Lint::visitShl(BinaryOperator &I) {
540 if (ConstantInt *CI =
541 dyn_cast<ConstantInt>(findValue(I.getOperand(1), /*OffsetOk=*/false)))
542 Check(CI->getValue().ult(cast<IntegerType>(I.getType())->getBitWidth()),
543 "Undefined result: Shift count out of range", &I);
544}
545
546static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT,
547 AssumptionCache *AC) {
548 // Assume undef could be zero.
549 if (isa<UndefValue>(V))
550 return true;
551
552 VectorType *VecTy = dyn_cast<VectorType>(V->getType());
553 if (!VecTy) {
554 KnownBits Known = computeKnownBits(V, DL, AC, dyn_cast<Instruction>(V), DT);
555 return Known.isZero();
556 }
557
558 // Per-component check doesn't work with zeroinitializer
559 Constant *C = dyn_cast<Constant>(V);
560 if (!C)
561 return false;
562
563 if (C->isZeroValue())
564 return true;
565
566 // For a vector, KnownZero will only be true if all values are zero, so check
567 // this per component
568 for (unsigned I = 0, N = cast<FixedVectorType>(VecTy)->getNumElements();
569 I != N; ++I) {
570 Constant *Elem = C->getAggregateElement(I);
571 if (isa<UndefValue>(Elem))
572 return true;
573
574 KnownBits Known = computeKnownBits(Elem, DL);
575 if (Known.isZero())
576 return true;
577 }
578
579 return false;
580}
581
582void Lint::visitSDiv(BinaryOperator &I) {
583 Check(!isZero(I.getOperand(1), I.getDataLayout(), DT, AC),
584 "Undefined behavior: Division by zero", &I);
585}
586
587void Lint::visitUDiv(BinaryOperator &I) {
588 Check(!isZero(I.getOperand(1), I.getDataLayout(), DT, AC),
589 "Undefined behavior: Division by zero", &I);
590}
591
592void Lint::visitSRem(BinaryOperator &I) {
593 Check(!isZero(I.getOperand(1), I.getDataLayout(), DT, AC),
594 "Undefined behavior: Division by zero", &I);
595}
596
597void Lint::visitURem(BinaryOperator &I) {
598 Check(!isZero(I.getOperand(1), I.getDataLayout(), DT, AC),
599 "Undefined behavior: Division by zero", &I);
600}
601
602void Lint::visitAllocaInst(AllocaInst &I) {
603 if (isa<ConstantInt>(I.getArraySize()))
604 // This isn't undefined behavior, it's just an obvious pessimization.
605 Check(&I.getParent()->getParent()->getEntryBlock() == I.getParent(),
606 "Pessimization: Static alloca outside of entry block", &I);
607
608 // TODO: Check for an unusual size (MSB set?)
609}
610
611void Lint::visitVAArgInst(VAArgInst &I) {
612 visitMemoryReference(I, MemoryLocation::get(&I), std::nullopt, nullptr,
613 MemRef::Read | MemRef::Write);
614}
615
616void Lint::visitIndirectBrInst(IndirectBrInst &I) {
617 visitMemoryReference(I, MemoryLocation::getAfter(I.getAddress()),
618 std::nullopt, nullptr, MemRef::Branchee);
619
620 Check(I.getNumDestinations() != 0,
621 "Undefined behavior: indirectbr with no destinations", &I);
622}
623
624void Lint::visitExtractElementInst(ExtractElementInst &I) {
625 if (ConstantInt *CI = dyn_cast<ConstantInt>(findValue(I.getIndexOperand(),
626 /*OffsetOk=*/false))) {
627 ElementCount EC = I.getVectorOperandType()->getElementCount();
628 Check(EC.isScalable() || CI->getValue().ult(EC.getFixedValue()),
629 "Undefined result: extractelement index out of range", &I);
630 }
631}
632
633void Lint::visitInsertElementInst(InsertElementInst &I) {
634 if (ConstantInt *CI = dyn_cast<ConstantInt>(findValue(I.getOperand(2),
635 /*OffsetOk=*/false))) {
636 ElementCount EC = I.getType()->getElementCount();
637 Check(EC.isScalable() || CI->getValue().ult(EC.getFixedValue()),
638 "Undefined result: insertelement index out of range", &I);
639 }
640}
641
642void Lint::visitUnreachableInst(UnreachableInst &I) {
643 // This isn't undefined behavior, it's merely suspicious.
644 Check(&I == &I.getParent()->front() ||
645 std::prev(I.getIterator())->mayHaveSideEffects(),
646 "Unusual: unreachable immediately preceded by instruction without "
647 "side effects",
648 &I);
649}
650
651/// findValue - Look through bitcasts and simple memory reference patterns
652/// to identify an equivalent, but more informative, value. If OffsetOk
653/// is true, look through getelementptrs with non-zero offsets too.
654///
655/// Most analysis passes don't require this logic, because instcombine
656/// will simplify most of these kinds of things away. But it's a goal of
657/// this Lint pass to be useful even on non-optimized IR.
658Value *Lint::findValue(Value *V, bool OffsetOk) const {
660 return findValueImpl(V, OffsetOk, Visited);
661}
662
663/// findValueImpl - Implementation helper for findValue.
664Value *Lint::findValueImpl(Value *V, bool OffsetOk,
665 SmallPtrSetImpl<Value *> &Visited) const {
666 // Detect self-referential values.
667 if (!Visited.insert(V).second)
668 return PoisonValue::get(V->getType());
669
670 // TODO: Look through sext or zext cast, when the result is known to
671 // be interpreted as signed or unsigned, respectively.
672 // TODO: Look through eliminable cast pairs.
673 // TODO: Look through calls with unique return values.
674 // TODO: Look through vector insert/extract/shuffle.
675 V = OffsetOk ? getUnderlyingObject(V) : V->stripPointerCasts();
676 if (LoadInst *L = dyn_cast<LoadInst>(V)) {
677 BasicBlock::iterator BBI = L->getIterator();
678 BasicBlock *BB = L->getParent();
679 SmallPtrSet<BasicBlock *, 4> VisitedBlocks;
680 BatchAAResults BatchAA(*AA);
681 for (;;) {
682 if (!VisitedBlocks.insert(BB).second)
683 break;
684 if (Value *U =
685 FindAvailableLoadedValue(L, BB, BBI, DefMaxInstsToScan, &BatchAA))
686 return findValueImpl(U, OffsetOk, Visited);
687 if (BBI != BB->begin())
688 break;
689 BB = BB->getUniquePredecessor();
690 if (!BB)
691 break;
692 BBI = BB->end();
693 }
694 } else if (PHINode *PN = dyn_cast<PHINode>(V)) {
695 if (Value *W = PN->hasConstantValue())
696 return findValueImpl(W, OffsetOk, Visited);
697 } else if (CastInst *CI = dyn_cast<CastInst>(V)) {
698 if (CI->isNoopCast(*DL))
699 return findValueImpl(CI->getOperand(0), OffsetOk, Visited);
700 } else if (ExtractValueInst *Ex = dyn_cast<ExtractValueInst>(V)) {
701 if (Value *W =
702 FindInsertedValue(Ex->getAggregateOperand(), Ex->getIndices()))
703 if (W != V)
704 return findValueImpl(W, OffsetOk, Visited);
705 } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) {
706 // Same as above, but for ConstantExpr instead of Instruction.
707 if (Instruction::isCast(CE->getOpcode())) {
709 CE->getOperand(0)->getType(), CE->getType(),
710 *DL))
711 return findValueImpl(CE->getOperand(0), OffsetOk, Visited);
712 }
713 }
714
715 // As a last resort, try SimplifyInstruction or constant folding.
716 if (Instruction *Inst = dyn_cast<Instruction>(V)) {
717 if (Value *W = simplifyInstruction(Inst, {*DL, TLI, DT, AC}))
718 return findValueImpl(W, OffsetOk, Visited);
719 } else if (auto *C = dyn_cast<Constant>(V)) {
720 Value *W = ConstantFoldConstant(C, *DL, TLI);
721 if (W != V)
722 return findValueImpl(W, OffsetOk, Visited);
723 }
724
725 return V;
726}
727
729 auto *Mod = F.getParent();
730 auto *DL = &F.getDataLayout();
731 auto *AA = &AM.getResult<AAManager>(F);
732 auto *AC = &AM.getResult<AssumptionAnalysis>(F);
733 auto *DT = &AM.getResult<DominatorTreeAnalysis>(F);
734 auto *TLI = &AM.getResult<TargetLibraryAnalysis>(F);
735 Lint L(Mod, DL, AA, AC, DT, TLI);
736 L.visit(F);
737 dbgs() << L.MessagesStr.str();
738 if (AbortOnError && !L.MessagesStr.str().empty())
740 "linter found errors, aborting. (enabled by abort-on-error)", false);
741 return PreservedAnalyses::all();
742}
743
745 raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
746 PassInfoMixin<LintPass>::printPipeline(OS, MapClassName2PassName);
747 if (AbortOnError)
748 OS << "<abort-on-error>";
749}
750
751//===----------------------------------------------------------------------===//
752// Implement the public interfaces to this file...
753//===----------------------------------------------------------------------===//
754
755/// lintFunction - Check a function for errors, printing messages on stderr.
756///
757void llvm::lintFunction(const Function &f, bool AbortOnError) {
758 Function &F = const_cast<Function &>(f);
759 assert(!F.isDeclaration() && "Cannot lint external functions");
760
762 FAM.registerPass([&] { return TargetLibraryAnalysis(); });
763 FAM.registerPass([&] { return DominatorTreeAnalysis(); });
764 FAM.registerPass([&] { return AssumptionAnalysis(); });
765 FAM.registerPass([&] {
766 AAManager AA;
770 return AA;
771 });
772 LintPass(AbortOnError).run(F, FAM);
773}
774
775/// lintModule - Check a module for errors, printing messages on stderr.
776///
777void llvm::lintModule(const Module &M, bool AbortOnError) {
778 for (const Function &F : M) {
779 if (!F.isDeclaration())
780 lintFunction(F, AbortOnError);
781 }
782}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU address space definition.
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
@ FnAttr
Definition: Attributes.cpp:761
This is the interface for LLVM's primary stateless and local alias analysis.
This file contains the declarations for the subclasses of Constant, which represent the different fla...
uint64_t Size
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
#define Check(C,...)
Definition: Lint.cpp:172
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition: Lint.cpp:546
#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.
#define T1
uint64_t IntrinsicInst * II
if(auto Err=PB.parsePassPipeline(MPM, Passes)) return wrap(std MPM run * Mod
FunctionAnalysisManager FAM
static unsigned getNumElements(Type *Ty)
raw_pwrite_stream & OS
This is the interface for a metadata-based scoped no-alias analysis.
This file defines the SmallPtrSet class.
This is the interface for a metadata-based TBAA.
A manager for alias analyses.
void registerFunctionAnalysis()
Register a specific AA result.
A private abstract base class describing the concept of an individual alias analysis implementation.
LLVM_ABI AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB)
The main low level interface to the alias analysis implementation.
The possible results of an alias query.
Definition: AliasAnalysis.h:78
@ PartialAlias
The two locations alias, but only due to a partial overlap.
@ MustAlias
The two locations precisely alias each other.
an instruction to allocate memory on the stack
Definition: Instructions.h:64
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:255
bool registerPass(PassBuilderT &&PassBuilder)
Register an analysis pass with the manager.
Definition: PassManager.h:473
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Definition: PassManager.h:412
This class represents an incoming formal argument to a Function.
Definition: Argument.h:32
LLVM_ABI bool hasNoAliasAttr() const
Return true if this argument has the noalias attribute.
Definition: Function.cpp:273
LLVM_ABI bool onlyReadsMemory() const
Return true if this argument has the readonly or readnone attribute.
Definition: Function.cpp:309
LLVM_ABI Type * getParamStructRetType() const
If this is an sret argument, return its type.
Definition: Function.cpp:230
LLVM_ABI bool hasStructRetAttr() const
Return true if this argument has the sret attribute.
Definition: Function.cpp:288
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
A function analysis which provides an AssumptionCache.
A cache of @llvm.assume calls within a function.
An instruction that atomically checks whether a specified value is in a memory location,...
Definition: Instructions.h:506
an instruction that atomically reads a memory location, combines it with another value,...
Definition: Instructions.h:709
Attribute getParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Return the attribute object that exists at the arg index.
Definition: Attributes.h:899
bool hasParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Return true if the attribute exists for the given argument.
Definition: Attributes.h:849
LLVM_ABI AttributeSet getAttributes(unsigned Index) const
The attributes for the specified index are returned.
static LLVM_ABI StringRef getNameFromAttrKind(Attribute::AttrKind AttrKind)
Definition: Attributes.cpp:322
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
Definition: Attributes.h:88
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition: Attributes.h:223
Analysis pass providing a never-invalidated alias analysis result.
LLVM Basic Block Representation.
Definition: BasicBlock.h:62
iterator end()
Definition: BasicBlock.h:472
iterator begin()
Instruction iterator methods.
Definition: BasicBlock.h:459
LLVM_ABI const BasicBlock * getUniquePredecessor() const
Return the predecessor of this block if it has a unique predecessor block.
Definition: BasicBlock.cpp:445
InstListType::iterator iterator
Instruction iterators...
Definition: BasicBlock.h:170
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Definition: InstrTypes.h:1116
This is the base class for all instructions that perform data casts.
Definition: InstrTypes.h:448
static LLVM_ABI bool isNoopCast(Instruction::CastOps Opcode, Type *SrcTy, Type *DstTy, const DataLayout &DL)
A no-op cast is one that can be effected without changing any bits.
A constant value that is initialized with an expression using other constant values.
Definition: Constants.h:1120
This is the shared class of boolean and integer constants.
Definition: Constants.h:87
This is an important base class in LLVM.
Definition: Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:63
Analysis pass which computes a DominatorTree.
Definition: Dominators.h:284
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition: Dominators.h:165
This instruction extracts a single (scalar) element from a VectorType value.
This instruction extracts a struct member or array element value from an aggregate value.
Indirect Branch Instruction.
This instruction inserts a single (scalar) element into a VectorType value.
Base class for instruction visitors.
Definition: InstVisitor.h:78
RetTy visitIndirectBrInst(IndirectBrInst &I)
Definition: InstVisitor.h:230
RetTy visitExtractElementInst(ExtractElementInst &I)
Definition: InstVisitor.h:192
RetTy visitCallBase(CallBase &I)
Definition: InstVisitor.h:262
void visitFunction(Function &F)
Definition: InstVisitor.h:142
RetTy visitUnreachableInst(UnreachableInst &I)
Definition: InstVisitor.h:236
RetTy visitAtomicCmpXchgInst(AtomicCmpXchgInst &I)
Definition: InstVisitor.h:171
RetTy visitReturnInst(ReturnInst &I)
Definition: InstVisitor.h:221
RetTy visitStoreInst(StoreInst &I)
Definition: InstVisitor.h:170
RetTy visitInsertElementInst(InsertElementInst &I)
Definition: InstVisitor.h:193
RetTy visitAtomicRMWInst(AtomicRMWInst &I)
Definition: InstVisitor.h:172
RetTy visitAllocaInst(AllocaInst &I)
Definition: InstVisitor.h:168
RetTy visitLoadInst(LoadInst &I)
Definition: InstVisitor.h:169
RetTy visitVAArgInst(VAArgInst &I)
Definition: InstVisitor.h:191
bool isCast() const
Definition: Instruction.h:321
A wrapper class for inspecting calls to intrinsic functions.
Definition: IntrinsicInst.h:49
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Definition: Lint.cpp:728
void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
Definition: Lint.cpp:744
An instruction for reading from memory.
Definition: Instructions.h:180
bool hasValue() const
static LocationSize precise(uint64_t Value)
bool isScalable() const
TypeSize getValue() const
bool isZero() const
static constexpr LocationSize afterPointer()
Any location after the base pointer (but still within the underlying object).
This class wraps the llvm.memcpy intrinsic.
Value * getLength() const
Value * getDest() const
This is just like getRawDest, but it strips off any cast instructions (including addrspacecast) that ...
MaybeAlign getDestAlign() const
This class wraps the llvm.memmove intrinsic.
This class wraps the llvm.memset and llvm.memset.inline intrinsics.
MaybeAlign getSourceAlign() const
Value * getSource() const
This is just like getRawSource, but it strips off any cast instructions that feed it,...
Representation for a specific memory location.
static LLVM_ABI MemoryLocation get(const LoadInst *LI)
Return a location with information about the memory reference by the given instruction.
static LLVM_ABI MemoryLocation getForSource(const MemTransferInst *MTI)
Return a location representing the source of a memory transfer.
LocationSize Size
The maximum size of the location, in address-units, or UnknownSize if the size is not known.
static MemoryLocation getAfter(const Value *Ptr, const AAMDNodes &AATags=AAMDNodes())
Return a location that may access any location after Ptr, while remaining within the underlying objec...
const Value * Ptr
The address of the start of the location.
static LLVM_ABI MemoryLocation getForDest(const MemIntrinsic *MI)
Return a location representing the destination of a memory set or transfer.
static LLVM_ABI MemoryLocation getForArgument(const CallBase *Call, unsigned ArgIdx, const TargetLibraryInfo *TLI)
Return a location representing a particular argument of a call.
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:67
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Definition: Constants.cpp:1885
A set of analyses that are preserved following a run of a transformation pass.
Definition: Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition: Analysis.h:118
Return a value (possibly void), from a function.
Analysis pass providing a never-invalidated alias analysis result.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
Definition: SmallPtrSet.h:380
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:401
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:541
An instruction for storing to memory.
Definition: Instructions.h:296
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:47
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:82
Analysis pass providing a never-invalidated alias analysis result.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
bool isPointerTy() const
True if this is an instance of PointerType.
Definition: Type.h:267
LLVM_ABI bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this is a type whose size is a known multiple of vscale.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
Definition: Type.h:311
This function has undefined behavior.
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
LLVM Value Representation.
Definition: Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:256
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:53
A raw_ostream that writes to an std::string.
Definition: raw_ostream.h:662
Definition: Lint.cpp:82
bool isConstantAddressSpace(unsigned AS)
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
@ CE
Windows NT (Windows on ARM)
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:477
@ Read
Definition: CodeGenData.h:108
@ Write
Definition: CodeGenData.h:109
Value * GetPointerBaseWithConstantOffset(Value *Ptr, int64_t &Offset, const DataLayout &DL, bool AllowNonInbounds=true)
Analyze the specified pointer to see if it can be expressed as a base pointer plus a constant offset.
LLVM_ABI Value * FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB, BasicBlock::iterator &ScanFrom, unsigned MaxInstsToScan=DefMaxInstsToScan, BatchAAResults *AA=nullptr, bool *IsLoadCSE=nullptr, unsigned *NumScanedInst=nullptr)
Scan backwards to see if we have the value of the given load available locally within a small number ...
Definition: Loads.cpp:545
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
LLVM_ABI Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:207
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition: Error.cpp:167
void lintModule(const Module &M, bool AbortOnError=false)
Lint a module.
Definition: Lint.cpp:777
LLVM_ABI cl::opt< unsigned > DefMaxInstsToScan
The default number of maximum instructions to scan in the block, used by FindAvailableLoadedValue().
@ Mod
The access may modify the value stored in memory.
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition: Alignment.h:212
LLVM_ABI Value * FindInsertedValue(Value *V, ArrayRef< unsigned > idx_range, std::optional< BasicBlock::iterator > InsertBefore=std::nullopt)
Given an aggregate and an sequence of indices, see if the scalar value indexed is already around as a...
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
void lintFunction(const Function &F, bool AbortOnError=false)
lintFunction - Check a function for errors, printing messages on stderr.
Definition: Lint.cpp:757
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
bool isZero() const
Returns true if value is all zero.
Definition: KnownBits.h:80
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition: Alignment.h:117
void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
Definition: PassManager.h:80