]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Analysis/MemoryLocation.cpp
Merge ^/head r306412 through r306905.
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Analysis / MemoryLocation.cpp
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 MemoryLocation MemoryLocation::get(const LoadInst *LI) {
22   AAMDNodes AATags;
23   LI->getAAMetadata(AATags);
24   const auto &DL = LI->getModule()->getDataLayout();
25
26   return MemoryLocation(LI->getPointerOperand(),
27                         DL.getTypeStoreSize(LI->getType()), AATags);
28 }
29
30 MemoryLocation MemoryLocation::get(const StoreInst *SI) {
31   AAMDNodes AATags;
32   SI->getAAMetadata(AATags);
33   const auto &DL = SI->getModule()->getDataLayout();
34
35   return MemoryLocation(SI->getPointerOperand(),
36                         DL.getTypeStoreSize(SI->getValueOperand()->getType()),
37                         AATags);
38 }
39
40 MemoryLocation MemoryLocation::get(const VAArgInst *VI) {
41   AAMDNodes AATags;
42   VI->getAAMetadata(AATags);
43
44   return MemoryLocation(VI->getPointerOperand(), UnknownSize, AATags);
45 }
46
47 MemoryLocation MemoryLocation::get(const AtomicCmpXchgInst *CXI) {
48   AAMDNodes AATags;
49   CXI->getAAMetadata(AATags);
50   const auto &DL = CXI->getModule()->getDataLayout();
51
52   return MemoryLocation(
53       CXI->getPointerOperand(),
54       DL.getTypeStoreSize(CXI->getCompareOperand()->getType()), AATags);
55 }
56
57 MemoryLocation MemoryLocation::get(const AtomicRMWInst *RMWI) {
58   AAMDNodes AATags;
59   RMWI->getAAMetadata(AATags);
60   const auto &DL = RMWI->getModule()->getDataLayout();
61
62   return MemoryLocation(RMWI->getPointerOperand(),
63                         DL.getTypeStoreSize(RMWI->getValOperand()->getType()),
64                         AATags);
65 }
66
67 MemoryLocation MemoryLocation::getForSource(const MemTransferInst *MTI) {
68   uint64_t Size = UnknownSize;
69   if (ConstantInt *C = dyn_cast<ConstantInt>(MTI->getLength()))
70     Size = C->getValue().getZExtValue();
71
72   // memcpy/memmove can have AA tags. For memcpy, they apply
73   // to both the source and the destination.
74   AAMDNodes AATags;
75   MTI->getAAMetadata(AATags);
76
77   return MemoryLocation(MTI->getRawSource(), Size, AATags);
78 }
79
80 MemoryLocation MemoryLocation::getForDest(const MemIntrinsic *MTI) {
81   uint64_t Size = UnknownSize;
82   if (ConstantInt *C = dyn_cast<ConstantInt>(MTI->getLength()))
83     Size = C->getValue().getZExtValue();
84
85   // memcpy/memmove can have AA tags. For memcpy, they apply
86   // to both the source and the destination.
87   AAMDNodes AATags;
88   MTI->getAAMetadata(AATags);
89
90   return MemoryLocation(MTI->getRawDest(), Size, AATags);
91 }
92
93 MemoryLocation MemoryLocation::getForArgument(ImmutableCallSite CS,
94                                               unsigned ArgIdx,
95                                               const TargetLibraryInfo &TLI) {
96   AAMDNodes AATags;
97   CS->getAAMetadata(AATags);
98   const Value *Arg = CS.getArgument(ArgIdx);
99
100   // We may be able to produce an exact size for known intrinsics.
101   if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(CS.getInstruction())) {
102     const DataLayout &DL = II->getModule()->getDataLayout();
103
104     switch (II->getIntrinsicID()) {
105     default:
106       break;
107     case Intrinsic::memset:
108     case Intrinsic::memcpy:
109     case Intrinsic::memmove:
110       assert((ArgIdx == 0 || ArgIdx == 1) &&
111              "Invalid argument index for memory intrinsic");
112       if (ConstantInt *LenCI = dyn_cast<ConstantInt>(II->getArgOperand(2)))
113         return MemoryLocation(Arg, LenCI->getZExtValue(), AATags);
114       break;
115
116     case Intrinsic::lifetime_start:
117     case Intrinsic::lifetime_end:
118     case Intrinsic::invariant_start:
119       assert(ArgIdx == 1 && "Invalid argument index");
120       return MemoryLocation(
121           Arg, cast<ConstantInt>(II->getArgOperand(0))->getZExtValue(), AATags);
122
123     case Intrinsic::invariant_end:
124       assert(ArgIdx == 2 && "Invalid argument index");
125       return MemoryLocation(
126           Arg, cast<ConstantInt>(II->getArgOperand(1))->getZExtValue(), AATags);
127
128     case Intrinsic::arm_neon_vld1:
129       assert(ArgIdx == 0 && "Invalid argument index");
130       // LLVM's vld1 and vst1 intrinsics currently only support a single
131       // vector register.
132       return MemoryLocation(Arg, DL.getTypeStoreSize(II->getType()), AATags);
133
134     case Intrinsic::arm_neon_vst1:
135       assert(ArgIdx == 0 && "Invalid argument index");
136       return MemoryLocation(
137           Arg, DL.getTypeStoreSize(II->getArgOperand(1)->getType()), AATags);
138     }
139   }
140
141   // We can bound the aliasing properties of memset_pattern16 just as we can
142   // for memcpy/memset.  This is particularly important because the
143   // LoopIdiomRecognizer likes to turn loops into calls to memset_pattern16
144   // whenever possible.
145   LibFunc::Func F;
146   if (CS.getCalledFunction() && TLI.getLibFunc(*CS.getCalledFunction(), F) &&
147       F == LibFunc::memset_pattern16 && TLI.has(F)) {
148     assert((ArgIdx == 0 || ArgIdx == 1) &&
149            "Invalid argument index for memset_pattern16");
150     if (ArgIdx == 1)
151       return MemoryLocation(Arg, 16, AATags);
152     if (const ConstantInt *LenCI = dyn_cast<ConstantInt>(CS.getArgument(2)))
153       return MemoryLocation(Arg, LenCI->getZExtValue(), AATags);
154   }
155   // FIXME: Handle memset_pattern4 and memset_pattern8 also.
156
157   return MemoryLocation(CS.getArgument(ArgIdx), UnknownSize, AATags);
158 }