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. The
230 // AliasAnalysis API isn't expressive enough for what we really want
231 // to do. Known partial overlap is not distinguished from the case
232 // where nothing is known.
233 if (Formal
->hasNoAliasAttr() && Actual
->getType()->isPointerTy())
234 for (CallSite::arg_iterator BI
= CS
.arg_begin(); BI
!= AE
; ++BI
) {
235 Assert1(AI
== BI
|| AA
->alias(*AI
, *BI
) != AliasAnalysis::MustAlias
,
236 "Unusual: noalias argument aliases another argument", &I
);
239 // Check that an sret argument points to valid memory.
240 if (Formal
->hasStructRetAttr() && Actual
->getType()->isPointerTy()) {
242 cast
<PointerType
>(Formal
->getType())->getElementType();
243 visitMemoryReference(I
, Actual
, AA
->getTypeStoreSize(Ty
),
244 TD
? TD
->getABITypeAlignment(Ty
) : 0,
245 Ty
, MemRef::Read
| MemRef::Write
);
251 if (CS
.isCall() && cast
<CallInst
>(CS
.getInstruction())->isTailCall())
252 for (CallSite::arg_iterator AI
= CS
.arg_begin(), AE
= CS
.arg_end();
254 Value
*Obj
= findValue(*AI
, /*OffsetOk=*/true);
255 Assert1(!isa
<AllocaInst
>(Obj
),
256 "Undefined behavior: Call with \"tail\" keyword references "
261 if (IntrinsicInst
*II
= dyn_cast
<IntrinsicInst
>(&I
))
262 switch (II
->getIntrinsicID()) {
265 // TODO: Check more intrinsics
267 case Intrinsic::memcpy
: {
268 MemCpyInst
*MCI
= cast
<MemCpyInst
>(&I
);
269 // TODO: If the size is known, use it.
270 visitMemoryReference(I
, MCI
->getDest(), AliasAnalysis::UnknownSize
,
271 MCI
->getAlignment(), 0,
273 visitMemoryReference(I
, MCI
->getSource(), AliasAnalysis::UnknownSize
,
274 MCI
->getAlignment(), 0,
277 // Check that the memcpy arguments don't overlap. The AliasAnalysis API
278 // isn't expressive enough for what we really want to do. Known partial
279 // overlap is not distinguished from the case where nothing is known.
281 if (const ConstantInt
*Len
=
282 dyn_cast
<ConstantInt
>(findValue(MCI
->getLength(),
283 /*OffsetOk=*/false)))
284 if (Len
->getValue().isIntN(32))
285 Size
= Len
->getValue().getZExtValue();
286 Assert1(AA
->alias(MCI
->getSource(), Size
, MCI
->getDest(), Size
) !=
287 AliasAnalysis::MustAlias
,
288 "Undefined behavior: memcpy source and destination overlap", &I
);
291 case Intrinsic::memmove
: {
292 MemMoveInst
*MMI
= cast
<MemMoveInst
>(&I
);
293 // TODO: If the size is known, use it.
294 visitMemoryReference(I
, MMI
->getDest(), AliasAnalysis::UnknownSize
,
295 MMI
->getAlignment(), 0,
297 visitMemoryReference(I
, MMI
->getSource(), AliasAnalysis::UnknownSize
,
298 MMI
->getAlignment(), 0,
302 case Intrinsic::memset
: {
303 MemSetInst
*MSI
= cast
<MemSetInst
>(&I
);
304 // TODO: If the size is known, use it.
305 visitMemoryReference(I
, MSI
->getDest(), AliasAnalysis::UnknownSize
,
306 MSI
->getAlignment(), 0,
311 case Intrinsic::vastart
:
312 Assert1(I
.getParent()->getParent()->isVarArg(),
313 "Undefined behavior: va_start called in a non-varargs function",
316 visitMemoryReference(I
, CS
.getArgument(0), AliasAnalysis::UnknownSize
,
317 0, 0, MemRef::Read
| MemRef::Write
);
319 case Intrinsic::vacopy
:
320 visitMemoryReference(I
, CS
.getArgument(0), AliasAnalysis::UnknownSize
,
321 0, 0, MemRef::Write
);
322 visitMemoryReference(I
, CS
.getArgument(1), AliasAnalysis::UnknownSize
,
325 case Intrinsic::vaend
:
326 visitMemoryReference(I
, CS
.getArgument(0), AliasAnalysis::UnknownSize
,
327 0, 0, MemRef::Read
| MemRef::Write
);
330 case Intrinsic::stackrestore
:
331 // Stackrestore doesn't read or write memory, but it sets the
332 // stack pointer, which the compiler may read from or write to
333 // at any time, so check it for both readability and writeability.
334 visitMemoryReference(I
, CS
.getArgument(0), AliasAnalysis::UnknownSize
,
335 0, 0, MemRef::Read
| MemRef::Write
);
340 void Lint::visitCallInst(CallInst
&I
) {
341 return visitCallSite(&I
);
344 void Lint::visitInvokeInst(InvokeInst
&I
) {
345 return visitCallSite(&I
);
348 void Lint::visitReturnInst(ReturnInst
&I
) {
349 Function
*F
= I
.getParent()->getParent();
350 Assert1(!F
->doesNotReturn(),
351 "Unusual: Return statement in function with noreturn attribute",
354 if (Value
*V
= I
.getReturnValue()) {
355 Value
*Obj
= findValue(V
, /*OffsetOk=*/true);
356 Assert1(!isa
<AllocaInst
>(Obj
),
357 "Unusual: Returning alloca value", &I
);
361 // TODO: Check that the reference is in bounds.
362 // TODO: Check readnone/readonly function attributes.
363 void Lint::visitMemoryReference(Instruction
&I
,
364 Value
*Ptr
, uint64_t Size
, unsigned Align
,
365 const Type
*Ty
, unsigned Flags
) {
366 // If no memory is being referenced, it doesn't matter if the pointer
371 Value
*UnderlyingObject
= findValue(Ptr
, /*OffsetOk=*/true);
372 Assert1(!isa
<ConstantPointerNull
>(UnderlyingObject
),
373 "Undefined behavior: Null pointer dereference", &I
);
374 Assert1(!isa
<UndefValue
>(UnderlyingObject
),
375 "Undefined behavior: Undef pointer dereference", &I
);
376 Assert1(!isa
<ConstantInt
>(UnderlyingObject
) ||
377 !cast
<ConstantInt
>(UnderlyingObject
)->isAllOnesValue(),
378 "Unusual: All-ones pointer dereference", &I
);
379 Assert1(!isa
<ConstantInt
>(UnderlyingObject
) ||
380 !cast
<ConstantInt
>(UnderlyingObject
)->isOne(),
381 "Unusual: Address one pointer dereference", &I
);
383 if (Flags
& MemRef::Write
) {
384 if (const GlobalVariable
*GV
= dyn_cast
<GlobalVariable
>(UnderlyingObject
))
385 Assert1(!GV
->isConstant(),
386 "Undefined behavior: Write to read-only memory", &I
);
387 Assert1(!isa
<Function
>(UnderlyingObject
) &&
388 !isa
<BlockAddress
>(UnderlyingObject
),
389 "Undefined behavior: Write to text section", &I
);
391 if (Flags
& MemRef::Read
) {
392 Assert1(!isa
<Function
>(UnderlyingObject
),
393 "Unusual: Load from function body", &I
);
394 Assert1(!isa
<BlockAddress
>(UnderlyingObject
),
395 "Undefined behavior: Load from block address", &I
);
397 if (Flags
& MemRef::Callee
) {
398 Assert1(!isa
<BlockAddress
>(UnderlyingObject
),
399 "Undefined behavior: Call to block address", &I
);
401 if (Flags
& MemRef::Branchee
) {
402 Assert1(!isa
<Constant
>(UnderlyingObject
) ||
403 isa
<BlockAddress
>(UnderlyingObject
),
404 "Undefined behavior: Branch to non-blockaddress", &I
);
408 if (Align
== 0 && Ty
) Align
= TD
->getABITypeAlignment(Ty
);
411 unsigned BitWidth
= TD
->getTypeSizeInBits(Ptr
->getType());
412 APInt Mask
= APInt::getAllOnesValue(BitWidth
),
413 KnownZero(BitWidth
, 0), KnownOne(BitWidth
, 0);
414 ComputeMaskedBits(Ptr
, Mask
, KnownZero
, KnownOne
, TD
);
415 Assert1(!(KnownOne
& APInt::getLowBitsSet(BitWidth
, Log2_32(Align
))),
416 "Undefined behavior: Memory reference address is misaligned", &I
);
421 void Lint::visitLoadInst(LoadInst
&I
) {
422 visitMemoryReference(I
, I
.getPointerOperand(),
423 AA
->getTypeStoreSize(I
.getType()), I
.getAlignment(),
424 I
.getType(), MemRef::Read
);
427 void Lint::visitStoreInst(StoreInst
&I
) {
428 visitMemoryReference(I
, I
.getPointerOperand(),
429 AA
->getTypeStoreSize(I
.getOperand(0)->getType()),
431 I
.getOperand(0)->getType(), MemRef::Write
);
434 void Lint::visitXor(BinaryOperator
&I
) {
435 Assert1(!isa
<UndefValue
>(I
.getOperand(0)) ||
436 !isa
<UndefValue
>(I
.getOperand(1)),
437 "Undefined result: xor(undef, undef)", &I
);
440 void Lint::visitSub(BinaryOperator
&I
) {
441 Assert1(!isa
<UndefValue
>(I
.getOperand(0)) ||
442 !isa
<UndefValue
>(I
.getOperand(1)),
443 "Undefined result: sub(undef, undef)", &I
);
446 void Lint::visitLShr(BinaryOperator
&I
) {
447 if (ConstantInt
*CI
=
448 dyn_cast
<ConstantInt
>(findValue(I
.getOperand(1), /*OffsetOk=*/false)))
449 Assert1(CI
->getValue().ult(cast
<IntegerType
>(I
.getType())->getBitWidth()),
450 "Undefined result: Shift count out of range", &I
);
453 void Lint::visitAShr(BinaryOperator
&I
) {
454 if (ConstantInt
*CI
=
455 dyn_cast
<ConstantInt
>(findValue(I
.getOperand(1), /*OffsetOk=*/false)))
456 Assert1(CI
->getValue().ult(cast
<IntegerType
>(I
.getType())->getBitWidth()),
457 "Undefined result: Shift count out of range", &I
);
460 void Lint::visitShl(BinaryOperator
&I
) {
461 if (ConstantInt
*CI
=
462 dyn_cast
<ConstantInt
>(findValue(I
.getOperand(1), /*OffsetOk=*/false)))
463 Assert1(CI
->getValue().ult(cast
<IntegerType
>(I
.getType())->getBitWidth()),
464 "Undefined result: Shift count out of range", &I
);
467 static bool isZero(Value
*V
, TargetData
*TD
) {
468 // Assume undef could be zero.
469 if (isa
<UndefValue
>(V
)) return true;
471 unsigned BitWidth
= cast
<IntegerType
>(V
->getType())->getBitWidth();
472 APInt Mask
= APInt::getAllOnesValue(BitWidth
),
473 KnownZero(BitWidth
, 0), KnownOne(BitWidth
, 0);
474 ComputeMaskedBits(V
, Mask
, KnownZero
, KnownOne
, TD
);
475 return KnownZero
.isAllOnesValue();
478 void Lint::visitSDiv(BinaryOperator
&I
) {
479 Assert1(!isZero(I
.getOperand(1), TD
),
480 "Undefined behavior: Division by zero", &I
);
483 void Lint::visitUDiv(BinaryOperator
&I
) {
484 Assert1(!isZero(I
.getOperand(1), TD
),
485 "Undefined behavior: Division by zero", &I
);
488 void Lint::visitSRem(BinaryOperator
&I
) {
489 Assert1(!isZero(I
.getOperand(1), TD
),
490 "Undefined behavior: Division by zero", &I
);
493 void Lint::visitURem(BinaryOperator
&I
) {
494 Assert1(!isZero(I
.getOperand(1), TD
),
495 "Undefined behavior: Division by zero", &I
);
498 void Lint::visitAllocaInst(AllocaInst
&I
) {
499 if (isa
<ConstantInt
>(I
.getArraySize()))
500 // This isn't undefined behavior, it's just an obvious pessimization.
501 Assert1(&I
.getParent()->getParent()->getEntryBlock() == I
.getParent(),
502 "Pessimization: Static alloca outside of entry block", &I
);
504 // TODO: Check for an unusual size (MSB set?)
507 void Lint::visitVAArgInst(VAArgInst
&I
) {
508 visitMemoryReference(I
, I
.getOperand(0), AliasAnalysis::UnknownSize
, 0, 0,
509 MemRef::Read
| MemRef::Write
);
512 void Lint::visitIndirectBrInst(IndirectBrInst
&I
) {
513 visitMemoryReference(I
, I
.getAddress(), AliasAnalysis::UnknownSize
, 0, 0,
516 Assert1(I
.getNumDestinations() != 0,
517 "Undefined behavior: indirectbr with no destinations", &I
);
520 void Lint::visitExtractElementInst(ExtractElementInst
&I
) {
521 if (ConstantInt
*CI
=
522 dyn_cast
<ConstantInt
>(findValue(I
.getIndexOperand(),
523 /*OffsetOk=*/false)))
524 Assert1(CI
->getValue().ult(I
.getVectorOperandType()->getNumElements()),
525 "Undefined result: extractelement index out of range", &I
);
528 void Lint::visitInsertElementInst(InsertElementInst
&I
) {
529 if (ConstantInt
*CI
=
530 dyn_cast
<ConstantInt
>(findValue(I
.getOperand(2),
531 /*OffsetOk=*/false)))
532 Assert1(CI
->getValue().ult(I
.getType()->getNumElements()),
533 "Undefined result: insertelement index out of range", &I
);
536 void Lint::visitUnreachableInst(UnreachableInst
&I
) {
537 // This isn't undefined behavior, it's merely suspicious.
538 Assert1(&I
== I
.getParent()->begin() ||
539 prior(BasicBlock::iterator(&I
))->mayHaveSideEffects(),
540 "Unusual: unreachable immediately preceded by instruction without "
544 /// findValue - Look through bitcasts and simple memory reference patterns
545 /// to identify an equivalent, but more informative, value. If OffsetOk
546 /// is true, look through getelementptrs with non-zero offsets too.
548 /// Most analysis passes don't require this logic, because instcombine
549 /// will simplify most of these kinds of things away. But it's a goal of
550 /// this Lint pass to be useful even on non-optimized IR.
551 Value
*Lint::findValue(Value
*V
, bool OffsetOk
) const {
552 SmallPtrSet
<Value
*, 4> Visited
;
553 return findValueImpl(V
, OffsetOk
, Visited
);
556 /// findValueImpl - Implementation helper for findValue.
557 Value
*Lint::findValueImpl(Value
*V
, bool OffsetOk
,
558 SmallPtrSet
<Value
*, 4> &Visited
) const {
559 // Detect self-referential values.
560 if (!Visited
.insert(V
))
561 return UndefValue::get(V
->getType());
563 // TODO: Look through sext or zext cast, when the result is known to
564 // be interpreted as signed or unsigned, respectively.
565 // TODO: Look through eliminable cast pairs.
566 // TODO: Look through calls with unique return values.
567 // TODO: Look through vector insert/extract/shuffle.
568 V
= OffsetOk
? V
->getUnderlyingObject() : V
->stripPointerCasts();
569 if (LoadInst
*L
= dyn_cast
<LoadInst
>(V
)) {
570 BasicBlock::iterator BBI
= L
;
571 BasicBlock
*BB
= L
->getParent();
572 SmallPtrSet
<BasicBlock
*, 4> VisitedBlocks
;
574 if (!VisitedBlocks
.insert(BB
)) break;
575 if (Value
*U
= FindAvailableLoadedValue(L
->getPointerOperand(),
577 return findValueImpl(U
, OffsetOk
, Visited
);
578 if (BBI
!= BB
->begin()) break;
579 BB
= BB
->getUniquePredecessor();
583 } else if (PHINode
*PN
= dyn_cast
<PHINode
>(V
)) {
584 if (Value
*W
= PN
->hasConstantValue(DT
))
585 return findValueImpl(W
, OffsetOk
, Visited
);
586 } else if (CastInst
*CI
= dyn_cast
<CastInst
>(V
)) {
587 if (CI
->isNoopCast(TD
? TD
->getIntPtrType(V
->getContext()) :
588 Type::getInt64Ty(V
->getContext())))
589 return findValueImpl(CI
->getOperand(0), OffsetOk
, Visited
);
590 } else if (ExtractValueInst
*Ex
= dyn_cast
<ExtractValueInst
>(V
)) {
591 if (Value
*W
= FindInsertedValue(Ex
->getAggregateOperand(),
595 return findValueImpl(W
, OffsetOk
, Visited
);
596 } else if (ConstantExpr
*CE
= dyn_cast
<ConstantExpr
>(V
)) {
597 // Same as above, but for ConstantExpr instead of Instruction.
598 if (Instruction::isCast(CE
->getOpcode())) {
599 if (CastInst::isNoopCast(Instruction::CastOps(CE
->getOpcode()),
600 CE
->getOperand(0)->getType(),
602 TD
? TD
->getIntPtrType(V
->getContext()) :
603 Type::getInt64Ty(V
->getContext())))
604 return findValueImpl(CE
->getOperand(0), OffsetOk
, Visited
);
605 } else if (CE
->getOpcode() == Instruction::ExtractValue
) {
606 const SmallVector
<unsigned, 4> &Indices
= CE
->getIndices();
607 if (Value
*W
= FindInsertedValue(CE
->getOperand(0),
611 return findValueImpl(W
, OffsetOk
, Visited
);
615 // As a last resort, try SimplifyInstruction or constant folding.
616 if (Instruction
*Inst
= dyn_cast
<Instruction
>(V
)) {
617 if (Value
*W
= SimplifyInstruction(Inst
, TD
))
619 return findValueImpl(W
, OffsetOk
, Visited
);
620 } else if (ConstantExpr
*CE
= dyn_cast
<ConstantExpr
>(V
)) {
621 if (Value
*W
= ConstantFoldConstantExpression(CE
, TD
))
623 return findValueImpl(W
, OffsetOk
, Visited
);
629 //===----------------------------------------------------------------------===//
630 // Implement the public interfaces to this file...
631 //===----------------------------------------------------------------------===//
633 FunctionPass
*llvm::createLintPass() {
637 /// lintFunction - Check a function for errors, printing messages on stderr.
639 void llvm::lintFunction(const Function
&f
) {
640 Function
&F
= const_cast<Function
&>(f
);
641 assert(!F
.isDeclaration() && "Cannot lint external functions");
643 FunctionPassManager
FPM(F
.getParent());
644 Lint
*V
= new Lint();
649 /// lintModule - Check a module for errors, printing messages on stderr.
651 void llvm::lintModule(const Module
&M
) {
653 Lint
*V
= new Lint();
655 PM
.run(const_cast<Module
&>(M
));