LCOV - code coverage report
Current view: top level - lib/Analysis - MemoryLocation.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 53 65 81.5 %
Date: 2018-10-20 13:21:21 Functions: 10 13 76.9 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- MemoryLocation.cpp - Memory location descriptions -------------------==//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : 
      10             : #include "llvm/Analysis/MemoryLocation.h"
      11             : #include "llvm/Analysis/TargetLibraryInfo.h"
      12             : #include "llvm/IR/BasicBlock.h"
      13             : #include "llvm/IR/DataLayout.h"
      14             : #include "llvm/IR/Instructions.h"
      15             : #include "llvm/IR/IntrinsicInst.h"
      16             : #include "llvm/IR/LLVMContext.h"
      17             : #include "llvm/IR/Module.h"
      18             : #include "llvm/IR/Type.h"
      19             : using namespace llvm;
      20             : 
      21         368 : void LocationSize::print(raw_ostream &OS) const {
      22         368 :   OS << "LocationSize::";
      23         368 :   if (*this == unknown())
      24           0 :     OS << "unknown";
      25         368 :   else if (*this == mapEmpty())
      26           0 :     OS << "mapEmpty";
      27         368 :   else if (*this == mapTombstone())
      28           0 :     OS << "mapTombstone";
      29         368 :   else if (isPrecise())
      30         368 :     OS << "precise(" << getValue() << ')';
      31             :   else
      32           0 :     OS << "upperBound(" << getValue() << ')';
      33         368 : }
      34             : 
      35    12066132 : MemoryLocation MemoryLocation::get(const LoadInst *LI) {
      36             :   AAMDNodes AATags;
      37    12066132 :   LI->getAAMetadata(AATags);
      38    12066132 :   const auto &DL = LI->getModule()->getDataLayout();
      39             : 
      40             :   return MemoryLocation(LI->getPointerOperand(),
      41    12066132 :                         DL.getTypeStoreSize(LI->getType()), AATags);
      42             : }
      43             : 
      44    19967365 : MemoryLocation MemoryLocation::get(const StoreInst *SI) {
      45             :   AAMDNodes AATags;
      46    19967365 :   SI->getAAMetadata(AATags);
      47    19967365 :   const auto &DL = SI->getModule()->getDataLayout();
      48             : 
      49             :   return MemoryLocation(SI->getPointerOperand(),
      50             :                         DL.getTypeStoreSize(SI->getValueOperand()->getType()),
      51    19967365 :                         AATags);
      52             : }
      53             : 
      54           7 : MemoryLocation MemoryLocation::get(const VAArgInst *VI) {
      55             :   AAMDNodes AATags;
      56           7 :   VI->getAAMetadata(AATags);
      57             : 
      58             :   return MemoryLocation(VI->getPointerOperand(), LocationSize::unknown(),
      59           7 :                         AATags);
      60             : }
      61             : 
      62           0 : MemoryLocation MemoryLocation::get(const AtomicCmpXchgInst *CXI) {
      63             :   AAMDNodes AATags;
      64           0 :   CXI->getAAMetadata(AATags);
      65           0 :   const auto &DL = CXI->getModule()->getDataLayout();
      66             : 
      67             :   return MemoryLocation(
      68             :       CXI->getPointerOperand(),
      69           0 :       DL.getTypeStoreSize(CXI->getCompareOperand()->getType()), AATags);
      70             : }
      71             : 
      72           2 : MemoryLocation MemoryLocation::get(const AtomicRMWInst *RMWI) {
      73             :   AAMDNodes AATags;
      74           2 :   RMWI->getAAMetadata(AATags);
      75           2 :   const auto &DL = RMWI->getModule()->getDataLayout();
      76             : 
      77             :   return MemoryLocation(RMWI->getPointerOperand(),
      78             :                         DL.getTypeStoreSize(RMWI->getValOperand()->getType()),
      79           2 :                         AATags);
      80             : }
      81             : 
      82        1766 : MemoryLocation MemoryLocation::getForSource(const MemTransferInst *MTI) {
      83        1766 :   return getForSource(cast<AnyMemTransferInst>(MTI));
      84             : }
      85             : 
      86           0 : MemoryLocation MemoryLocation::getForSource(const AtomicMemTransferInst *MTI) {
      87           0 :   return getForSource(cast<AnyMemTransferInst>(MTI));
      88             : }
      89             : 
      90       14905 : MemoryLocation MemoryLocation::getForSource(const AnyMemTransferInst *MTI) {
      91             :   uint64_t Size = MemoryLocation::UnknownSize;
      92             :   if (ConstantInt *C = dyn_cast<ConstantInt>(MTI->getLength()))
      93             :     Size = C->getValue().getZExtValue();
      94             : 
      95             :   // memcpy/memmove can have AA tags. For memcpy, they apply
      96             :   // to both the source and the destination.
      97             :   AAMDNodes AATags;
      98       14905 :   MTI->getAAMetadata(AATags);
      99             : 
     100       14905 :   return MemoryLocation(MTI->getRawSource(), Size, AATags);
     101             : }
     102             : 
     103         656 : MemoryLocation MemoryLocation::getForDest(const MemIntrinsic *MI) {
     104         656 :   return getForDest(cast<AnyMemIntrinsic>(MI));
     105             : }
     106             : 
     107           0 : MemoryLocation MemoryLocation::getForDest(const AtomicMemIntrinsic *MI) {
     108           0 :   return getForDest(cast<AnyMemIntrinsic>(MI));
     109             : }
     110             : 
     111       22338 : MemoryLocation MemoryLocation::getForDest(const AnyMemIntrinsic *MI) {
     112             :   uint64_t Size = MemoryLocation::UnknownSize;
     113             :   if (ConstantInt *C = dyn_cast<ConstantInt>(MI->getLength()))
     114             :     Size = C->getValue().getZExtValue();
     115             : 
     116             :   // memcpy/memmove can have AA tags. For memcpy, they apply
     117             :   // to both the source and the destination.
     118             :   AAMDNodes AATags;
     119       22338 :   MI->getAAMetadata(AATags);
     120             : 
     121       22338 :   return MemoryLocation(MI->getRawDest(), Size, AATags);
     122             : }
     123             : 
     124     5334852 : MemoryLocation MemoryLocation::getForArgument(ImmutableCallSite CS,
     125             :                                               unsigned ArgIdx,
     126             :                                               const TargetLibraryInfo *TLI) {
     127             :   AAMDNodes AATags;
     128     5334852 :   CS->getAAMetadata(AATags);
     129             :   const Value *Arg = CS.getArgument(ArgIdx);
     130             : 
     131             :   // We may be able to produce an exact size for known intrinsics.
     132             :   if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(CS.getInstruction())) {
     133     5321533 :     const DataLayout &DL = II->getModule()->getDataLayout();
     134             : 
     135     5321533 :     switch (II->getIntrinsicID()) {
     136             :     default:
     137             :       break;
     138     4355021 :     case Intrinsic::memset:
     139             :     case Intrinsic::memcpy:
     140             :     case Intrinsic::memmove:
     141             :       assert((ArgIdx == 0 || ArgIdx == 1) &&
     142             :              "Invalid argument index for memory intrinsic");
     143     4355021 :       if (ConstantInt *LenCI = dyn_cast<ConstantInt>(II->getArgOperand(2)))
     144             :         return MemoryLocation(Arg, LenCI->getZExtValue(), AATags);
     145             :       break;
     146             : 
     147      965852 :     case Intrinsic::lifetime_start:
     148             :     case Intrinsic::lifetime_end:
     149             :     case Intrinsic::invariant_start:
     150             :       assert(ArgIdx == 1 && "Invalid argument index");
     151             :       return MemoryLocation(
     152      965852 :           Arg, cast<ConstantInt>(II->getArgOperand(0))->getZExtValue(), AATags);
     153             : 
     154           8 :     case Intrinsic::invariant_end:
     155             :       // The first argument to an invariant.end is a "descriptor" type (e.g. a
     156             :       // pointer to a empty struct) which is never actually dereferenced.
     157           8 :       if (ArgIdx == 0)
     158             :         return MemoryLocation(Arg, 0, AATags);
     159             :       assert(ArgIdx == 2 && "Invalid argument index");
     160             :       return MemoryLocation(
     161           4 :           Arg, cast<ConstantInt>(II->getArgOperand(1))->getZExtValue(), AATags);
     162             : 
     163           4 :     case Intrinsic::arm_neon_vld1:
     164             :       assert(ArgIdx == 0 && "Invalid argument index");
     165             :       // LLVM's vld1 and vst1 intrinsics currently only support a single
     166             :       // vector register.
     167           4 :       return MemoryLocation(Arg, DL.getTypeStoreSize(II->getType()), AATags);
     168             : 
     169           4 :     case Intrinsic::arm_neon_vst1:
     170             :       assert(ArgIdx == 0 && "Invalid argument index");
     171             :       return MemoryLocation(
     172           4 :           Arg, DL.getTypeStoreSize(II->getArgOperand(1)->getType()), AATags);
     173             :     }
     174             :   }
     175             : 
     176             :   // We can bound the aliasing properties of memset_pattern16 just as we can
     177             :   // for memcpy/memset.  This is particularly important because the
     178             :   // LoopIdiomRecognizer likes to turn loops into calls to memset_pattern16
     179             :   // whenever possible.
     180             :   LibFunc F;
     181       33745 :   if (TLI && CS.getCalledFunction() &&
     182       33745 :       TLI->getLibFunc(*CS.getCalledFunction(), F) &&
     183       47198 :       F == LibFunc_memset_pattern16 && TLI->has(F)) {
     184             :     assert((ArgIdx == 0 || ArgIdx == 1) &&
     185             :            "Invalid argument index for memset_pattern16");
     186           2 :     if (ArgIdx == 1)
     187             :       return MemoryLocation(Arg, 16, AATags);
     188             :     if (const ConstantInt *LenCI = dyn_cast<ConstantInt>(CS.getArgument(2)))
     189             :       return MemoryLocation(Arg, LenCI->getZExtValue(), AATags);
     190             :   }
     191             :   // FIXME: Handle memset_pattern4 and memset_pattern8 also.
     192             : 
     193             :   return MemoryLocation(CS.getArgument(ArgIdx), LocationSize::unknown(),
     194       34173 :                         AATags);
     195             : }

Generated by: LCOV version 1.13