1 #include "llvm/Transforms/Utils/VNCoercion.h"
2 #include "llvm/Analysis/ConstantFolding.h"
3 #include "llvm/Analysis/ValueTracking.h"
4 #include "llvm/IR/IRBuilder.h"
5 #include "llvm/Support/Debug.h"
7 #define DEBUG_TYPE "vncoerce"
10 namespace VNCoercion
{
12 static bool isFirstClassAggregateOrScalableType(Type
*Ty
) {
13 return Ty
->isStructTy() || Ty
->isArrayTy() || isa
<ScalableVectorType
>(Ty
);
16 /// Return true if coerceAvailableValueToLoadType will succeed.
17 bool canCoerceMustAliasedValueToLoad(Value
*StoredVal
, Type
*LoadTy
,
18 const DataLayout
&DL
) {
19 Type
*StoredTy
= StoredVal
->getType();
21 if (StoredTy
== LoadTy
)
24 // If the loaded/stored value is a first class array/struct, or scalable type,
25 // don't try to transform them. We need to be able to bitcast to integer.
26 if (isFirstClassAggregateOrScalableType(LoadTy
) ||
27 isFirstClassAggregateOrScalableType(StoredTy
))
30 uint64_t StoreSize
= DL
.getTypeSizeInBits(StoredTy
).getFixedSize();
32 // The store size must be byte-aligned to support future type casts.
33 if (llvm::alignTo(StoreSize
, 8) != StoreSize
)
36 // The store has to be at least as big as the load.
37 if (StoreSize
< DL
.getTypeSizeInBits(LoadTy
).getFixedSize())
40 bool StoredNI
= DL
.isNonIntegralPointerType(StoredTy
->getScalarType());
41 bool LoadNI
= DL
.isNonIntegralPointerType(LoadTy
->getScalarType());
42 // Don't coerce non-integral pointers to integers or vice versa.
43 if (StoredNI
!= LoadNI
) {
44 // As a special case, allow coercion of memset used to initialize
45 // an array w/null. Despite non-integral pointers not generally having a
46 // specific bit pattern, we do assume null is zero.
47 if (auto *CI
= dyn_cast
<Constant
>(StoredVal
))
48 return CI
->isNullValue();
50 } else if (StoredNI
&& LoadNI
&&
51 StoredTy
->getPointerAddressSpace() !=
52 LoadTy
->getPointerAddressSpace()) {
57 // The implementation below uses inttoptr for vectors of unequal size; we
58 // can't allow this for non integral pointers. We could teach it to extract
59 // exact subvectors if desired.
60 if (StoredNI
&& StoreSize
!= DL
.getTypeSizeInBits(LoadTy
).getFixedSize())
66 template <class T
, class HelperClass
>
67 static T
*coerceAvailableValueToLoadTypeHelper(T
*StoredVal
, Type
*LoadedTy
,
69 const DataLayout
&DL
) {
70 assert(canCoerceMustAliasedValueToLoad(StoredVal
, LoadedTy
, DL
) &&
71 "precondition violation - materialization can't fail");
72 if (auto *C
= dyn_cast
<Constant
>(StoredVal
))
73 StoredVal
= ConstantFoldConstant(C
, DL
);
75 // If this is already the right type, just return it.
76 Type
*StoredValTy
= StoredVal
->getType();
78 uint64_t StoredValSize
= DL
.getTypeSizeInBits(StoredValTy
).getFixedSize();
79 uint64_t LoadedValSize
= DL
.getTypeSizeInBits(LoadedTy
).getFixedSize();
81 // If the store and reload are the same size, we can always reuse it.
82 if (StoredValSize
== LoadedValSize
) {
83 // Pointer to Pointer -> use bitcast.
84 if (StoredValTy
->isPtrOrPtrVectorTy() && LoadedTy
->isPtrOrPtrVectorTy()) {
85 StoredVal
= Helper
.CreateBitCast(StoredVal
, LoadedTy
);
87 // Convert source pointers to integers, which can be bitcast.
88 if (StoredValTy
->isPtrOrPtrVectorTy()) {
89 StoredValTy
= DL
.getIntPtrType(StoredValTy
);
90 StoredVal
= Helper
.CreatePtrToInt(StoredVal
, StoredValTy
);
93 Type
*TypeToCastTo
= LoadedTy
;
94 if (TypeToCastTo
->isPtrOrPtrVectorTy())
95 TypeToCastTo
= DL
.getIntPtrType(TypeToCastTo
);
97 if (StoredValTy
!= TypeToCastTo
)
98 StoredVal
= Helper
.CreateBitCast(StoredVal
, TypeToCastTo
);
100 // Cast to pointer if the load needs a pointer type.
101 if (LoadedTy
->isPtrOrPtrVectorTy())
102 StoredVal
= Helper
.CreateIntToPtr(StoredVal
, LoadedTy
);
105 if (auto *C
= dyn_cast
<ConstantExpr
>(StoredVal
))
106 StoredVal
= ConstantFoldConstant(C
, DL
);
110 // If the loaded value is smaller than the available value, then we can
111 // extract out a piece from it. If the available value is too small, then we
112 // can't do anything.
113 assert(StoredValSize
>= LoadedValSize
&&
114 "canCoerceMustAliasedValueToLoad fail");
116 // Convert source pointers to integers, which can be manipulated.
117 if (StoredValTy
->isPtrOrPtrVectorTy()) {
118 StoredValTy
= DL
.getIntPtrType(StoredValTy
);
119 StoredVal
= Helper
.CreatePtrToInt(StoredVal
, StoredValTy
);
122 // Convert vectors and fp to integer, which can be manipulated.
123 if (!StoredValTy
->isIntegerTy()) {
124 StoredValTy
= IntegerType::get(StoredValTy
->getContext(), StoredValSize
);
125 StoredVal
= Helper
.CreateBitCast(StoredVal
, StoredValTy
);
128 // If this is a big-endian system, we need to shift the value down to the low
129 // bits so that a truncate will work.
130 if (DL
.isBigEndian()) {
131 uint64_t ShiftAmt
= DL
.getTypeStoreSizeInBits(StoredValTy
).getFixedSize() -
132 DL
.getTypeStoreSizeInBits(LoadedTy
).getFixedSize();
133 StoredVal
= Helper
.CreateLShr(
134 StoredVal
, ConstantInt::get(StoredVal
->getType(), ShiftAmt
));
137 // Truncate the integer to the right size now.
138 Type
*NewIntTy
= IntegerType::get(StoredValTy
->getContext(), LoadedValSize
);
139 StoredVal
= Helper
.CreateTruncOrBitCast(StoredVal
, NewIntTy
);
141 if (LoadedTy
!= NewIntTy
) {
142 // If the result is a pointer, inttoptr.
143 if (LoadedTy
->isPtrOrPtrVectorTy())
144 StoredVal
= Helper
.CreateIntToPtr(StoredVal
, LoadedTy
);
146 // Otherwise, bitcast.
147 StoredVal
= Helper
.CreateBitCast(StoredVal
, LoadedTy
);
150 if (auto *C
= dyn_cast
<Constant
>(StoredVal
))
151 StoredVal
= ConstantFoldConstant(C
, DL
);
156 /// If we saw a store of a value to memory, and
157 /// then a load from a must-aliased pointer of a different type, try to coerce
158 /// the stored value. LoadedTy is the type of the load we want to replace.
159 /// IRB is IRBuilder used to insert new instructions.
161 /// If we can't do it, return null.
162 Value
*coerceAvailableValueToLoadType(Value
*StoredVal
, Type
*LoadedTy
,
164 const DataLayout
&DL
) {
165 return coerceAvailableValueToLoadTypeHelper(StoredVal
, LoadedTy
, IRB
, DL
);
168 /// This function is called when we have a memdep query of a load that ends up
169 /// being a clobbering memory write (store, memset, memcpy, memmove). This
170 /// means that the write *may* provide bits used by the load but we can't be
171 /// sure because the pointers don't must-alias.
173 /// Check this case to see if there is anything more we can do before we give
174 /// up. This returns -1 if we have to give up, or a byte number in the stored
175 /// value of the piece that feeds the load.
176 static int analyzeLoadFromClobberingWrite(Type
*LoadTy
, Value
*LoadPtr
,
178 uint64_t WriteSizeInBits
,
179 const DataLayout
&DL
) {
180 // If the loaded/stored value is a first class array/struct, or scalable type,
181 // don't try to transform them. We need to be able to bitcast to integer.
182 if (isFirstClassAggregateOrScalableType(LoadTy
))
185 int64_t StoreOffset
= 0, LoadOffset
= 0;
187 GetPointerBaseWithConstantOffset(WritePtr
, StoreOffset
, DL
);
188 Value
*LoadBase
= GetPointerBaseWithConstantOffset(LoadPtr
, LoadOffset
, DL
);
189 if (StoreBase
!= LoadBase
)
192 uint64_t LoadSize
= DL
.getTypeSizeInBits(LoadTy
).getFixedSize();
194 if ((WriteSizeInBits
& 7) | (LoadSize
& 7))
196 uint64_t StoreSize
= WriteSizeInBits
/ 8; // Convert to bytes.
199 // If the Load isn't completely contained within the stored bits, we don't
200 // have all the bits to feed it. We could do something crazy in the future
201 // (issue a smaller load then merge the bits in) but this seems unlikely to be
203 if (StoreOffset
> LoadOffset
||
204 StoreOffset
+ StoreSize
< LoadOffset
+ LoadSize
)
207 // If the load and store are to the exact same address, they should have been
208 // a must alias. AA must have gotten confused.
209 // FIXME: Study to see if/when this happens. One case is forwarding a memset
210 // to a load from the base of the memset.
212 // If the load and store don't overlap at all, the store doesn't provide
213 // anything to the load. In this case, they really don't alias at all, AA
214 // must have gotten confused. The if statement above ensure the condition
215 // that StoreOffset <= LoadOffset.
216 if (StoreOffset
+ int64_t(StoreSize
) <= LoadOffset
)
219 // Okay, we can do this transformation. Return the number of bytes into the
220 // store that the load is.
221 return LoadOffset
- StoreOffset
;
224 /// This function is called when we have a
225 /// memdep query of a load that ends up being a clobbering store.
226 int analyzeLoadFromClobberingStore(Type
*LoadTy
, Value
*LoadPtr
,
227 StoreInst
*DepSI
, const DataLayout
&DL
) {
228 auto *StoredVal
= DepSI
->getValueOperand();
230 // Cannot handle reading from store of first-class aggregate or scalable type.
231 if (isFirstClassAggregateOrScalableType(StoredVal
->getType()))
234 if (!canCoerceMustAliasedValueToLoad(StoredVal
, LoadTy
, DL
))
237 Value
*StorePtr
= DepSI
->getPointerOperand();
239 DL
.getTypeSizeInBits(DepSI
->getValueOperand()->getType()).getFixedSize();
240 return analyzeLoadFromClobberingWrite(LoadTy
, LoadPtr
, StorePtr
, StoreSize
,
244 /// Looks at a memory location for a load (specified by MemLocBase, Offs, and
245 /// Size) and compares it against a load.
247 /// If the specified load could be safely widened to a larger integer load
248 /// that is 1) still efficient, 2) safe for the target, and 3) would provide
249 /// the specified memory location value, then this function returns the size
250 /// in bytes of the load width to use. If not, this returns zero.
251 static unsigned getLoadLoadClobberFullWidthSize(const Value
*MemLocBase
,
254 const LoadInst
*LI
) {
255 // We can only extend simple integer loads.
256 if (!isa
<IntegerType
>(LI
->getType()) || !LI
->isSimple())
259 // Load widening is hostile to ThreadSanitizer: it may cause false positives
260 // or make the reports more cryptic (access sizes are wrong).
261 if (LI
->getParent()->getParent()->hasFnAttribute(Attribute::SanitizeThread
))
264 const DataLayout
&DL
= LI
->getModule()->getDataLayout();
266 // Get the base of this load.
268 const Value
*LIBase
=
269 GetPointerBaseWithConstantOffset(LI
->getPointerOperand(), LIOffs
, DL
);
271 // If the two pointers are not based on the same pointer, we can't tell that
273 if (LIBase
!= MemLocBase
)
276 // Okay, the two values are based on the same pointer, but returned as
277 // no-alias. This happens when we have things like two byte loads at "P+1"
278 // and "P+3". Check to see if increasing the size of the "LI" load up to its
279 // alignment (or the largest native integer type) will allow us to load all
280 // the bits required by MemLoc.
282 // If MemLoc is before LI, then no widening of LI will help us out.
283 if (MemLocOffs
< LIOffs
)
286 // Get the alignment of the load in bytes. We assume that it is safe to load
287 // any legal integer up to this size without a problem. For example, if we're
288 // looking at an i8 load on x86-32 that is known 1024 byte aligned, we can
289 // widen it up to an i32 load. If it is known 2-byte aligned, we can widen it
291 unsigned LoadAlign
= LI
->getAlignment();
293 int64_t MemLocEnd
= MemLocOffs
+ MemLocSize
;
295 // If no amount of rounding up will let MemLoc fit into LI, then bail out.
296 if (LIOffs
+ LoadAlign
< MemLocEnd
)
299 // This is the size of the load to try. Start with the next larger power of
301 unsigned NewLoadByteSize
= LI
->getType()->getPrimitiveSizeInBits() / 8U;
302 NewLoadByteSize
= NextPowerOf2(NewLoadByteSize
);
305 // If this load size is bigger than our known alignment or would not fit
306 // into a native integer register, then we fail.
307 if (NewLoadByteSize
> LoadAlign
||
308 !DL
.fitsInLegalInteger(NewLoadByteSize
* 8))
311 if (LIOffs
+ NewLoadByteSize
> MemLocEnd
&&
312 (LI
->getParent()->getParent()->hasFnAttribute(
313 Attribute::SanitizeAddress
) ||
314 LI
->getParent()->getParent()->hasFnAttribute(
315 Attribute::SanitizeHWAddress
)))
316 // We will be reading past the location accessed by the original program.
317 // While this is safe in a regular build, Address Safety analysis tools
318 // may start reporting false warnings. So, don't do widening.
321 // If a load of this width would include all of MemLoc, then we succeed.
322 if (LIOffs
+ NewLoadByteSize
>= MemLocEnd
)
323 return NewLoadByteSize
;
325 NewLoadByteSize
<<= 1;
329 /// This function is called when we have a
330 /// memdep query of a load that ends up being clobbered by another load. See if
331 /// the other load can feed into the second load.
332 int analyzeLoadFromClobberingLoad(Type
*LoadTy
, Value
*LoadPtr
, LoadInst
*DepLI
,
333 const DataLayout
&DL
) {
334 // Cannot handle reading from store of first-class aggregate yet.
335 if (DepLI
->getType()->isStructTy() || DepLI
->getType()->isArrayTy())
338 if (!canCoerceMustAliasedValueToLoad(DepLI
, LoadTy
, DL
))
341 Value
*DepPtr
= DepLI
->getPointerOperand();
342 uint64_t DepSize
= DL
.getTypeSizeInBits(DepLI
->getType()).getFixedSize();
343 int R
= analyzeLoadFromClobberingWrite(LoadTy
, LoadPtr
, DepPtr
, DepSize
, DL
);
347 // If we have a load/load clobber an DepLI can be widened to cover this load,
348 // then we should widen it!
349 int64_t LoadOffs
= 0;
350 const Value
*LoadBase
=
351 GetPointerBaseWithConstantOffset(LoadPtr
, LoadOffs
, DL
);
352 unsigned LoadSize
= DL
.getTypeStoreSize(LoadTy
).getFixedSize();
355 getLoadLoadClobberFullWidthSize(LoadBase
, LoadOffs
, LoadSize
, DepLI
);
359 // Check non-obvious conditions enforced by MDA which we rely on for being
360 // able to materialize this potentially available value
361 assert(DepLI
->isSimple() && "Cannot widen volatile/atomic load!");
362 assert(DepLI
->getType()->isIntegerTy() && "Can't widen non-integer load");
364 return analyzeLoadFromClobberingWrite(LoadTy
, LoadPtr
, DepPtr
, Size
* 8, DL
);
367 int analyzeLoadFromClobberingMemInst(Type
*LoadTy
, Value
*LoadPtr
,
368 MemIntrinsic
*MI
, const DataLayout
&DL
) {
369 // If the mem operation is a non-constant size, we can't handle it.
370 ConstantInt
*SizeCst
= dyn_cast
<ConstantInt
>(MI
->getLength());
373 uint64_t MemSizeInBits
= SizeCst
->getZExtValue() * 8;
375 // If this is memset, we just need to see if the offset is valid in the size
377 if (MI
->getIntrinsicID() == Intrinsic::memset
) {
378 if (DL
.isNonIntegralPointerType(LoadTy
->getScalarType())) {
379 auto *CI
= dyn_cast
<ConstantInt
>(cast
<MemSetInst
>(MI
)->getValue());
380 if (!CI
|| !CI
->isZero())
383 return analyzeLoadFromClobberingWrite(LoadTy
, LoadPtr
, MI
->getDest(),
387 // If we have a memcpy/memmove, the only case we can handle is if this is a
388 // copy from constant memory. In that case, we can read directly from the
390 MemTransferInst
*MTI
= cast
<MemTransferInst
>(MI
);
392 Constant
*Src
= dyn_cast
<Constant
>(MTI
->getSource());
396 GlobalVariable
*GV
= dyn_cast
<GlobalVariable
>(getUnderlyingObject(Src
));
397 if (!GV
|| !GV
->isConstant() || !GV
->hasDefinitiveInitializer())
400 // See if the access is within the bounds of the transfer.
401 int Offset
= analyzeLoadFromClobberingWrite(LoadTy
, LoadPtr
, MI
->getDest(),
406 unsigned AS
= Src
->getType()->getPointerAddressSpace();
407 // Otherwise, see if we can constant fold a load from the constant with the
408 // offset applied as appropriate.
410 Src
= ConstantExpr::getBitCast(Src
,
411 Type::getInt8PtrTy(Src
->getContext(), AS
));
412 Constant
*OffsetCst
=
413 ConstantInt::get(Type::getInt64Ty(Src
->getContext()), (unsigned)Offset
);
414 Src
= ConstantExpr::getGetElementPtr(Type::getInt8Ty(Src
->getContext()),
417 Src
= ConstantExpr::getBitCast(Src
, PointerType::get(LoadTy
, AS
));
418 if (ConstantFoldLoadFromConstPtr(Src
, LoadTy
, DL
))
423 template <class T
, class HelperClass
>
424 static T
*getStoreValueForLoadHelper(T
*SrcVal
, unsigned Offset
, Type
*LoadTy
,
426 const DataLayout
&DL
) {
427 LLVMContext
&Ctx
= SrcVal
->getType()->getContext();
429 // If two pointers are in the same address space, they have the same size,
430 // so we don't need to do any truncation, etc. This avoids introducing
431 // ptrtoint instructions for pointers that may be non-integral.
432 if (SrcVal
->getType()->isPointerTy() && LoadTy
->isPointerTy() &&
433 cast
<PointerType
>(SrcVal
->getType())->getAddressSpace() ==
434 cast
<PointerType
>(LoadTy
)->getAddressSpace()) {
439 (DL
.getTypeSizeInBits(SrcVal
->getType()).getFixedSize() + 7) / 8;
440 uint64_t LoadSize
= (DL
.getTypeSizeInBits(LoadTy
).getFixedSize() + 7) / 8;
441 // Compute which bits of the stored value are being used by the load. Convert
442 // to an integer type to start with.
443 if (SrcVal
->getType()->isPtrOrPtrVectorTy())
444 SrcVal
= Helper
.CreatePtrToInt(SrcVal
, DL
.getIntPtrType(SrcVal
->getType()));
445 if (!SrcVal
->getType()->isIntegerTy())
446 SrcVal
= Helper
.CreateBitCast(SrcVal
, IntegerType::get(Ctx
, StoreSize
* 8));
448 // Shift the bits to the least significant depending on endianness.
450 if (DL
.isLittleEndian())
451 ShiftAmt
= Offset
* 8;
453 ShiftAmt
= (StoreSize
- LoadSize
- Offset
) * 8;
455 SrcVal
= Helper
.CreateLShr(SrcVal
,
456 ConstantInt::get(SrcVal
->getType(), ShiftAmt
));
458 if (LoadSize
!= StoreSize
)
459 SrcVal
= Helper
.CreateTruncOrBitCast(SrcVal
,
460 IntegerType::get(Ctx
, LoadSize
* 8));
464 /// This function is called when we have a memdep query of a load that ends up
465 /// being a clobbering store. This means that the store provides bits used by
466 /// the load but the pointers don't must-alias. Check this case to see if
467 /// there is anything more we can do before we give up.
468 Value
*getStoreValueForLoad(Value
*SrcVal
, unsigned Offset
, Type
*LoadTy
,
469 Instruction
*InsertPt
, const DataLayout
&DL
) {
471 IRBuilder
<> Builder(InsertPt
);
472 SrcVal
= getStoreValueForLoadHelper(SrcVal
, Offset
, LoadTy
, Builder
, DL
);
473 return coerceAvailableValueToLoadTypeHelper(SrcVal
, LoadTy
, Builder
, DL
);
476 Constant
*getConstantStoreValueForLoad(Constant
*SrcVal
, unsigned Offset
,
477 Type
*LoadTy
, const DataLayout
&DL
) {
479 SrcVal
= getStoreValueForLoadHelper(SrcVal
, Offset
, LoadTy
, F
, DL
);
480 return coerceAvailableValueToLoadTypeHelper(SrcVal
, LoadTy
, F
, DL
);
483 /// This function is called when we have a memdep query of a load that ends up
484 /// being a clobbering load. This means that the load *may* provide bits used
485 /// by the load but we can't be sure because the pointers don't must-alias.
486 /// Check this case to see if there is anything more we can do before we give
488 Value
*getLoadValueForLoad(LoadInst
*SrcVal
, unsigned Offset
, Type
*LoadTy
,
489 Instruction
*InsertPt
, const DataLayout
&DL
) {
490 // If Offset+LoadTy exceeds the size of SrcVal, then we must be wanting to
491 // widen SrcVal out to a larger load.
492 unsigned SrcValStoreSize
=
493 DL
.getTypeStoreSize(SrcVal
->getType()).getFixedSize();
494 unsigned LoadSize
= DL
.getTypeStoreSize(LoadTy
).getFixedSize();
495 if (Offset
+ LoadSize
> SrcValStoreSize
) {
496 assert(SrcVal
->isSimple() && "Cannot widen volatile/atomic load!");
497 assert(SrcVal
->getType()->isIntegerTy() && "Can't widen non-integer load");
498 // If we have a load/load clobber an DepLI can be widened to cover this
499 // load, then we should widen it to the next power of 2 size big enough!
500 unsigned NewLoadSize
= Offset
+ LoadSize
;
501 if (!isPowerOf2_32(NewLoadSize
))
502 NewLoadSize
= NextPowerOf2(NewLoadSize
);
504 Value
*PtrVal
= SrcVal
->getPointerOperand();
505 // Insert the new load after the old load. This ensures that subsequent
506 // memdep queries will find the new load. We can't easily remove the old
507 // load completely because it is already in the value numbering table.
508 IRBuilder
<> Builder(SrcVal
->getParent(), ++BasicBlock::iterator(SrcVal
));
509 Type
*DestTy
= IntegerType::get(LoadTy
->getContext(), NewLoadSize
* 8);
511 PointerType::get(DestTy
, PtrVal
->getType()->getPointerAddressSpace());
512 Builder
.SetCurrentDebugLocation(SrcVal
->getDebugLoc());
513 PtrVal
= Builder
.CreateBitCast(PtrVal
, DestPTy
);
514 LoadInst
*NewLoad
= Builder
.CreateLoad(DestTy
, PtrVal
);
515 NewLoad
->takeName(SrcVal
);
516 NewLoad
->setAlignment(SrcVal
->getAlign());
518 LLVM_DEBUG(dbgs() << "GVN WIDENED LOAD: " << *SrcVal
<< "\n");
519 LLVM_DEBUG(dbgs() << "TO: " << *NewLoad
<< "\n");
521 // Replace uses of the original load with the wider load. On a big endian
522 // system, we need to shift down to get the relevant bits.
524 if (DL
.isBigEndian())
525 RV
= Builder
.CreateLShr(RV
, (NewLoadSize
- SrcValStoreSize
) * 8);
526 RV
= Builder
.CreateTrunc(RV
, SrcVal
->getType());
527 SrcVal
->replaceAllUsesWith(RV
);
532 return getStoreValueForLoad(SrcVal
, Offset
, LoadTy
, InsertPt
, DL
);
535 Constant
*getConstantLoadValueForLoad(Constant
*SrcVal
, unsigned Offset
,
536 Type
*LoadTy
, const DataLayout
&DL
) {
537 unsigned SrcValStoreSize
=
538 DL
.getTypeStoreSize(SrcVal
->getType()).getFixedSize();
539 unsigned LoadSize
= DL
.getTypeStoreSize(LoadTy
).getFixedSize();
540 if (Offset
+ LoadSize
> SrcValStoreSize
)
542 return getConstantStoreValueForLoad(SrcVal
, Offset
, LoadTy
, DL
);
545 template <class T
, class HelperClass
>
546 T
*getMemInstValueForLoadHelper(MemIntrinsic
*SrcInst
, unsigned Offset
,
547 Type
*LoadTy
, HelperClass
&Helper
,
548 const DataLayout
&DL
) {
549 LLVMContext
&Ctx
= LoadTy
->getContext();
550 uint64_t LoadSize
= DL
.getTypeSizeInBits(LoadTy
).getFixedSize() / 8;
552 // We know that this method is only called when the mem transfer fully
553 // provides the bits for the load.
554 if (MemSetInst
*MSI
= dyn_cast
<MemSetInst
>(SrcInst
)) {
555 // memset(P, 'x', 1234) -> splat('x'), even if x is a variable, and
556 // independently of what the offset is.
557 T
*Val
= cast
<T
>(MSI
->getValue());
560 Helper
.CreateZExtOrBitCast(Val
, IntegerType::get(Ctx
, LoadSize
* 8));
563 // Splat the value out to the right number of bits.
564 for (unsigned NumBytesSet
= 1; NumBytesSet
!= LoadSize
;) {
565 // If we can double the number of bytes set, do it.
566 if (NumBytesSet
* 2 <= LoadSize
) {
567 T
*ShVal
= Helper
.CreateShl(
568 Val
, ConstantInt::get(Val
->getType(), NumBytesSet
* 8));
569 Val
= Helper
.CreateOr(Val
, ShVal
);
574 // Otherwise insert one byte at a time.
575 T
*ShVal
= Helper
.CreateShl(Val
, ConstantInt::get(Val
->getType(), 1 * 8));
576 Val
= Helper
.CreateOr(OneElt
, ShVal
);
580 return coerceAvailableValueToLoadTypeHelper(Val
, LoadTy
, Helper
, DL
);
583 // Otherwise, this is a memcpy/memmove from a constant global.
584 MemTransferInst
*MTI
= cast
<MemTransferInst
>(SrcInst
);
585 Constant
*Src
= cast
<Constant
>(MTI
->getSource());
587 unsigned AS
= Src
->getType()->getPointerAddressSpace();
588 // Otherwise, see if we can constant fold a load from the constant with the
589 // offset applied as appropriate.
591 Src
= ConstantExpr::getBitCast(Src
,
592 Type::getInt8PtrTy(Src
->getContext(), AS
));
593 Constant
*OffsetCst
=
594 ConstantInt::get(Type::getInt64Ty(Src
->getContext()), (unsigned)Offset
);
595 Src
= ConstantExpr::getGetElementPtr(Type::getInt8Ty(Src
->getContext()),
598 Src
= ConstantExpr::getBitCast(Src
, PointerType::get(LoadTy
, AS
));
599 return ConstantFoldLoadFromConstPtr(Src
, LoadTy
, DL
);
602 /// This function is called when we have a
603 /// memdep query of a load that ends up being a clobbering mem intrinsic.
604 Value
*getMemInstValueForLoad(MemIntrinsic
*SrcInst
, unsigned Offset
,
605 Type
*LoadTy
, Instruction
*InsertPt
,
606 const DataLayout
&DL
) {
607 IRBuilder
<> Builder(InsertPt
);
608 return getMemInstValueForLoadHelper
<Value
, IRBuilder
<>>(SrcInst
, Offset
,
609 LoadTy
, Builder
, DL
);
612 Constant
*getConstantMemInstValueForLoad(MemIntrinsic
*SrcInst
, unsigned Offset
,
613 Type
*LoadTy
, const DataLayout
&DL
) {
614 // The only case analyzeLoadFromClobberingMemInst cannot be converted to a
615 // constant is when it's a memset of a non-constant.
616 if (auto *MSI
= dyn_cast
<MemSetInst
>(SrcInst
))
617 if (!isa
<Constant
>(MSI
->getValue()))
620 return getMemInstValueForLoadHelper
<Constant
, ConstantFolder
>(SrcInst
, Offset
,
623 } // namespace VNCoercion