Lines Matching refs:I

94   void visitMemoryReference(Instruction &I, const MemoryLocation &Loc,
97 void visitReturnInst(ReturnInst &I);
98 void visitLoadInst(LoadInst &I);
99 void visitStoreInst(StoreInst &I);
100 void visitXor(BinaryOperator &I);
101 void visitSub(BinaryOperator &I);
102 void visitLShr(BinaryOperator &I);
103 void visitAShr(BinaryOperator &I);
104 void visitShl(BinaryOperator &I);
105 void visitSDiv(BinaryOperator &I);
106 void visitUDiv(BinaryOperator &I);
107 void visitSRem(BinaryOperator &I);
108 void visitURem(BinaryOperator &I);
109 void visitAllocaInst(AllocaInst &I);
110 void visitVAArgInst(VAArgInst &I);
111 void visitIndirectBrInst(IndirectBrInst &I);
112 void visitExtractElementInst(ExtractElementInst &I);
113 void visitInsertElementInst(InsertElementInst &I);
114 void visitUnreachableInst(UnreachableInst &I);
185 void Lint::visitCallBase(CallBase &I) { in visitCallBase() argument
186 Value *Callee = I.getCalledOperand(); in visitCallBase()
188 visitMemoryReference(I, MemoryLocation::getAfter(Callee), std::nullopt, in visitCallBase()
193 Check(I.getCallingConv() == F->getCallingConv(), in visitCallBase()
195 &I); in visitCallBase()
198 unsigned NumActualArgs = I.arg_size(); in visitCallBase()
204 &I); in visitCallBase()
206 Check(FT->getReturnType() == I.getType(), in visitCallBase()
209 &I); in visitCallBase()
214 auto AI = I.arg_begin(), AE = I.arg_end(); in visitCallBase()
222 &I); in visitCallBase()
228 AttributeList PAL = I.getAttributes(); in visitCallBase()
230 for (auto *BI = I.arg_begin(); BI != AE; ++BI, ++ArgNo) { in visitCallBase()
236 if (Formal->onlyReadsMemory() && I.onlyReadsMemory(ArgNo)) in visitCallBase()
240 if (I.doesNotAccessMemory(ArgNo)) in visitCallBase()
246 "Unusual: noalias argument aliases another argument", &I); in visitCallBase()
256 visitMemoryReference(I, Loc, DL->getABITypeAlign(Ty), Ty, in visitCallBase()
263 if (const auto *CI = dyn_cast<CallInst>(&I)) { in visitCallBase()
267 for (Value *Arg : I.args()) { in visitCallBase()
276 &I); in visitCallBase()
281 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(&I)) in visitCallBase()
289 MemCpyInst *MCI = cast<MemCpyInst>(&I); in visitCallBase()
290 visitMemoryReference(I, MemoryLocation::getForDest(MCI), in visitCallBase()
292 visitMemoryReference(I, MemoryLocation::getForSource(MCI), in visitCallBase()
306 "Undefined behavior: memcpy source and destination overlap", &I); in visitCallBase()
310 MemCpyInlineInst *MCII = cast<MemCpyInlineInst>(&I); in visitCallBase()
312 visitMemoryReference(I, MemoryLocation::getForDest(MCII), in visitCallBase()
314 visitMemoryReference(I, MemoryLocation::getForSource(MCII), in visitCallBase()
323 "Undefined behavior: memcpy source and destination overlap", &I); in visitCallBase()
327 MemMoveInst *MMI = cast<MemMoveInst>(&I); in visitCallBase()
328 visitMemoryReference(I, MemoryLocation::getForDest(MMI), in visitCallBase()
330 visitMemoryReference(I, MemoryLocation::getForSource(MMI), in visitCallBase()
335 MemSetInst *MSI = cast<MemSetInst>(&I); in visitCallBase()
336 visitMemoryReference(I, MemoryLocation::getForDest(MSI), in visitCallBase()
341 MemSetInlineInst *MSII = cast<MemSetInlineInst>(&I); in visitCallBase()
342 visitMemoryReference(I, MemoryLocation::getForDest(MSII), in visitCallBase()
348 Check(I.getParent()->getParent()->isVarArg(), in visitCallBase()
350 &I); in visitCallBase()
352 visitMemoryReference(I, MemoryLocation::getForArgument(&I, 0, TLI), in visitCallBase()
356 visitMemoryReference(I, MemoryLocation::getForArgument(&I, 0, TLI), in visitCallBase()
358 visitMemoryReference(I, MemoryLocation::getForArgument(&I, 1, TLI), in visitCallBase()
362 visitMemoryReference(I, MemoryLocation::getForArgument(&I, 0, TLI), in visitCallBase()
370 visitMemoryReference(I, MemoryLocation::getForArgument(&I, 0, TLI), in visitCallBase()
374 if (auto *TripCount = dyn_cast<ConstantInt>(I.getArgOperand(1))) in visitCallBase()
378 &I); in visitCallBase()
383 void Lint::visitReturnInst(ReturnInst &I) { in visitReturnInst() argument
384 Function *F = I.getParent()->getParent(); in visitReturnInst()
386 "Unusual: Return statement in function with noreturn attribute", &I); in visitReturnInst()
388 if (Value *V = I.getReturnValue()) { in visitReturnInst()
390 Check(!isa<AllocaInst>(Obj), "Unusual: Returning alloca value", &I); in visitReturnInst()
396 void Lint::visitMemoryReference(Instruction &I, const MemoryLocation &Loc, in visitMemoryReference() argument
406 "Undefined behavior: Null pointer dereference", &I); in visitMemoryReference()
408 "Undefined behavior: Undef pointer dereference", &I); in visitMemoryReference()
411 "Unusual: All-ones pointer dereference", &I); in visitMemoryReference()
414 "Unusual: Address one pointer dereference", &I); in visitMemoryReference()
419 &I); in visitMemoryReference()
422 "Undefined behavior: Write to text section", &I); in visitMemoryReference()
426 &I); in visitMemoryReference()
428 "Undefined behavior: Load from block address", &I); in visitMemoryReference()
432 "Undefined behavior: Call to block address", &I); in visitMemoryReference()
437 "Undefined behavior: Branch to non-blockaddress", &I); in visitMemoryReference()
473 "Undefined behavior: Buffer overflow", &I); in visitMemoryReference()
481 "Undefined behavior: Memory reference address is misaligned", &I); in visitMemoryReference()
485 void Lint::visitLoadInst(LoadInst &I) { in visitLoadInst() argument
486 visitMemoryReference(I, MemoryLocation::get(&I), I.getAlign(), I.getType(), in visitLoadInst()
490 void Lint::visitStoreInst(StoreInst &I) { in visitStoreInst() argument
491 visitMemoryReference(I, MemoryLocation::get(&I), I.getAlign(), in visitStoreInst()
492 I.getOperand(0)->getType(), MemRef::Write); in visitStoreInst()
495 void Lint::visitXor(BinaryOperator &I) { in visitXor() argument
496 Check(!isa<UndefValue>(I.getOperand(0)) || !isa<UndefValue>(I.getOperand(1)), in visitXor()
497 "Undefined result: xor(undef, undef)", &I); in visitXor()
500 void Lint::visitSub(BinaryOperator &I) { in visitSub() argument
501 Check(!isa<UndefValue>(I.getOperand(0)) || !isa<UndefValue>(I.getOperand(1)), in visitSub()
502 "Undefined result: sub(undef, undef)", &I); in visitSub()
505 void Lint::visitLShr(BinaryOperator &I) { in visitLShr() argument
506 if (ConstantInt *CI = dyn_cast<ConstantInt>(findValue(I.getOperand(1), in visitLShr()
508 Check(CI->getValue().ult(cast<IntegerType>(I.getType())->getBitWidth()), in visitLShr()
509 "Undefined result: Shift count out of range", &I); in visitLShr()
512 void Lint::visitAShr(BinaryOperator &I) { in visitAShr() argument
514 dyn_cast<ConstantInt>(findValue(I.getOperand(1), /*OffsetOk=*/false))) in visitAShr()
515 Check(CI->getValue().ult(cast<IntegerType>(I.getType())->getBitWidth()), in visitAShr()
516 "Undefined result: Shift count out of range", &I); in visitAShr()
519 void Lint::visitShl(BinaryOperator &I) { in visitShl() argument
521 dyn_cast<ConstantInt>(findValue(I.getOperand(1), /*OffsetOk=*/false))) in visitShl()
522 Check(CI->getValue().ult(cast<IntegerType>(I.getType())->getBitWidth()), in visitShl()
523 "Undefined result: Shift count out of range", &I); in visitShl()
549 for (unsigned I = 0, N = cast<FixedVectorType>(VecTy)->getNumElements(); in isZero() local
550 I != N; ++I) { in isZero()
551 Constant *Elem = C->getAggregateElement(I); in isZero()
563 void Lint::visitSDiv(BinaryOperator &I) { in visitSDiv() argument
564 Check(!isZero(I.getOperand(1), I.getModule()->getDataLayout(), DT, AC), in visitSDiv()
565 "Undefined behavior: Division by zero", &I); in visitSDiv()
568 void Lint::visitUDiv(BinaryOperator &I) { in visitUDiv() argument
569 Check(!isZero(I.getOperand(1), I.getModule()->getDataLayout(), DT, AC), in visitUDiv()
570 "Undefined behavior: Division by zero", &I); in visitUDiv()
573 void Lint::visitSRem(BinaryOperator &I) { in visitSRem() argument
574 Check(!isZero(I.getOperand(1), I.getModule()->getDataLayout(), DT, AC), in visitSRem()
575 "Undefined behavior: Division by zero", &I); in visitSRem()
578 void Lint::visitURem(BinaryOperator &I) { in visitURem() argument
579 Check(!isZero(I.getOperand(1), I.getModule()->getDataLayout(), DT, AC), in visitURem()
580 "Undefined behavior: Division by zero", &I); in visitURem()
583 void Lint::visitAllocaInst(AllocaInst &I) { in visitAllocaInst() argument
584 if (isa<ConstantInt>(I.getArraySize())) in visitAllocaInst()
586 Check(&I.getParent()->getParent()->getEntryBlock() == I.getParent(), in visitAllocaInst()
587 "Pessimization: Static alloca outside of entry block", &I); in visitAllocaInst()
592 void Lint::visitVAArgInst(VAArgInst &I) { in visitVAArgInst() argument
593 visitMemoryReference(I, MemoryLocation::get(&I), std::nullopt, nullptr, in visitVAArgInst()
597 void Lint::visitIndirectBrInst(IndirectBrInst &I) { in visitIndirectBrInst() argument
598 visitMemoryReference(I, MemoryLocation::getAfter(I.getAddress()), in visitIndirectBrInst()
601 Check(I.getNumDestinations() != 0, in visitIndirectBrInst()
602 "Undefined behavior: indirectbr with no destinations", &I); in visitIndirectBrInst()
605 void Lint::visitExtractElementInst(ExtractElementInst &I) { in visitExtractElementInst() argument
606 if (ConstantInt *CI = dyn_cast<ConstantInt>(findValue(I.getIndexOperand(), in visitExtractElementInst()
610 cast<FixedVectorType>(I.getVectorOperandType())->getNumElements()), in visitExtractElementInst()
611 "Undefined result: extractelement index out of range", &I); in visitExtractElementInst()
614 void Lint::visitInsertElementInst(InsertElementInst &I) { in visitInsertElementInst() argument
615 if (ConstantInt *CI = dyn_cast<ConstantInt>(findValue(I.getOperand(2), in visitInsertElementInst()
618 cast<FixedVectorType>(I.getType())->getNumElements()), in visitInsertElementInst()
619 "Undefined result: insertelement index out of range", &I); in visitInsertElementInst()
622 void Lint::visitUnreachableInst(UnreachableInst &I) { in visitUnreachableInst() argument
624 Check(&I == &I.getParent()->front() || in visitUnreachableInst()
625 std::prev(I.getIterator())->mayHaveSideEffects(), in visitUnreachableInst()
628 &I); in visitUnreachableInst()