1 //===-- Lint.cpp - Check for common errors in LLVM IR ---------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This pass statically checks for common and easily-identified constructs
11 // which produce undefined or likely unintended behavior in LLVM IR.
13 // It is not a guarantee of correctness, in two ways. First, it isn't
14 // comprehensive. There are checks which could be done statically which are
15 // not yet implemented. Some of these are indicated by TODO comments, but
16 // those aren't comprehensive either. Second, many conditions cannot be
17 // checked statically. This pass does no dynamic instrumentation, so it
18 // can't check for all possible problems.
20 // Another limitation is that it assumes all code will be executed. A store
21 // through a null pointer in a basic block which is never reached is harmless,
22 // but this pass will warn about it anyway. This is the main reason why most
23 // of these checks live here instead of in the Verifier pass.
25 // Optimization passes may make conditions that this pass checks for more or
26 // less obvious. If an optimization pass appears to be introducing a warning,
27 // it may be that the optimization pass is merely exposing an existing
28 // condition in the code.
30 // This code may be run before instcombine. In many cases, instcombine checks
31 // for the same kinds of things and turns instructions with undefined behavior
32 // into unreachable (or equivalent). Because of this, this pass makes some
33 // effort to look through bitcasts and so on.
35 //===----------------------------------------------------------------------===//
37 #include "llvm/Analysis/Passes.h"
38 #include "llvm/Analysis/AliasAnalysis.h"
39 #include "llvm/Analysis/InstructionSimplify.h"
40 #include "llvm/Analysis/ConstantFolding.h"
41 #include "llvm/Analysis/Dominators.h"
42 #include "llvm/Analysis/Lint.h"
43 #include "llvm/Analysis/Loads.h"
44 #include "llvm/Analysis/ValueTracking.h"
45 #include "llvm/Assembly/Writer.h"
46 #include "llvm/Target/TargetData.h"
47 #include "llvm/Pass.h"
48 #include "llvm/PassManager.h"
49 #include "llvm/IntrinsicInst.h"
50 #include "llvm/Function.h"
51 #include "llvm/Support/CallSite.h"
52 #include "llvm/Support/Debug.h"
53 #include "llvm/Support/InstVisitor.h"
54 #include "llvm/Support/raw_ostream.h"
55 #include "llvm/ADT/STLExtras.h"
60 static unsigned Read
= 1;
61 static unsigned Write
= 2;
62 static unsigned Callee
= 4;
63 static unsigned Branchee
= 8;
66 class Lint
: public FunctionPass
, public InstVisitor
<Lint
> {
67 friend class InstVisitor
<Lint
>;
69 void visitFunction(Function
&F
);
71 void visitCallSite(CallSite CS
);
72 void visitMemoryReference(Instruction
&I
, Value
*Ptr
,
73 uint64_t Size
, unsigned Align
,
74 const Type
*Ty
, unsigned Flags
);
76 void visitCallInst(CallInst
&I
);
77 void visitInvokeInst(InvokeInst
&I
);
78 void visitReturnInst(ReturnInst
&I
);
79 void visitLoadInst(LoadInst
&I
);
80 void visitStoreInst(StoreInst
&I
);
81 void visitXor(BinaryOperator
&I
);
82 void visitSub(BinaryOperator
&I
);
83 void visitLShr(BinaryOperator
&I
);
84 void visitAShr(BinaryOperator
&I
);
85 void visitShl(BinaryOperator
&I
);
86 void visitSDiv(BinaryOperator
&I
);
87 void visitUDiv(BinaryOperator
&I
);
88 void visitSRem(BinaryOperator
&I
);
89 void visitURem(BinaryOperator
&I
);
90 void visitAllocaInst(AllocaInst
&I
);
91 void visitVAArgInst(VAArgInst
&I
);
92 void visitIndirectBrInst(IndirectBrInst
&I
);
93 void visitExtractElementInst(ExtractElementInst
&I
);
94 void visitInsertElementInst(InsertElementInst
&I
);
95 void visitUnreachableInst(UnreachableInst
&I
);
97 Value
*findValue(Value
*V
, bool OffsetOk
) const;
98 Value
*findValueImpl(Value
*V
, bool OffsetOk
,
99 SmallPtrSet
<Value
*, 4> &Visited
) const;
107 std::string Messages
;
108 raw_string_ostream MessagesStr
;
110 static char ID
; // Pass identification, replacement for typeid
111 Lint() : FunctionPass(ID
), MessagesStr(Messages
) {
112 initializeLintPass(*PassRegistry::getPassRegistry());
115 virtual bool runOnFunction(Function
&F
);
117 virtual void getAnalysisUsage(AnalysisUsage
&AU
) const {
118 AU
.setPreservesAll();
119 AU
.addRequired
<AliasAnalysis
>();
120 AU
.addRequired
<DominatorTree
>();
122 virtual void print(raw_ostream
&O
, const Module
*M
) const {}
124 void WriteValue(const Value
*V
) {
126 if (isa
<Instruction
>(V
)) {
127 MessagesStr
<< *V
<< '\n';
129 WriteAsOperand(MessagesStr
, V
, true, Mod
);
134 // CheckFailed - A check failed, so print out the condition and the message
135 // that failed. This provides a nice place to put a breakpoint if you want
136 // to see why something is not correct.
137 void CheckFailed(const Twine
&Message
,
138 const Value
*V1
= 0, const Value
*V2
= 0,
139 const Value
*V3
= 0, const Value
*V4
= 0) {
140 MessagesStr
<< Message
.str() << "\n";
150 INITIALIZE_PASS_BEGIN(Lint
, "lint", "Statically lint-checks LLVM IR",
152 INITIALIZE_PASS_DEPENDENCY(DominatorTree
)
153 INITIALIZE_AG_DEPENDENCY(AliasAnalysis
)
154 INITIALIZE_PASS_END(Lint
, "lint", "Statically lint-checks LLVM IR",
157 // Assert - We know that cond should be true, if not print an error message.
158 #define Assert(C, M) \
159 do { if (!(C)) { CheckFailed(M); return; } } while (0)
160 #define Assert1(C, M, V1) \
161 do { if (!(C)) { CheckFailed(M, V1); return; } } while (0)
162 #define Assert2(C, M, V1, V2) \
163 do { if (!(C)) { CheckFailed(M, V1, V2); return; } } while (0)
164 #define Assert3(C, M, V1, V2, V3) \
165 do { if (!(C)) { CheckFailed(M, V1, V2, V3); return; } } while (0)
166 #define Assert4(C, M, V1, V2, V3, V4) \
167 do { if (!(C)) { CheckFailed(M, V1, V2, V3, V4); return; } } while (0)
169 // Lint::run - This is the main Analysis entry point for a
172 bool Lint::runOnFunction(Function
&F
) {
174 AA
= &getAnalysis
<AliasAnalysis
>();
175 DT
= &getAnalysis
<DominatorTree
>();
176 TD
= getAnalysisIfAvailable
<TargetData
>();
178 dbgs() << MessagesStr
.str();
183 void Lint::visitFunction(Function
&F
) {
184 // This isn't undefined behavior, it's just a little unusual, and it's a
185 // fairly common mistake to neglect to name a function.
186 Assert1(F
.hasName() || F
.hasLocalLinkage(),
187 "Unusual: Unnamed function with non-local linkage", &F
);
189 // TODO: Check for irreducible control flow.
192 void Lint::visitCallSite(CallSite CS
) {
193 Instruction
&I
= *CS
.getInstruction();
194 Value
*Callee
= CS
.getCalledValue();
196 visitMemoryReference(I
, Callee
, AliasAnalysis::UnknownSize
,
197 0, 0, MemRef::Callee
);
199 if (Function
*F
= dyn_cast
<Function
>(findValue(Callee
, /*OffsetOk=*/false))) {
200 Assert1(CS
.getCallingConv() == F
->getCallingConv(),
201 "Undefined behavior: Caller and callee calling convention differ",
204 const FunctionType
*FT
= F
->getFunctionType();
205 unsigned NumActualArgs
= unsigned(CS
.arg_end()-CS
.arg_begin());
207 Assert1(FT
->isVarArg() ?
208 FT
->getNumParams() <= NumActualArgs
:
209 FT
->getNumParams() == NumActualArgs
,
210 "Undefined behavior: Call argument count mismatches callee "
211 "argument count", &I
);
213 Assert1(FT
->getReturnType() == I
.getType(),
214 "Undefined behavior: Call return type mismatches "
215 "callee return type", &I
);
217 // Check argument types (in case the callee was casted) and attributes.
218 // TODO: Verify that caller and callee attributes are compatible.
219 Function::arg_iterator PI
= F
->arg_begin(), PE
= F
->arg_end();
220 CallSite::arg_iterator AI
= CS
.arg_begin(), AE
= CS
.arg_end();
221 for (; AI
!= AE
; ++AI
) {
224 Argument
*Formal
= PI
++;
225 Assert1(Formal
->getType() == Actual
->getType(),
226 "Undefined behavior: Call argument type mismatches "
227 "callee parameter type", &I
);
229 // Check that noalias arguments don't alias other arguments. This is
230 // not fully precise because we don't know the sizes of the dereferenced
232 if (Formal
->hasNoAliasAttr() && Actual
->getType()->isPointerTy())
233 for (CallSite::arg_iterator BI
= CS
.arg_begin(); BI
!= AE
; ++BI
)
234 if (AI
!= BI
&& (*BI
)->getType()->isPointerTy()) {
235 AliasAnalysis::AliasResult Result
= AA
->alias(*AI
, *BI
);
236 Assert1(Result
!= AliasAnalysis::MustAlias
&&
237 Result
!= AliasAnalysis::PartialAlias
,
238 "Unusual: noalias argument aliases another argument", &I
);
241 // Check that an sret argument points to valid memory.
242 if (Formal
->hasStructRetAttr() && Actual
->getType()->isPointerTy()) {
244 cast
<PointerType
>(Formal
->getType())->getElementType();
245 visitMemoryReference(I
, Actual
, AA
->getTypeStoreSize(Ty
),
246 TD
? TD
->getABITypeAlignment(Ty
) : 0,
247 Ty
, MemRef::Read
| MemRef::Write
);
253 if (CS
.isCall() && cast
<CallInst
>(CS
.getInstruction())->isTailCall())
254 for (CallSite::arg_iterator AI
= CS
.arg_begin(), AE
= CS
.arg_end();
256 Value
*Obj
= findValue(*AI
, /*OffsetOk=*/true);
257 Assert1(!isa
<AllocaInst
>(Obj
),
258 "Undefined behavior: Call with \"tail\" keyword references "
263 if (IntrinsicInst
*II
= dyn_cast
<IntrinsicInst
>(&I
))
264 switch (II
->getIntrinsicID()) {
267 // TODO: Check more intrinsics
269 case Intrinsic::memcpy
: {
270 MemCpyInst
*MCI
= cast
<MemCpyInst
>(&I
);
271 // TODO: If the size is known, use it.
272 visitMemoryReference(I
, MCI
->getDest(), AliasAnalysis::UnknownSize
,
273 MCI
->getAlignment(), 0,
275 visitMemoryReference(I
, MCI
->getSource(), AliasAnalysis::UnknownSize
,
276 MCI
->getAlignment(), 0,
279 // Check that the memcpy arguments don't overlap. The AliasAnalysis API
280 // isn't expressive enough for what we really want to do. Known partial
281 // overlap is not distinguished from the case where nothing is known.
283 if (const ConstantInt
*Len
=
284 dyn_cast
<ConstantInt
>(findValue(MCI
->getLength(),
285 /*OffsetOk=*/false)))
286 if (Len
->getValue().isIntN(32))
287 Size
= Len
->getValue().getZExtValue();
288 Assert1(AA
->alias(MCI
->getSource(), Size
, MCI
->getDest(), Size
) !=
289 AliasAnalysis::MustAlias
,
290 "Undefined behavior: memcpy source and destination overlap", &I
);
293 case Intrinsic::memmove
: {
294 MemMoveInst
*MMI
= cast
<MemMoveInst
>(&I
);
295 // TODO: If the size is known, use it.
296 visitMemoryReference(I
, MMI
->getDest(), AliasAnalysis::UnknownSize
,
297 MMI
->getAlignment(), 0,
299 visitMemoryReference(I
, MMI
->getSource(), AliasAnalysis::UnknownSize
,
300 MMI
->getAlignment(), 0,
304 case Intrinsic::memset
: {
305 MemSetInst
*MSI
= cast
<MemSetInst
>(&I
);
306 // TODO: If the size is known, use it.
307 visitMemoryReference(I
, MSI
->getDest(), AliasAnalysis::UnknownSize
,
308 MSI
->getAlignment(), 0,
313 case Intrinsic::vastart
:
314 Assert1(I
.getParent()->getParent()->isVarArg(),
315 "Undefined behavior: va_start called in a non-varargs function",
318 visitMemoryReference(I
, CS
.getArgument(0), AliasAnalysis::UnknownSize
,
319 0, 0, MemRef::Read
| MemRef::Write
);
321 case Intrinsic::vacopy
:
322 visitMemoryReference(I
, CS
.getArgument(0), AliasAnalysis::UnknownSize
,
323 0, 0, MemRef::Write
);
324 visitMemoryReference(I
, CS
.getArgument(1), AliasAnalysis::UnknownSize
,
327 case Intrinsic::vaend
:
328 visitMemoryReference(I
, CS
.getArgument(0), AliasAnalysis::UnknownSize
,
329 0, 0, MemRef::Read
| MemRef::Write
);
332 case Intrinsic::stackrestore
:
333 // Stackrestore doesn't read or write memory, but it sets the
334 // stack pointer, which the compiler may read from or write to
335 // at any time, so check it for both readability and writeability.
336 visitMemoryReference(I
, CS
.getArgument(0), AliasAnalysis::UnknownSize
,
337 0, 0, MemRef::Read
| MemRef::Write
);
342 void Lint::visitCallInst(CallInst
&I
) {
343 return visitCallSite(&I
);
346 void Lint::visitInvokeInst(InvokeInst
&I
) {
347 return visitCallSite(&I
);
350 void Lint::visitReturnInst(ReturnInst
&I
) {
351 Function
*F
= I
.getParent()->getParent();
352 Assert1(!F
->doesNotReturn(),
353 "Unusual: Return statement in function with noreturn attribute",
356 if (Value
*V
= I
.getReturnValue()) {
357 Value
*Obj
= findValue(V
, /*OffsetOk=*/true);
358 Assert1(!isa
<AllocaInst
>(Obj
),
359 "Unusual: Returning alloca value", &I
);
363 // TODO: Check that the reference is in bounds.
364 // TODO: Check readnone/readonly function attributes.
365 void Lint::visitMemoryReference(Instruction
&I
,
366 Value
*Ptr
, uint64_t Size
, unsigned Align
,
367 const Type
*Ty
, unsigned Flags
) {
368 // If no memory is being referenced, it doesn't matter if the pointer
373 Value
*UnderlyingObject
= findValue(Ptr
, /*OffsetOk=*/true);
374 Assert1(!isa
<ConstantPointerNull
>(UnderlyingObject
),
375 "Undefined behavior: Null pointer dereference", &I
);
376 Assert1(!isa
<UndefValue
>(UnderlyingObject
),
377 "Undefined behavior: Undef pointer dereference", &I
);
378 Assert1(!isa
<ConstantInt
>(UnderlyingObject
) ||
379 !cast
<ConstantInt
>(UnderlyingObject
)->isAllOnesValue(),
380 "Unusual: All-ones pointer dereference", &I
);
381 Assert1(!isa
<ConstantInt
>(UnderlyingObject
) ||
382 !cast
<ConstantInt
>(UnderlyingObject
)->isOne(),
383 "Unusual: Address one pointer dereference", &I
);
385 if (Flags
& MemRef::Write
) {
386 if (const GlobalVariable
*GV
= dyn_cast
<GlobalVariable
>(UnderlyingObject
))
387 Assert1(!GV
->isConstant(),
388 "Undefined behavior: Write to read-only memory", &I
);
389 Assert1(!isa
<Function
>(UnderlyingObject
) &&
390 !isa
<BlockAddress
>(UnderlyingObject
),
391 "Undefined behavior: Write to text section", &I
);
393 if (Flags
& MemRef::Read
) {
394 Assert1(!isa
<Function
>(UnderlyingObject
),
395 "Unusual: Load from function body", &I
);
396 Assert1(!isa
<BlockAddress
>(UnderlyingObject
),
397 "Undefined behavior: Load from block address", &I
);
399 if (Flags
& MemRef::Callee
) {
400 Assert1(!isa
<BlockAddress
>(UnderlyingObject
),
401 "Undefined behavior: Call to block address", &I
);
403 if (Flags
& MemRef::Branchee
) {
404 Assert1(!isa
<Constant
>(UnderlyingObject
) ||
405 isa
<BlockAddress
>(UnderlyingObject
),
406 "Undefined behavior: Branch to non-blockaddress", &I
);
410 if (Align
== 0 && Ty
) Align
= TD
->getABITypeAlignment(Ty
);
413 unsigned BitWidth
= TD
->getTypeSizeInBits(Ptr
->getType());
414 APInt Mask
= APInt::getAllOnesValue(BitWidth
),
415 KnownZero(BitWidth
, 0), KnownOne(BitWidth
, 0);
416 ComputeMaskedBits(Ptr
, Mask
, KnownZero
, KnownOne
, TD
);
417 Assert1(!(KnownOne
& APInt::getLowBitsSet(BitWidth
, Log2_32(Align
))),
418 "Undefined behavior: Memory reference address is misaligned", &I
);
423 void Lint::visitLoadInst(LoadInst
&I
) {
424 visitMemoryReference(I
, I
.getPointerOperand(),
425 AA
->getTypeStoreSize(I
.getType()), I
.getAlignment(),
426 I
.getType(), MemRef::Read
);
429 void Lint::visitStoreInst(StoreInst
&I
) {
430 visitMemoryReference(I
, I
.getPointerOperand(),
431 AA
->getTypeStoreSize(I
.getOperand(0)->getType()),
433 I
.getOperand(0)->getType(), MemRef::Write
);
436 void Lint::visitXor(BinaryOperator
&I
) {
437 Assert1(!isa
<UndefValue
>(I
.getOperand(0)) ||
438 !isa
<UndefValue
>(I
.getOperand(1)),
439 "Undefined result: xor(undef, undef)", &I
);
442 void Lint::visitSub(BinaryOperator
&I
) {
443 Assert1(!isa
<UndefValue
>(I
.getOperand(0)) ||
444 !isa
<UndefValue
>(I
.getOperand(1)),
445 "Undefined result: sub(undef, undef)", &I
);
448 void Lint::visitLShr(BinaryOperator
&I
) {
449 if (ConstantInt
*CI
=
450 dyn_cast
<ConstantInt
>(findValue(I
.getOperand(1), /*OffsetOk=*/false)))
451 Assert1(CI
->getValue().ult(cast
<IntegerType
>(I
.getType())->getBitWidth()),
452 "Undefined result: Shift count out of range", &I
);
455 void Lint::visitAShr(BinaryOperator
&I
) {
456 if (ConstantInt
*CI
=
457 dyn_cast
<ConstantInt
>(findValue(I
.getOperand(1), /*OffsetOk=*/false)))
458 Assert1(CI
->getValue().ult(cast
<IntegerType
>(I
.getType())->getBitWidth()),
459 "Undefined result: Shift count out of range", &I
);
462 void Lint::visitShl(BinaryOperator
&I
) {
463 if (ConstantInt
*CI
=
464 dyn_cast
<ConstantInt
>(findValue(I
.getOperand(1), /*OffsetOk=*/false)))
465 Assert1(CI
->getValue().ult(cast
<IntegerType
>(I
.getType())->getBitWidth()),
466 "Undefined result: Shift count out of range", &I
);
469 static bool isZero(Value
*V
, TargetData
*TD
) {
470 // Assume undef could be zero.
471 if (isa
<UndefValue
>(V
)) return true;
473 unsigned BitWidth
= cast
<IntegerType
>(V
->getType())->getBitWidth();
474 APInt Mask
= APInt::getAllOnesValue(BitWidth
),
475 KnownZero(BitWidth
, 0), KnownOne(BitWidth
, 0);
476 ComputeMaskedBits(V
, Mask
, KnownZero
, KnownOne
, TD
);
477 return KnownZero
.isAllOnesValue();
480 void Lint::visitSDiv(BinaryOperator
&I
) {
481 Assert1(!isZero(I
.getOperand(1), TD
),
482 "Undefined behavior: Division by zero", &I
);
485 void Lint::visitUDiv(BinaryOperator
&I
) {
486 Assert1(!isZero(I
.getOperand(1), TD
),
487 "Undefined behavior: Division by zero", &I
);
490 void Lint::visitSRem(BinaryOperator
&I
) {
491 Assert1(!isZero(I
.getOperand(1), TD
),
492 "Undefined behavior: Division by zero", &I
);
495 void Lint::visitURem(BinaryOperator
&I
) {
496 Assert1(!isZero(I
.getOperand(1), TD
),
497 "Undefined behavior: Division by zero", &I
);
500 void Lint::visitAllocaInst(AllocaInst
&I
) {
501 if (isa
<ConstantInt
>(I
.getArraySize()))
502 // This isn't undefined behavior, it's just an obvious pessimization.
503 Assert1(&I
.getParent()->getParent()->getEntryBlock() == I
.getParent(),
504 "Pessimization: Static alloca outside of entry block", &I
);
506 // TODO: Check for an unusual size (MSB set?)
509 void Lint::visitVAArgInst(VAArgInst
&I
) {
510 visitMemoryReference(I
, I
.getOperand(0), AliasAnalysis::UnknownSize
, 0, 0,
511 MemRef::Read
| MemRef::Write
);
514 void Lint::visitIndirectBrInst(IndirectBrInst
&I
) {
515 visitMemoryReference(I
, I
.getAddress(), AliasAnalysis::UnknownSize
, 0, 0,
518 Assert1(I
.getNumDestinations() != 0,
519 "Undefined behavior: indirectbr with no destinations", &I
);
522 void Lint::visitExtractElementInst(ExtractElementInst
&I
) {
523 if (ConstantInt
*CI
=
524 dyn_cast
<ConstantInt
>(findValue(I
.getIndexOperand(),
525 /*OffsetOk=*/false)))
526 Assert1(CI
->getValue().ult(I
.getVectorOperandType()->getNumElements()),
527 "Undefined result: extractelement index out of range", &I
);
530 void Lint::visitInsertElementInst(InsertElementInst
&I
) {
531 if (ConstantInt
*CI
=
532 dyn_cast
<ConstantInt
>(findValue(I
.getOperand(2),
533 /*OffsetOk=*/false)))
534 Assert1(CI
->getValue().ult(I
.getType()->getNumElements()),
535 "Undefined result: insertelement index out of range", &I
);
538 void Lint::visitUnreachableInst(UnreachableInst
&I
) {
539 // This isn't undefined behavior, it's merely suspicious.
540 Assert1(&I
== I
.getParent()->begin() ||
541 prior(BasicBlock::iterator(&I
))->mayHaveSideEffects(),
542 "Unusual: unreachable immediately preceded by instruction without "
546 /// findValue - Look through bitcasts and simple memory reference patterns
547 /// to identify an equivalent, but more informative, value. If OffsetOk
548 /// is true, look through getelementptrs with non-zero offsets too.
550 /// Most analysis passes don't require this logic, because instcombine
551 /// will simplify most of these kinds of things away. But it's a goal of
552 /// this Lint pass to be useful even on non-optimized IR.
553 Value
*Lint::findValue(Value
*V
, bool OffsetOk
) const {
554 SmallPtrSet
<Value
*, 4> Visited
;
555 return findValueImpl(V
, OffsetOk
, Visited
);
558 /// findValueImpl - Implementation helper for findValue.
559 Value
*Lint::findValueImpl(Value
*V
, bool OffsetOk
,
560 SmallPtrSet
<Value
*, 4> &Visited
) const {
561 // Detect self-referential values.
562 if (!Visited
.insert(V
))
563 return UndefValue::get(V
->getType());
565 // TODO: Look through sext or zext cast, when the result is known to
566 // be interpreted as signed or unsigned, respectively.
567 // TODO: Look through eliminable cast pairs.
568 // TODO: Look through calls with unique return values.
569 // TODO: Look through vector insert/extract/shuffle.
570 V
= OffsetOk
? GetUnderlyingObject(V
, TD
) : V
->stripPointerCasts();
571 if (LoadInst
*L
= dyn_cast
<LoadInst
>(V
)) {
572 BasicBlock::iterator BBI
= L
;
573 BasicBlock
*BB
= L
->getParent();
574 SmallPtrSet
<BasicBlock
*, 4> VisitedBlocks
;
576 if (!VisitedBlocks
.insert(BB
)) break;
577 if (Value
*U
= FindAvailableLoadedValue(L
->getPointerOperand(),
579 return findValueImpl(U
, OffsetOk
, Visited
);
580 if (BBI
!= BB
->begin()) break;
581 BB
= BB
->getUniquePredecessor();
585 } else if (PHINode
*PN
= dyn_cast
<PHINode
>(V
)) {
586 if (Value
*W
= PN
->hasConstantValue())
588 return findValueImpl(W
, OffsetOk
, Visited
);
589 } else if (CastInst
*CI
= dyn_cast
<CastInst
>(V
)) {
590 if (CI
->isNoopCast(TD
? TD
->getIntPtrType(V
->getContext()) :
591 Type::getInt64Ty(V
->getContext())))
592 return findValueImpl(CI
->getOperand(0), OffsetOk
, Visited
);
593 } else if (ExtractValueInst
*Ex
= dyn_cast
<ExtractValueInst
>(V
)) {
594 if (Value
*W
= FindInsertedValue(Ex
->getAggregateOperand(),
598 return findValueImpl(W
, OffsetOk
, Visited
);
599 } else if (ConstantExpr
*CE
= dyn_cast
<ConstantExpr
>(V
)) {
600 // Same as above, but for ConstantExpr instead of Instruction.
601 if (Instruction::isCast(CE
->getOpcode())) {
602 if (CastInst::isNoopCast(Instruction::CastOps(CE
->getOpcode()),
603 CE
->getOperand(0)->getType(),
605 TD
? TD
->getIntPtrType(V
->getContext()) :
606 Type::getInt64Ty(V
->getContext())))
607 return findValueImpl(CE
->getOperand(0), OffsetOk
, Visited
);
608 } else if (CE
->getOpcode() == Instruction::ExtractValue
) {
609 ArrayRef
<unsigned> Indices
= CE
->getIndices();
610 if (Value
*W
= FindInsertedValue(CE
->getOperand(0),
614 return findValueImpl(W
, OffsetOk
, Visited
);
618 // As a last resort, try SimplifyInstruction or constant folding.
619 if (Instruction
*Inst
= dyn_cast
<Instruction
>(V
)) {
620 if (Value
*W
= SimplifyInstruction(Inst
, TD
, DT
))
621 return findValueImpl(W
, OffsetOk
, Visited
);
622 } else if (ConstantExpr
*CE
= dyn_cast
<ConstantExpr
>(V
)) {
623 if (Value
*W
= ConstantFoldConstantExpression(CE
, TD
))
625 return findValueImpl(W
, OffsetOk
, Visited
);
631 //===----------------------------------------------------------------------===//
632 // Implement the public interfaces to this file...
633 //===----------------------------------------------------------------------===//
635 FunctionPass
*llvm::createLintPass() {
639 /// lintFunction - Check a function for errors, printing messages on stderr.
641 void llvm::lintFunction(const Function
&f
) {
642 Function
&F
= const_cast<Function
&>(f
);
643 assert(!F
.isDeclaration() && "Cannot lint external functions");
645 FunctionPassManager
FPM(F
.getParent());
646 Lint
*V
= new Lint();
651 /// lintModule - Check a module for errors, printing messages on stderr.
653 void llvm::lintModule(const Module
&M
) {
655 Lint
*V
= new Lint();
657 PM
.run(const_cast<Module
&>(M
));