LLVM 23.0.0git
InstCombineLoadStoreAlloca.cpp
Go to the documentation of this file.
1//===- InstCombineLoadStoreAlloca.cpp -------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the visit functions for load, store and alloca.
10//
11//===----------------------------------------------------------------------===//
12
13#include "InstCombineInternal.h"
14#include "llvm/ADT/MapVector.h"
16#include "llvm/ADT/Statistic.h"
18#include "llvm/Analysis/Loads.h"
19#include "llvm/IR/DataLayout.h"
21#include "llvm/IR/LLVMContext.h"
25using namespace llvm;
26using namespace PatternMatch;
27
28#define DEBUG_TYPE "instcombine"
29
30namespace llvm {
32}
33
34STATISTIC(NumDeadStore, "Number of dead stores eliminated");
35STATISTIC(NumGlobalCopies, "Number of allocas copied from constant global");
36
38 "instcombine-max-copied-from-constant-users", cl::init(300),
39 cl::desc("Maximum users to visit in copy from constant transform"),
41
42/// isOnlyCopiedFromConstantMemory - Recursively walk the uses of a (derived)
43/// pointer to an alloca. Ignore any reads of the pointer, return false if we
44/// see any stores or other unknown uses. If we see pointer arithmetic, keep
45/// track of whether it moves the pointer (with IsOffset) but otherwise traverse
46/// the uses. If we see a memcpy/memmove that targets an unoffseted pointer to
47/// the alloca, and if the source pointer is a pointer to a constant memory
48/// location, we can optimize this.
49static bool
51 MemTransferInst *&TheCopy,
53 // We track lifetime intrinsics as we encounter them. If we decide to go
54 // ahead and replace the value with the memory location, this lets the caller
55 // quickly eliminate the markers.
56
57 using ValueAndIsOffset = PointerIntPair<Value *, 1, bool>;
60 Worklist.emplace_back(V, false);
61 while (!Worklist.empty()) {
62 ValueAndIsOffset Elem = Worklist.pop_back_val();
63 if (!Visited.insert(Elem).second)
64 continue;
65 if (Visited.size() > MaxCopiedFromConstantUsers)
66 return false;
67
68 const auto [Value, IsOffset] = Elem;
69 for (auto &U : Value->uses()) {
70 auto *I = cast<Instruction>(U.getUser());
71
72 if (auto *LI = dyn_cast<LoadInst>(I)) {
73 // Ignore non-volatile loads, they are always ok.
74 if (!LI->isSimple()) return false;
75 continue;
76 }
77
79 // We set IsOffset=true, to forbid the memcpy from occurring after the
80 // phi: If one of the phi operands is not based on the alloca, we
81 // would incorrectly omit a write.
82 Worklist.emplace_back(I, true);
83 continue;
84 }
86 // If uses of the bitcast are ok, we are ok.
87 Worklist.emplace_back(I, IsOffset);
88 continue;
89 }
90 if (auto *GEP = dyn_cast<GetElementPtrInst>(I)) {
91 // If the GEP has all zero indices, it doesn't offset the pointer. If it
92 // doesn't, it does.
93 Worklist.emplace_back(I, IsOffset || !GEP->hasAllZeroIndices());
94 continue;
95 }
96
97 if (auto *Call = dyn_cast<CallBase>(I)) {
98 // If this is the function being called then we treat it like a load and
99 // ignore it.
100 if (Call->isCallee(&U))
101 continue;
102
103 unsigned DataOpNo = Call->getDataOperandNo(&U);
104 bool IsArgOperand = Call->isArgOperand(&U);
105
106 // Inalloca arguments are clobbered by the call.
107 if (IsArgOperand && Call->isInAllocaArgument(DataOpNo))
108 return false;
109
110 // If this call site doesn't modify the memory, then we know it is just
111 // a load (but one that potentially returns the value itself), so we can
112 // ignore it if we know that the value isn't captured.
113 bool NoCapture = Call->doesNotCapture(DataOpNo);
114 if (NoCapture &&
115 (Call->onlyReadsMemory() || Call->onlyReadsMemory(DataOpNo)))
116 continue;
117 }
118
119 // Lifetime intrinsics can be handled by the caller.
120 if (I->isLifetimeStartOrEnd()) {
121 assert(I->use_empty() && "Lifetime markers have no result to use!");
122 ToDelete.push_back(I);
123 continue;
124 }
125
126 // If this is isn't our memcpy/memmove, reject it as something we can't
127 // handle.
129 if (!MI)
130 return false;
131
132 // If the transfer is volatile, reject it.
133 if (MI->isVolatile())
134 return false;
135
136 // If the transfer is using the alloca as a source of the transfer, then
137 // ignore it since it is a load (unless the transfer is volatile).
138 if (U.getOperandNo() == 1)
139 continue;
140
141 // If we already have seen a copy, reject the second one.
142 if (TheCopy) return false;
143
144 // If the pointer has been offset from the start of the alloca, we can't
145 // safely handle this.
146 if (IsOffset) return false;
147
148 // If the memintrinsic isn't using the alloca as the dest, reject it.
149 if (U.getOperandNo() != 0) return false;
150
151 // If the source of the memcpy/move is not constant, reject it.
152 if (isModSet(AA->getModRefInfoMask(MI->getSource())))
153 return false;
154
155 // Otherwise, the transform is safe. Remember the copy instruction.
156 TheCopy = MI;
157 }
158 }
159 return true;
160}
161
162/// isOnlyCopiedFromConstantMemory - Return true if the specified alloca is only
163/// modified by a copy from a constant memory location. If we can prove this, we
164/// can replace any uses of the alloca with uses of the memory location
165/// directly.
166static MemTransferInst *
168 AllocaInst *AI,
170 MemTransferInst *TheCopy = nullptr;
171 if (isOnlyCopiedFromConstantMemory(AA, AI, TheCopy, ToDelete))
172 return TheCopy;
173 return nullptr;
174}
175
176/// Returns true if V is dereferenceable for size of alloca.
177static bool isDereferenceableForAllocaSize(const Value *V, const AllocaInst *AI,
178 const DataLayout &DL) {
179 std::optional<TypeSize> AllocaSize = AI->getAllocationSize(DL);
180 if (!AllocaSize || AllocaSize->isScalable())
181 return false;
183 APInt(64, *AllocaSize), DL);
184}
185
187 AllocaInst &AI, DominatorTree &DT) {
188 // Check for array size of 1 (scalar allocation).
189 if (!AI.isArrayAllocation()) {
190 // i32 1 is the canonical array size for scalar allocations.
191 if (AI.getArraySize()->getType()->isIntegerTy(32))
192 return nullptr;
193
194 // Canonicalize it.
195 return IC.replaceOperand(AI, 0, IC.Builder.getInt32(1));
196 }
197
198 // Convert: alloca Ty, C - where C is a constant != 1 into: alloca [C x Ty], 1
199 if (const ConstantInt *C = dyn_cast<ConstantInt>(AI.getArraySize())) {
200 if (C->getValue().getActiveBits() <= 64) {
201 Type *NewTy = ArrayType::get(AI.getAllocatedType(), C->getZExtValue());
202 AllocaInst *New = IC.Builder.CreateAlloca(NewTy, AI.getAddressSpace(),
203 nullptr, AI.getName());
204 New->setAlignment(AI.getAlign());
205 New->setUsedWithInAlloca(AI.isUsedWithInAlloca());
206
207 replaceAllDbgUsesWith(AI, *New, *New, DT);
208 return IC.replaceInstUsesWith(AI, New);
209 }
210 }
211
213 return IC.replaceInstUsesWith(AI, PoisonValue::get(AI.getType()));
214
215 // Ensure that the alloca array size argument has type equal to the offset
216 // size of the alloca() pointer, which, in the tyical case, is intptr_t,
217 // so that any casting is exposed early.
218 Type *PtrIdxTy = IC.getDataLayout().getIndexType(AI.getType());
219 if (AI.getArraySize()->getType() != PtrIdxTy) {
220 Value *V = IC.Builder.CreateIntCast(AI.getArraySize(), PtrIdxTy, false);
221 return IC.replaceOperand(AI, 0, V);
222 }
223
224 return nullptr;
225}
226
227namespace {
228// If I and V are pointers in different address space, it is not allowed to
229// use replaceAllUsesWith since I and V have different types. A
230// non-target-specific transformation should not use addrspacecast on V since
231// the two address space may be disjoint depending on target.
232//
233// This class chases down uses of the old pointer until reaching the load
234// instructions, then replaces the old pointer in the load instructions with
235// the new pointer. If during the chasing it sees bitcast or GEP, it will
236// create new bitcast or GEP with the new pointer and use them in the load
237// instruction.
238class PointerReplacer {
239public:
240 PointerReplacer(InstCombinerImpl &IC, Instruction &Root, unsigned SrcAS)
241 : IC(IC), Root(Root), FromAS(SrcAS) {}
242
243 bool collectUsers();
244 void replacePointer(Value *V);
245
246private:
247 void replace(Instruction *I);
248 Value *getReplacement(Value *V) const { return WorkMap.lookup(V); }
249 bool isAvailable(Instruction *I) const {
250 return I == &Root || UsersToReplace.contains(I);
251 }
252
253 bool isEqualOrValidAddrSpaceCast(const Instruction *I,
254 unsigned FromAS) const {
255 const auto *ASC = dyn_cast<AddrSpaceCastInst>(I);
256 if (!ASC)
257 return false;
258 unsigned ToAS = ASC->getDestAddressSpace();
259 return (FromAS == ToAS) || IC.isValidAddrSpaceCast(FromAS, ToAS);
260 }
261
262 SmallSetVector<Instruction *, 32> UsersToReplace;
263 MapVector<Value *, Value *> WorkMap;
264 InstCombinerImpl &IC;
265 Instruction &Root;
266 unsigned FromAS;
267};
268} // end anonymous namespace
269
270bool PointerReplacer::collectUsers() {
272 SmallSetVector<Instruction *, 32> ValuesToRevisit;
273
274 auto PushUsersToWorklist = [&](Instruction *Inst) {
275 for (auto *U : Inst->users())
276 if (auto *I = dyn_cast<Instruction>(U))
277 if (!isAvailable(I) && !ValuesToRevisit.contains(I))
278 Worklist.emplace_back(I);
279 };
280
281 auto TryPushInstOperand = [&](Instruction *InstOp) {
282 if (!UsersToReplace.contains(InstOp)) {
283 if (!ValuesToRevisit.insert(InstOp))
284 return false;
285 Worklist.emplace_back(InstOp);
286 }
287 return true;
288 };
289
290 PushUsersToWorklist(&Root);
291 while (!Worklist.empty()) {
292 Instruction *Inst = Worklist.pop_back_val();
293 if (auto *Load = dyn_cast<LoadInst>(Inst)) {
294 if (Load->isVolatile())
295 return false;
296 UsersToReplace.insert(Load);
297 } else if (auto *PHI = dyn_cast<PHINode>(Inst)) {
298 /// TODO: Handle poison and null pointers for PHI and select.
299 // If all incoming values are available, mark this PHI as
300 // replacable and push it's users into the worklist.
301 bool IsReplaceable = all_of(PHI->incoming_values(),
302 [](Value *V) { return isa<Instruction>(V); });
303 if (IsReplaceable && all_of(PHI->incoming_values(), [&](Value *V) {
304 return isAvailable(cast<Instruction>(V));
305 })) {
306 UsersToReplace.insert(PHI);
307 PushUsersToWorklist(PHI);
308 continue;
309 }
310
311 // Either an incoming value is not an instruction or not all
312 // incoming values are available. If this PHI was already
313 // visited prior to this iteration, return false.
314 if (!IsReplaceable || !ValuesToRevisit.insert(PHI))
315 return false;
316
317 // Push PHI back into the stack, followed by unavailable
318 // incoming values.
319 Worklist.emplace_back(PHI);
320 for (unsigned Idx = 0; Idx < PHI->getNumIncomingValues(); ++Idx) {
321 if (!TryPushInstOperand(cast<Instruction>(PHI->getIncomingValue(Idx))))
322 return false;
323 }
324 } else if (auto *SI = dyn_cast<SelectInst>(Inst)) {
325 auto *TrueInst = dyn_cast<Instruction>(SI->getTrueValue());
326 auto *FalseInst = dyn_cast<Instruction>(SI->getFalseValue());
327 if (!TrueInst || !FalseInst)
328 return false;
329
330 if (isAvailable(TrueInst) && isAvailable(FalseInst)) {
331 UsersToReplace.insert(SI);
332 PushUsersToWorklist(SI);
333 continue;
334 }
335
336 // Push select back onto the stack, followed by unavailable true/false
337 // value.
338 Worklist.emplace_back(SI);
339 if (!TryPushInstOperand(TrueInst) || !TryPushInstOperand(FalseInst))
340 return false;
341 } else if (auto *GEP = dyn_cast<GetElementPtrInst>(Inst)) {
342 auto *PtrOp = dyn_cast<Instruction>(GEP->getPointerOperand());
343 if (!PtrOp)
344 return false;
345 if (isAvailable(PtrOp)) {
346 UsersToReplace.insert(GEP);
347 PushUsersToWorklist(GEP);
348 continue;
349 }
350
351 Worklist.emplace_back(GEP);
352 if (!TryPushInstOperand(PtrOp))
353 return false;
354 } else if (auto *MI = dyn_cast<MemTransferInst>(Inst)) {
355 if (MI->isVolatile())
356 return false;
357 UsersToReplace.insert(Inst);
358 } else if (isEqualOrValidAddrSpaceCast(Inst, FromAS)) {
359 UsersToReplace.insert(Inst);
360 PushUsersToWorklist(Inst);
361 } else if (Inst->isLifetimeStartOrEnd()) {
362 continue;
363 } else {
364 // TODO: For arbitrary uses with address space mismatches, should we check
365 // if we can introduce a valid addrspacecast?
366 LLVM_DEBUG(dbgs() << "Cannot handle pointer user: " << *Inst << '\n');
367 return false;
368 }
369 }
370
371 return true;
372}
373
374void PointerReplacer::replacePointer(Value *V) {
375 assert(cast<PointerType>(Root.getType()) != cast<PointerType>(V->getType()) &&
376 "Invalid usage");
377 WorkMap[&Root] = V;
379 SetVector<Instruction *> PostOrderWorklist;
380 SmallPtrSet<Instruction *, 32> Visited;
381
382 // Perform a postorder traversal of the users of Root.
383 Worklist.push_back(&Root);
384 while (!Worklist.empty()) {
385 Instruction *I = Worklist.back();
386
387 // If I has not been processed before, push each of its
388 // replacable users into the worklist.
389 if (Visited.insert(I).second) {
390 for (auto *U : I->users()) {
391 auto *UserInst = cast<Instruction>(U);
392 if (UsersToReplace.contains(UserInst) && !Visited.contains(UserInst))
393 Worklist.push_back(UserInst);
394 }
395 // Otherwise, users of I have already been pushed into
396 // the PostOrderWorklist. Push I as well.
397 } else {
398 PostOrderWorklist.insert(I);
399 Worklist.pop_back();
400 }
401 }
402
403 // Replace pointers in reverse-postorder.
404 for (Instruction *I : reverse(PostOrderWorklist))
405 replace(I);
406}
407
408void PointerReplacer::replace(Instruction *I) {
409 if (getReplacement(I))
410 return;
411
412 if (auto *LT = dyn_cast<LoadInst>(I)) {
413 auto *V = getReplacement(LT->getPointerOperand());
414 assert(V && "Operand not replaced");
415 auto *NewI = new LoadInst(LT->getType(), V, "", LT->isVolatile(),
416 LT->getAlign(), LT->getOrdering(),
417 LT->getSyncScopeID());
418 NewI->takeName(LT);
419 copyMetadataForLoad(*NewI, *LT);
420
421 IC.InsertNewInstWith(NewI, LT->getIterator());
422 IC.replaceInstUsesWith(*LT, NewI);
423 // LT has actually been replaced by NewI. It is useless to insert LT into
424 // the map. Instead, we insert NewI into the map to indicate this is the
425 // replacement (new value).
426 WorkMap[NewI] = NewI;
427 } else if (auto *PHI = dyn_cast<PHINode>(I)) {
428 // Create a new PHI by replacing any incoming value that is a user of the
429 // root pointer and has a replacement.
430 Value *V = WorkMap.lookup(PHI->getIncomingValue(0));
431 PHI->mutateType(V ? V->getType() : PHI->getIncomingValue(0)->getType());
432 for (unsigned int I = 0; I < PHI->getNumIncomingValues(); ++I) {
433 Value *V = WorkMap.lookup(PHI->getIncomingValue(I));
434 PHI->setIncomingValue(I, V ? V : PHI->getIncomingValue(I));
435 }
436 WorkMap[PHI] = PHI;
437 } else if (auto *GEP = dyn_cast<GetElementPtrInst>(I)) {
438 auto *V = getReplacement(GEP->getPointerOperand());
439 assert(V && "Operand not replaced");
440 SmallVector<Value *, 8> Indices(GEP->indices());
441 auto *NewI =
442 GetElementPtrInst::Create(GEP->getSourceElementType(), V, Indices);
443 IC.InsertNewInstWith(NewI, GEP->getIterator());
444 NewI->takeName(GEP);
445 NewI->setNoWrapFlags(GEP->getNoWrapFlags());
446 WorkMap[GEP] = NewI;
447 } else if (auto *SI = dyn_cast<SelectInst>(I)) {
448 Value *TrueValue = SI->getTrueValue();
449 Value *FalseValue = SI->getFalseValue();
450 if (Value *Replacement = getReplacement(TrueValue))
451 TrueValue = Replacement;
452 if (Value *Replacement = getReplacement(FalseValue))
453 FalseValue = Replacement;
454 auto *NewSI = SelectInst::Create(SI->getCondition(), TrueValue, FalseValue,
455 SI->getName(), nullptr, SI);
456 IC.InsertNewInstWith(NewSI, SI->getIterator());
457 NewSI->takeName(SI);
458 WorkMap[SI] = NewSI;
459 } else if (auto *MemCpy = dyn_cast<MemTransferInst>(I)) {
460 auto *DestV = MemCpy->getRawDest();
461 auto *SrcV = MemCpy->getRawSource();
462
463 if (auto *DestReplace = getReplacement(DestV))
464 DestV = DestReplace;
465 if (auto *SrcReplace = getReplacement(SrcV))
466 SrcV = SrcReplace;
467
468 IC.Builder.SetInsertPoint(MemCpy);
469 auto *NewI = IC.Builder.CreateMemTransferInst(
470 MemCpy->getIntrinsicID(), DestV, MemCpy->getDestAlign(), SrcV,
471 MemCpy->getSourceAlign(), MemCpy->getLength(), MemCpy->isVolatile());
472 AAMDNodes AAMD = MemCpy->getAAMetadata();
473 if (AAMD)
474 NewI->setAAMetadata(AAMD);
475
476 IC.eraseInstFromFunction(*MemCpy);
477 WorkMap[MemCpy] = NewI;
478 } else if (auto *ASC = dyn_cast<AddrSpaceCastInst>(I)) {
479 auto *V = getReplacement(ASC->getPointerOperand());
480 assert(V && "Operand not replaced");
481 assert(isEqualOrValidAddrSpaceCast(
482 ASC, V->getType()->getPointerAddressSpace()) &&
483 "Invalid address space cast!");
484
485 if (V->getType()->getPointerAddressSpace() !=
486 ASC->getType()->getPointerAddressSpace()) {
487 auto *NewI = new AddrSpaceCastInst(V, ASC->getType(), "");
488 NewI->takeName(ASC);
489 IC.InsertNewInstWith(NewI, ASC->getIterator());
490 WorkMap[ASC] = NewI;
491 } else {
492 WorkMap[ASC] = V;
493 }
494
495 } else {
496 llvm_unreachable("should never reach here");
497 }
498}
499
501 if (auto *I = simplifyAllocaArraySize(*this, AI, DT))
502 return I;
503
504 // Move all alloca's of zero byte objects to the entry block and merge them
505 // together. Note that we only do this for alloca's, because malloc should
506 // allocate and return a unique pointer, even for a zero byte allocation.
507 std::optional<TypeSize> Size = AI.getAllocationSize(DL);
508 if (Size && Size->isZero()) {
509 // For a zero sized alloca there is no point in doing an array allocation.
510 // This is helpful if the array size is a complicated expression not used
511 // elsewhere.
512 if (AI.isArrayAllocation())
513 return replaceOperand(AI, 0,
514 ConstantInt::get(AI.getArraySize()->getType(), 1));
515
516 // Get the first instruction in the entry block.
517 BasicBlock &EntryBlock = AI.getParent()->getParent()->getEntryBlock();
518 BasicBlock::iterator FirstInst = EntryBlock.getFirstNonPHIOrDbg();
519 if (&*FirstInst != &AI) {
520 // If the entry block doesn't start with a zero-size alloca then move
521 // this one to the start of the entry block. There is no problem with
522 // dominance as the array size was forced to a constant earlier already.
523 AllocaInst *EntryAI = dyn_cast<AllocaInst>(FirstInst);
524 std::optional<TypeSize> EntryAISize =
525 EntryAI ? EntryAI->getAllocationSize(DL) : std::nullopt;
526 if (!EntryAISize || !EntryAISize->isZero()) {
527 AI.moveBefore(FirstInst);
528 return &AI;
529 }
530
531 // Replace this zero-sized alloca with the one at the start of the entry
532 // block after ensuring that the address will be aligned enough for both
533 // types.
534 const Align MaxAlign = std::max(EntryAI->getAlign(), AI.getAlign());
535 EntryAI->setAlignment(MaxAlign);
536 return replaceInstUsesWith(AI, EntryAI);
537 }
538 }
539
540 // Check to see if this allocation is only modified by a memcpy/memmove from
541 // a memory location whose alignment is equal to or exceeds that of the
542 // allocation. If this is the case, we can change all users to use the
543 // constant memory location instead. This is commonly produced by the CFE by
544 // constructs like "void foo() { int A[] = {1,2,3,4,5,6,7,8,9...}; }" if 'A'
545 // is only subsequently read.
547 if (MemTransferInst *Copy = isOnlyCopiedFromConstantMemory(AA, &AI, ToDelete)) {
548 Value *TheSrc = Copy->getSource();
549 Align AllocaAlign = AI.getAlign();
550 Align SourceAlign = getOrEnforceKnownAlignment(
551 TheSrc, AllocaAlign, DL, &AI, &AC, &DT);
552 if (AllocaAlign <= SourceAlign &&
553 isDereferenceableForAllocaSize(TheSrc, &AI, DL) &&
554 !isa<Instruction>(TheSrc)) {
555 // FIXME: Can we sink instructions without violating dominance when TheSrc
556 // is an instruction instead of a constant or argument?
557 LLVM_DEBUG(dbgs() << "Found alloca equal to global: " << AI << '\n');
558 LLVM_DEBUG(dbgs() << " memcpy = " << *Copy << '\n');
559 unsigned SrcAddrSpace = TheSrc->getType()->getPointerAddressSpace();
560 if (AI.getAddressSpace() == SrcAddrSpace) {
561 for (Instruction *Delete : ToDelete)
562 eraseInstFromFunction(*Delete);
563
564 Instruction *NewI = replaceInstUsesWith(AI, TheSrc);
566 ++NumGlobalCopies;
567 return NewI;
568 }
569
570 PointerReplacer PtrReplacer(*this, AI, SrcAddrSpace);
571 if (PtrReplacer.collectUsers()) {
572 for (Instruction *Delete : ToDelete)
573 eraseInstFromFunction(*Delete);
574
575 PtrReplacer.replacePointer(TheSrc);
576 ++NumGlobalCopies;
577 }
578 }
579 }
580
581 // At last, use the generic allocation site handler to aggressively remove
582 // unused allocas.
583 return visitAllocSite(AI);
584}
585
586// Are we allowed to form a atomic load or store of this type?
587static bool isSupportedAtomicType(Type *Ty) {
588 return Ty->isIntOrPtrTy() || Ty->isFloatingPointTy();
589}
590
591/// Helper to combine a load to a new type.
592///
593/// This just does the work of combining a load to a new type. It handles
594/// metadata, etc., and returns the new instruction. The \c NewTy should be the
595/// loaded *value* type. This will convert it to a pointer, cast the operand to
596/// that pointer type, load it, etc.
597///
598/// Note that this will create all of the instructions with whatever insert
599/// point the \c InstCombinerImpl currently is using.
601 const Twine &Suffix) {
602 assert((!LI.isAtomic() || isSupportedAtomicType(NewTy)) &&
603 "can't fold an atomic load to requested type");
604
605 LoadInst *NewLoad =
606 Builder.CreateAlignedLoad(NewTy, LI.getPointerOperand(), LI.getAlign(),
607 LI.isVolatile(), LI.getName() + Suffix);
608 NewLoad->setAtomic(LI.getOrdering(), LI.getSyncScopeID());
609 copyMetadataForLoad(*NewLoad, LI);
610 return NewLoad;
611}
612
613/// Combine a store to a new type.
614///
615/// Returns the newly created store instruction.
617 Value *V) {
618 assert((!SI.isAtomic() || isSupportedAtomicType(V->getType())) &&
619 "can't fold an atomic store of requested type");
620
621 Value *Ptr = SI.getPointerOperand();
623 SI.getAllMetadata(MD);
624
625 StoreInst *NewStore =
626 IC.Builder.CreateAlignedStore(V, Ptr, SI.getAlign(), SI.isVolatile());
627 NewStore->setAtomic(SI.getOrdering(), SI.getSyncScopeID());
628 for (const auto &MDPair : MD) {
629 unsigned ID = MDPair.first;
630 MDNode *N = MDPair.second;
631 // Note, essentially every kind of metadata should be preserved here! This
632 // routine is supposed to clone a store instruction changing *only its
633 // type*. The only metadata it makes sense to drop is metadata which is
634 // invalidated when the pointer type changes. This should essentially
635 // never be the case in LLVM, but we explicitly switch over only known
636 // metadata to be conservatively correct. If you are adding metadata to
637 // LLVM which pertains to stores, you almost certainly want to add it
638 // here.
639 switch (ID) {
640 case LLVMContext::MD_dbg:
641 case LLVMContext::MD_DIAssignID:
642 case LLVMContext::MD_tbaa:
643 case LLVMContext::MD_prof:
644 case LLVMContext::MD_fpmath:
645 case LLVMContext::MD_tbaa_struct:
646 case LLVMContext::MD_alias_scope:
647 case LLVMContext::MD_noalias:
648 case LLVMContext::MD_nontemporal:
649 case LLVMContext::MD_mem_parallel_loop_access:
650 case LLVMContext::MD_access_group:
651 // All of these directly apply.
652 NewStore->setMetadata(ID, N);
653 break;
654 case LLVMContext::MD_invariant_load:
655 case LLVMContext::MD_nonnull:
656 case LLVMContext::MD_noundef:
657 case LLVMContext::MD_range:
658 case LLVMContext::MD_align:
659 case LLVMContext::MD_dereferenceable:
660 case LLVMContext::MD_dereferenceable_or_null:
661 // These don't apply for stores.
662 break;
663 }
664 }
665
666 return NewStore;
667}
668
669/// Combine loads to match the type of their uses' value after looking
670/// through intervening bitcasts.
671///
672/// The core idea here is that if the result of a load is used in an operation,
673/// we should load the type most conducive to that operation. For example, when
674/// loading an integer and converting that immediately to a pointer, we should
675/// instead directly load a pointer.
676///
677/// However, this routine must never change the width of a load or the number of
678/// loads as that would introduce a semantic change. This combine is expected to
679/// be a semantic no-op which just allows loads to more closely model the types
680/// of their consuming operations.
681///
682/// Currently, we also refuse to change the precise type used for an atomic load
683/// or a volatile load. This is debatable, and might be reasonable to change
684/// later. However, it is risky in case some backend or other part of LLVM is
685/// relying on the exact type loaded to select appropriate atomic operations.
687 LoadInst &Load) {
688 // FIXME: We could probably with some care handle both volatile and ordered
689 // atomic loads here but it isn't clear that this is important.
690 if (!Load.isUnordered())
691 return nullptr;
692
693 if (Load.use_empty())
694 return nullptr;
695
696 // swifterror values can't be bitcasted.
697 if (Load.getPointerOperand()->isSwiftError())
698 return nullptr;
699
700 // Fold away bit casts of the loaded value by loading the desired type.
701 // Note that we should not do this for pointer<->integer casts,
702 // because that would result in type punning.
703 if (Load.hasOneUse()) {
704 // Don't transform when the type is x86_amx, it makes the pass that lower
705 // x86_amx type happy.
706 Type *LoadTy = Load.getType();
707 if (auto *BC = dyn_cast<BitCastInst>(Load.user_back())) {
708 assert(!LoadTy->isX86_AMXTy() && "Load from x86_amx* should not happen!");
709 if (BC->getType()->isX86_AMXTy())
710 return nullptr;
711 }
712
713 if (auto *CastUser = dyn_cast<CastInst>(Load.user_back())) {
714 Type *DestTy = CastUser->getDestTy();
715 if (CastUser->isNoopCast(IC.getDataLayout()) &&
716 LoadTy->isPtrOrPtrVectorTy() == DestTy->isPtrOrPtrVectorTy() &&
717 (!Load.isAtomic() || isSupportedAtomicType(DestTy))) {
718 LoadInst *NewLoad = IC.combineLoadToNewType(Load, DestTy);
719 CastUser->replaceAllUsesWith(NewLoad);
720 IC.eraseInstFromFunction(*CastUser);
721 return &Load;
722 }
723 }
724 }
725
726 // FIXME: We should also canonicalize loads of vectors when their elements are
727 // cast to other types.
728 return nullptr;
729}
730
732 // FIXME: We could probably with some care handle both volatile and atomic
733 // stores here but it isn't clear that this is important.
734 if (!LI.isSimple())
735 return nullptr;
736
737 Type *T = LI.getType();
738 if (!T->isAggregateType())
739 return nullptr;
740
741 StringRef Name = LI.getName();
742
743 if (auto *ST = dyn_cast<StructType>(T)) {
744 // If the struct only have one element, we unpack.
745 auto NumElements = ST->getNumElements();
746 if (NumElements == 1) {
747 LoadInst *NewLoad = IC.combineLoadToNewType(LI, ST->getTypeAtIndex(0U),
748 ".unpack");
749 NewLoad->setAAMetadata(LI.getAAMetadata());
750 // Copy invariant metadata from parent load.
751 NewLoad->copyMetadata(LI, LLVMContext::MD_invariant_load);
753 PoisonValue::get(T), NewLoad, 0, Name));
754 }
755
756 // We don't want to break loads with padding here as we'd loose
757 // the knowledge that padding exists for the rest of the pipeline.
758 const DataLayout &DL = IC.getDataLayout();
759 auto *SL = DL.getStructLayout(ST);
760
761 if (SL->hasPadding())
762 return nullptr;
763
764 const auto Align = LI.getAlign();
765 auto *Addr = LI.getPointerOperand();
766 auto *IdxType = DL.getIndexType(Addr->getType());
767
769 for (unsigned i = 0; i < NumElements; i++) {
770 auto *Ptr = IC.Builder.CreateInBoundsPtrAdd(
771 Addr, IC.Builder.CreateTypeSize(IdxType, SL->getElementOffset(i)),
772 Name + ".elt");
773 auto *L = IC.Builder.CreateAlignedLoad(
774 ST->getElementType(i), Ptr,
775 commonAlignment(Align, SL->getElementOffset(i).getKnownMinValue()),
776 Name + ".unpack");
777 // Propagate AA metadata. It'll still be valid on the narrowed load.
778 L->setAAMetadata(LI.getAAMetadata());
779 // Copy invariant metadata from parent load.
780 L->copyMetadata(LI, LLVMContext::MD_invariant_load);
781 V = IC.Builder.CreateInsertValue(V, L, i);
782 }
783
784 V->setName(Name);
785 return IC.replaceInstUsesWith(LI, V);
786 }
787
788 if (auto *AT = dyn_cast<ArrayType>(T)) {
789 auto *ET = AT->getElementType();
790 auto NumElements = AT->getNumElements();
791 if (NumElements == 1) {
792 LoadInst *NewLoad = IC.combineLoadToNewType(LI, ET, ".unpack");
793 NewLoad->setAAMetadata(LI.getAAMetadata());
795 PoisonValue::get(T), NewLoad, 0, Name));
796 }
797
798 // Bail out if the array is too large. Ideally we would like to optimize
799 // arrays of arbitrary size but this has a terrible impact on compile time.
800 // The threshold here is chosen arbitrarily, maybe needs a little bit of
801 // tuning.
802 if (NumElements > IC.MaxArraySizeForCombine)
803 return nullptr;
804
805 const DataLayout &DL = IC.getDataLayout();
806 TypeSize EltSize = DL.getTypeAllocSize(ET);
807 const auto Align = LI.getAlign();
808
809 auto *Addr = LI.getPointerOperand();
810 auto *IdxType = Type::getInt64Ty(T->getContext());
811 auto *Zero = ConstantInt::get(IdxType, 0);
812
815 for (uint64_t i = 0; i < NumElements; i++) {
816 Value *Indices[2] = {
817 Zero,
818 ConstantInt::get(IdxType, i),
819 };
820 auto *Ptr = IC.Builder.CreateInBoundsGEP(AT, Addr, ArrayRef(Indices),
821 Name + ".elt");
822 auto EltAlign = commonAlignment(Align, Offset.getKnownMinValue());
823 auto *L = IC.Builder.CreateAlignedLoad(AT->getElementType(), Ptr,
824 EltAlign, Name + ".unpack");
825 L->setAAMetadata(LI.getAAMetadata());
826 V = IC.Builder.CreateInsertValue(V, L, i);
827 Offset += EltSize;
828 }
829
830 V->setName(Name);
831 return IC.replaceInstUsesWith(LI, V);
832 }
833
834 return nullptr;
835}
836
837// If we can determine that all possible objects pointed to by the provided
838// pointer value are, not only dereferenceable, but also definitively less than
839// or equal to the provided maximum size, then return true. Otherwise, return
840// false (constant global values and allocas fall into this category).
841//
842// FIXME: This should probably live in ValueTracking (or similar).
844 const DataLayout &DL) {
846 SmallVector<Value *, 4> Worklist(1, V);
847
848 do {
849 Value *P = Worklist.pop_back_val();
850 P = P->stripPointerCasts();
851
852 if (!Visited.insert(P).second)
853 continue;
854
856 Worklist.push_back(SI->getTrueValue());
857 Worklist.push_back(SI->getFalseValue());
858 continue;
859 }
860
861 if (PHINode *PN = dyn_cast<PHINode>(P)) {
862 append_range(Worklist, PN->incoming_values());
863 continue;
864 }
865
867 if (GA->isInterposable())
868 return false;
869 Worklist.push_back(GA->getAliasee());
870 continue;
871 }
872
873 // If we know how big this object is, and it is less than MaxSize, continue
874 // searching. Otherwise, return false.
875 if (AllocaInst *AI = dyn_cast<AllocaInst>(P)) {
876 std::optional<TypeSize> AllocSize = AI->getAllocationSize(DL);
877 if (!AllocSize || AllocSize->isScalable() ||
878 AllocSize->getFixedValue() > MaxSize)
879 return false;
880 continue;
881 }
882
884 if (!GV->hasDefinitiveInitializer() || !GV->isConstant())
885 return false;
886
887 uint64_t InitSize = GV->getGlobalSize(DL);
888 if (InitSize > MaxSize)
889 return false;
890 continue;
891 }
892
893 return false;
894 } while (!Worklist.empty());
895
896 return true;
897}
898
899// If we're indexing into an object of a known size, and the outer index is
900// not a constant, but having any value but zero would lead to undefined
901// behavior, replace it with zero.
902//
903// For example, if we have:
904// @f.a = private unnamed_addr constant [1 x i32] [i32 12], align 4
905// ...
906// %arrayidx = getelementptr inbounds [1 x i32]* @f.a, i64 0, i64 %x
907// ... = load i32* %arrayidx, align 4
908// Then we know that we can replace %x in the GEP with i64 0.
909//
910// FIXME: We could fold any GEP index to zero that would cause UB if it were
911// not zero. Currently, we only handle the first such index. Also, we could
912// also search through non-zero constant indices if we kept track of the
913// offsets those indices implied.
915 GetElementPtrInst *GEPI, Instruction *MemI,
916 unsigned &Idx) {
917 if (GEPI->getNumOperands() < 2)
918 return false;
919
920 // Find the first non-zero index of a GEP. If all indices are zero, return
921 // one past the last index.
922 auto FirstNZIdx = [](const GetElementPtrInst *GEPI) {
923 unsigned I = 1;
924 for (unsigned IE = GEPI->getNumOperands(); I != IE; ++I) {
925 Value *V = GEPI->getOperand(I);
926 if (const ConstantInt *CI = dyn_cast<ConstantInt>(V))
927 if (CI->isZero())
928 continue;
929
930 break;
931 }
932
933 return I;
934 };
935
936 // Skip through initial 'zero' indices, and find the corresponding pointer
937 // type. See if the next index is not a constant.
938 Idx = FirstNZIdx(GEPI);
939 if (Idx == GEPI->getNumOperands())
940 return false;
941 if (isa<Constant>(GEPI->getOperand(Idx)))
942 return false;
943
944 SmallVector<Value *, 4> Ops(GEPI->idx_begin(), GEPI->idx_begin() + Idx);
945 Type *SourceElementType = GEPI->getSourceElementType();
946 // Size information about scalable vectors is not available, so we cannot
947 // deduce whether indexing at n is undefined behaviour or not. Bail out.
948 if (SourceElementType->isScalableTy())
949 return false;
950
951 Type *AllocTy = GetElementPtrInst::getIndexedType(SourceElementType, Ops);
952 if (!AllocTy || !AllocTy->isSized())
953 return false;
954 const DataLayout &DL = IC.getDataLayout();
955 uint64_t TyAllocSize = DL.getTypeAllocSize(AllocTy).getFixedValue();
956
957 // If there are more indices after the one we might replace with a zero, make
958 // sure they're all non-negative. If any of them are negative, the overall
959 // address being computed might be before the base address determined by the
960 // first non-zero index.
961 auto IsAllNonNegative = [&]() {
962 for (unsigned i = Idx+1, e = GEPI->getNumOperands(); i != e; ++i) {
963 KnownBits Known = IC.computeKnownBits(GEPI->getOperand(i), MemI);
964 if (Known.isNonNegative())
965 continue;
966 return false;
967 }
968
969 return true;
970 };
971
972 // FIXME: If the GEP is not inbounds, and there are extra indices after the
973 // one we'll replace, those could cause the address computation to wrap
974 // (rendering the IsAllNonNegative() check below insufficient). We can do
975 // better, ignoring zero indices (and other indices we can prove small
976 // enough not to wrap).
977 if (Idx+1 != GEPI->getNumOperands() && !GEPI->isInBounds())
978 return false;
979
980 // Note that isObjectSizeLessThanOrEq will return true only if the pointer is
981 // also known to be dereferenceable.
982 return isObjectSizeLessThanOrEq(GEPI->getOperand(0), TyAllocSize, DL) &&
983 IsAllNonNegative();
984}
985
986// If we're indexing into an object with a variable index for the memory
987// access, but the object has only one element, we can assume that the index
988// will always be zero. If we replace the GEP, return it.
990 Instruction &MemI) {
992 unsigned Idx;
993 if (canReplaceGEPIdxWithZero(IC, GEPI, &MemI, Idx)) {
994 Instruction *NewGEPI = GEPI->clone();
995 NewGEPI->setOperand(Idx,
996 ConstantInt::get(GEPI->getOperand(Idx)->getType(), 0));
997 IC.InsertNewInstBefore(NewGEPI, GEPI->getIterator());
998 // If the memory instruction is guaranteed to execute whenever the GEP
999 // does, the dereference proves the index is unconditionally zero.
1000 // Replace the GEP for all users so they all benefit.
1001 if (GEPI->getParent() == MemI.getParent() &&
1003 MemI.getIterator())) {
1004 IC.replaceInstUsesWith(*GEPI, NewGEPI);
1005 IC.eraseInstFromFunction(*GEPI);
1006 }
1007 return NewGEPI;
1008 }
1009 }
1010
1011 return nullptr;
1012}
1013
1015 if (NullPointerIsDefined(SI.getFunction(), SI.getPointerAddressSpace()))
1016 return false;
1017
1018 auto *Ptr = SI.getPointerOperand();
1020 Ptr = GEPI->getOperand(0);
1021 return (isa<ConstantPointerNull>(Ptr) &&
1022 !NullPointerIsDefined(SI.getFunction(), SI.getPointerAddressSpace()));
1023}
1024
1027 const Value *GEPI0 = GEPI->getOperand(0);
1028 if (isa<ConstantPointerNull>(GEPI0) &&
1029 !NullPointerIsDefined(LI.getFunction(), GEPI->getPointerAddressSpace()))
1030 return true;
1031 }
1032 if (isa<UndefValue>(Op) ||
1035 return true;
1036 return false;
1037}
1038
1039Value *InstCombinerImpl::simplifyNonNullOperand(Value *V,
1040 bool HasDereferenceable,
1041 unsigned Depth) {
1042 if (auto *Sel = dyn_cast<SelectInst>(V)) {
1043 if (isa<ConstantPointerNull>(Sel->getOperand(1)))
1044 return Sel->getOperand(2);
1045
1046 if (isa<ConstantPointerNull>(Sel->getOperand(2)))
1047 return Sel->getOperand(1);
1048 }
1049
1050 if (!V->hasOneUse())
1051 return nullptr;
1052
1053 constexpr unsigned RecursionLimit = 3;
1054 if (Depth == RecursionLimit)
1055 return nullptr;
1056
1057 if (auto *GEP = dyn_cast<GetElementPtrInst>(V)) {
1058 if (HasDereferenceable || GEP->isInBounds()) {
1059 if (auto *Res = simplifyNonNullOperand(GEP->getPointerOperand(),
1060 HasDereferenceable, Depth + 1)) {
1061 replaceOperand(*GEP, 0, Res);
1063 return nullptr;
1064 }
1065 }
1066 }
1067
1068 if (auto *PHI = dyn_cast<PHINode>(V)) {
1069 bool Changed = false;
1070 for (Use &U : PHI->incoming_values()) {
1071 // We set Depth to RecursionLimit to avoid expensive recursion.
1072 if (auto *Res = simplifyNonNullOperand(U.get(), HasDereferenceable,
1073 RecursionLimit)) {
1074 replaceUse(U, Res);
1075 Changed = true;
1076 }
1077 }
1078 if (Changed)
1080 return nullptr;
1081 }
1082
1083 return nullptr;
1084}
1085
1087 Value *Op = LI.getOperand(0);
1088 if (Value *Res = simplifyLoadInst(&LI, Op, SQ.getWithInstruction(&LI)))
1089 return replaceInstUsesWith(LI, Res);
1090
1091 // Try to canonicalize the loaded type.
1092 if (Instruction *Res = combineLoadToOperationType(*this, LI))
1093 return Res;
1094
1095 // Replace GEP indices if possible.
1096 if (Instruction *NewGEPI = replaceGEPIdxWithZero(*this, Op, LI))
1097 return replaceOperand(LI, 0, NewGEPI);
1098
1099 if (Instruction *Res = unpackLoadToAggregate(*this, LI))
1100 return Res;
1101
1102 // Do really simple store-to-load forwarding and load CSE, to catch cases
1103 // where there are several consecutive memory accesses to the same location,
1104 // separated by a few arithmetic operations.
1105 bool IsLoadCSE = false;
1106 BatchAAResults BatchAA(*AA);
1107 if (Value *AvailableVal = FindAvailableLoadedValue(&LI, BatchAA, &IsLoadCSE)) {
1108 if (IsLoadCSE)
1109 combineMetadataForCSE(cast<LoadInst>(AvailableVal), &LI, false);
1110
1111 return replaceInstUsesWith(
1112 LI, Builder.CreateBitOrPointerCast(AvailableVal, LI.getType(),
1113 LI.getName() + ".cast"));
1114 }
1115
1116 // None of the following transforms are legal for volatile/ordered atomic
1117 // loads. Most of them do apply for unordered atomics.
1118 if (!LI.isUnordered()) return nullptr;
1119
1120 // load(gep null, ...) -> unreachable
1121 // load null/undef -> unreachable
1122 // TODO: Consider a target hook for valid address spaces for this xforms.
1123 if (canSimplifyNullLoadOrGEP(LI, Op)) {
1126 }
1127
1128 if (Op->hasOneUse()) {
1129 // Change select and PHI nodes to select values instead of addresses: this
1130 // helps alias analysis out a lot, allows many others simplifications, and
1131 // exposes redundancy in the code.
1132 //
1133 // Note that we cannot do the transformation unless we know that the
1134 // introduced loads cannot trap! Something like this is valid as long as
1135 // the condition is always false: load (select bool %C, int* null, int* %G),
1136 // but it would not be valid if we transformed it to load from null
1137 // unconditionally.
1138 //
1139
1141 Value *SelectOp = Op;
1142 if (ASC && ASC->getOperand(0)->hasOneUse())
1143 SelectOp = ASC->getOperand(0);
1144 if (SelectInst *SI = dyn_cast<SelectInst>(SelectOp)) {
1145 // load (select (Cond, &V1, &V2)) --> select(Cond, load &V1, load &V2).
1146 // or
1147 // load (addrspacecast(select (Cond, &V1, &V2))) -->
1148 // select(Cond, load (addrspacecast(&V1)), load (addrspacecast(&V2))).
1149 Align Alignment = LI.getAlign();
1150 if (isSafeToLoadUnconditionally(SI->getOperand(1), LI.getType(),
1151 Alignment, DL, SI) &&
1152 isSafeToLoadUnconditionally(SI->getOperand(2), LI.getType(),
1153 Alignment, DL, SI)) {
1154
1155 auto MaybeCastedLoadOperand = [&](Value *Op) {
1156 if (ASC)
1157 return Builder.CreateAddrSpaceCast(Op, ASC->getType(),
1158 Op->getName() + ".cast");
1159 return Op;
1160 };
1161 Value *LoadOp1 = MaybeCastedLoadOperand(SI->getOperand(1));
1162 LoadInst *V1 = Builder.CreateLoad(LI.getType(), LoadOp1,
1163 LoadOp1->getName() + ".val");
1164
1165 Value *LoadOp2 = MaybeCastedLoadOperand(SI->getOperand(2));
1166 LoadInst *V2 = Builder.CreateLoad(LI.getType(), LoadOp2,
1167 LoadOp2->getName() + ".val");
1168 assert(LI.isUnordered() && "implied by above");
1169 V1->setAlignment(Alignment);
1170 V1->setAtomic(LI.getOrdering(), LI.getSyncScopeID());
1171 V2->setAlignment(Alignment);
1172 V2->setAtomic(LI.getOrdering(), LI.getSyncScopeID());
1173 // It is safe to copy any metadata that does not trigger UB. Copy any
1174 // poison-generating metadata.
1177 return SelectInst::Create(SI->getCondition(), V1, V2, "", nullptr,
1178 ProfcheckDisableMetadataFixes ? nullptr : SI);
1179 }
1180 }
1181 }
1182
1184 if (Value *V = simplifyNonNullOperand(Op, /*HasDereferenceable=*/true))
1185 return replaceOperand(LI, 0, V);
1186
1187 // load(llvm.protected.field.ptr(ptr)) -> llvm.ptrauth.auth(load(ptr))
1188 if (isa<PointerType>(LI.getType())) {
1189 if (auto *II = dyn_cast<IntrinsicInst>(Op)) {
1190 if (II->getIntrinsicID() == Intrinsic::protected_field_ptr) {
1191 std::vector<OperandBundleDef> DSBundle;
1192 if (auto Bundle =
1193 II->getOperandBundle(LLVMContext::OB_deactivation_symbol))
1194 DSBundle.push_back(OperandBundleDef(
1195 "deactivation-symbol", cast<GlobalValue>(Bundle->Inputs[0])));
1196
1198 Builder.SetInsertPoint(&LI);
1199
1200 auto *NewLI = cast<LoadInst>(LI.clone());
1201 NewLI->setOperand(0, II->getOperand(0));
1202 Builder.Insert(NewLI);
1203
1205 F.getParent(), Intrinsic::ptrauth_auth, {});
1206 auto *LIInt = Builder.CreatePtrToInt(NewLI, Builder.getInt64Ty());
1207 Value *Auth = Builder.CreateCall(
1208 AuthIntr,
1209 {LIInt, Builder.getInt32(/*AArch64PACKey::DA*/ 2),
1210 II->getOperand(1)},
1211 DSBundle);
1212 Auth = Builder.CreateIntToPtr(Auth, Builder.getPtrTy());
1213 return replaceInstUsesWith(LI, Auth);
1214 }
1215 }
1216 }
1217
1218 return nullptr;
1219}
1220
1221/// Look for extractelement/insertvalue sequence that acts like a bitcast.
1222///
1223/// \returns underlying value that was "cast", or nullptr otherwise.
1224///
1225/// For example, if we have:
1226///
1227/// %E0 = extractelement <2 x double> %U, i32 0
1228/// %V0 = insertvalue [2 x double] undef, double %E0, 0
1229/// %E1 = extractelement <2 x double> %U, i32 1
1230/// %V1 = insertvalue [2 x double] %V0, double %E1, 1
1231///
1232/// and the layout of a <2 x double> is isomorphic to a [2 x double],
1233/// then %V1 can be safely approximated by a conceptual "bitcast" of %U.
1234/// Note that %U may contain non-undef values where %V1 has undef.
1236 Value *U = nullptr;
1237 while (auto *IV = dyn_cast<InsertValueInst>(V)) {
1238 auto *E = dyn_cast<ExtractElementInst>(IV->getInsertedValueOperand());
1239 if (!E)
1240 return nullptr;
1241 auto *W = E->getVectorOperand();
1242 if (!U)
1243 U = W;
1244 else if (U != W)
1245 return nullptr;
1246 auto *CI = dyn_cast<ConstantInt>(E->getIndexOperand());
1247 if (!CI || IV->getNumIndices() != 1 || CI->getZExtValue() != *IV->idx_begin())
1248 return nullptr;
1249 V = IV->getAggregateOperand();
1250 }
1251 if (!match(V, m_Undef()) || !U)
1252 return nullptr;
1253
1254 auto *UT = cast<VectorType>(U->getType());
1255 auto *VT = V->getType();
1256 // Check that types UT and VT are bitwise isomorphic.
1257 const auto &DL = IC.getDataLayout();
1258 if (DL.getTypeStoreSizeInBits(UT) != DL.getTypeStoreSizeInBits(VT)) {
1259 return nullptr;
1260 }
1261 if (auto *AT = dyn_cast<ArrayType>(VT)) {
1262 if (AT->getNumElements() != cast<FixedVectorType>(UT)->getNumElements())
1263 return nullptr;
1264 } else {
1265 auto *ST = cast<StructType>(VT);
1266 if (ST->getNumElements() != cast<FixedVectorType>(UT)->getNumElements())
1267 return nullptr;
1268 for (const auto *EltT : ST->elements()) {
1269 if (EltT != UT->getElementType())
1270 return nullptr;
1271 }
1272 }
1273 return U;
1274}
1275
1276/// Combine stores to match the type of value being stored.
1277///
1278/// The core idea here is that the memory does not have any intrinsic type and
1279/// where we can we should match the type of a store to the type of value being
1280/// stored.
1281///
1282/// However, this routine must never change the width of a store or the number of
1283/// stores as that would introduce a semantic change. This combine is expected to
1284/// be a semantic no-op which just allows stores to more closely model the types
1285/// of their incoming values.
1286///
1287/// Currently, we also refuse to change the precise type used for an atomic or
1288/// volatile store. This is debatable, and might be reasonable to change later.
1289/// However, it is risky in case some backend or other part of LLVM is relying
1290/// on the exact type stored to select appropriate atomic operations.
1291///
1292/// \returns true if the store was successfully combined away. This indicates
1293/// the caller must erase the store instruction. We have to let the caller erase
1294/// the store instruction as otherwise there is no way to signal whether it was
1295/// combined or not: IC.EraseInstFromFunction returns a null pointer.
1297 // FIXME: We could probably with some care handle both volatile and ordered
1298 // atomic stores here but it isn't clear that this is important.
1299 if (!SI.isUnordered())
1300 return false;
1301
1302 // swifterror values can't be bitcasted.
1303 if (SI.getPointerOperand()->isSwiftError())
1304 return false;
1305
1306 Value *V = SI.getValueOperand();
1307
1308 // Fold away bit casts of the stored value by storing the original type.
1309 if (auto *BC = dyn_cast<BitCastInst>(V)) {
1310 assert(!BC->getType()->isX86_AMXTy() &&
1311 "store to x86_amx* should not happen!");
1312 V = BC->getOperand(0);
1313 // Don't transform when the type is x86_amx, it makes the pass that lower
1314 // x86_amx type happy.
1315 if (V->getType()->isX86_AMXTy())
1316 return false;
1317 if (!SI.isAtomic() || isSupportedAtomicType(V->getType())) {
1318 combineStoreToNewValue(IC, SI, V);
1319 return true;
1320 }
1321 }
1322
1323 if (Value *U = likeBitCastFromVector(IC, V))
1324 if (!SI.isAtomic() || isSupportedAtomicType(U->getType())) {
1325 combineStoreToNewValue(IC, SI, U);
1326 return true;
1327 }
1328
1329 // FIXME: We should also canonicalize stores of vectors when their elements
1330 // are cast to other types.
1331 return false;
1332}
1333
1335 // FIXME: We could probably with some care handle both volatile and atomic
1336 // stores here but it isn't clear that this is important.
1337 if (!SI.isSimple())
1338 return false;
1339
1340 Value *V = SI.getValueOperand();
1341 Type *T = V->getType();
1342
1343 if (!T->isAggregateType())
1344 return false;
1345
1346 if (auto *ST = dyn_cast<StructType>(T)) {
1347 // If the struct only have one element, we unpack.
1348 unsigned Count = ST->getNumElements();
1349 if (Count == 1) {
1350 V = IC.Builder.CreateExtractValue(V, 0);
1351 combineStoreToNewValue(IC, SI, V);
1352 return true;
1353 }
1354
1355 // We don't want to break loads with padding here as we'd loose
1356 // the knowledge that padding exists for the rest of the pipeline.
1357 const DataLayout &DL = IC.getDataLayout();
1358 auto *SL = DL.getStructLayout(ST);
1359
1360 if (SL->hasPadding())
1361 return false;
1362
1363 const auto Align = SI.getAlign();
1364
1365 SmallString<16> EltName = V->getName();
1366 EltName += ".elt";
1367 auto *Addr = SI.getPointerOperand();
1368 SmallString<16> AddrName = Addr->getName();
1369 AddrName += ".repack";
1370
1371 auto *IdxType = DL.getIndexType(Addr->getType());
1372 for (unsigned i = 0; i < Count; i++) {
1373 auto *Ptr = IC.Builder.CreateInBoundsPtrAdd(
1374 Addr, IC.Builder.CreateTypeSize(IdxType, SL->getElementOffset(i)),
1375 AddrName);
1376 auto *Val = IC.Builder.CreateExtractValue(V, i, EltName);
1377 auto EltAlign =
1378 commonAlignment(Align, SL->getElementOffset(i).getKnownMinValue());
1379 llvm::Instruction *NS = IC.Builder.CreateAlignedStore(Val, Ptr, EltAlign);
1380 NS->setAAMetadata(SI.getAAMetadata());
1381 }
1382
1383 return true;
1384 }
1385
1386 if (auto *AT = dyn_cast<ArrayType>(T)) {
1387 // If the array only have one element, we unpack.
1388 auto NumElements = AT->getNumElements();
1389 if (NumElements == 1) {
1390 V = IC.Builder.CreateExtractValue(V, 0);
1391 combineStoreToNewValue(IC, SI, V);
1392 return true;
1393 }
1394
1395 // Bail out if the array is too large. Ideally we would like to optimize
1396 // arrays of arbitrary size but this has a terrible impact on compile time.
1397 // The threshold here is chosen arbitrarily, maybe needs a little bit of
1398 // tuning.
1399 if (NumElements > IC.MaxArraySizeForCombine)
1400 return false;
1401
1402 const DataLayout &DL = IC.getDataLayout();
1403 TypeSize EltSize = DL.getTypeAllocSize(AT->getElementType());
1404 const auto Align = SI.getAlign();
1405
1406 SmallString<16> EltName = V->getName();
1407 EltName += ".elt";
1408 auto *Addr = SI.getPointerOperand();
1409 SmallString<16> AddrName = Addr->getName();
1410 AddrName += ".repack";
1411
1412 auto *IdxType = Type::getInt64Ty(T->getContext());
1413 auto *Zero = ConstantInt::get(IdxType, 0);
1414
1416 for (uint64_t i = 0; i < NumElements; i++) {
1417 Value *Indices[2] = {
1418 Zero,
1419 ConstantInt::get(IdxType, i),
1420 };
1421 auto *Ptr =
1422 IC.Builder.CreateInBoundsGEP(AT, Addr, ArrayRef(Indices), AddrName);
1423 auto *Val = IC.Builder.CreateExtractValue(V, i, EltName);
1424 auto EltAlign = commonAlignment(Align, Offset.getKnownMinValue());
1425 Instruction *NS = IC.Builder.CreateAlignedStore(Val, Ptr, EltAlign);
1426 NS->setAAMetadata(SI.getAAMetadata());
1427 Offset += EltSize;
1428 }
1429
1430 return true;
1431 }
1432
1433 return false;
1434}
1435
1436/// equivalentAddressValues - Test if A and B will obviously have the same
1437/// value. This includes recognizing that %t0 and %t1 will have the same
1438/// value in code like this:
1439/// %t0 = getelementptr \@a, 0, 3
1440/// store i32 0, i32* %t0
1441/// %t1 = getelementptr \@a, 0, 3
1442/// %t2 = load i32* %t1
1443///
1445 // Test if the values are trivially equivalent.
1446 if (A == B) return true;
1447
1448 // Test if the values come form identical arithmetic instructions.
1449 // This uses isIdenticalToWhenDefined instead of isIdenticalTo because
1450 // its only used to compare two uses within the same basic block, which
1451 // means that they'll always either have the same value or one of them
1452 // will have an undefined value.
1453 if (isa<BinaryOperator>(A) ||
1454 isa<CastInst>(A) ||
1455 isa<PHINode>(A) ||
1458 if (cast<Instruction>(A)->isIdenticalToWhenDefined(BI))
1459 return true;
1460
1461 // Otherwise they may not be equivalent.
1462 return false;
1463}
1464
1466 Value *Val = SI.getOperand(0);
1467 Value *Ptr = SI.getOperand(1);
1468
1469 // Try to canonicalize the stored type.
1470 if (combineStoreToValueType(*this, SI))
1471 return eraseInstFromFunction(SI);
1472
1473 // Try to canonicalize the stored type.
1474 if (unpackStoreToAggregate(*this, SI))
1475 return eraseInstFromFunction(SI);
1476
1477 // Replace GEP indices if possible.
1478 if (Instruction *NewGEPI = replaceGEPIdxWithZero(*this, Ptr, SI))
1479 return replaceOperand(SI, 1, NewGEPI);
1480
1481 // Don't hack volatile/ordered stores.
1482 // FIXME: Some bits are legal for ordered atomic stores; needs refactoring.
1483 if (!SI.isUnordered()) return nullptr;
1484
1485 // If the RHS is an alloca with a single use, zapify the store, making the
1486 // alloca dead.
1487 if (Ptr->hasOneUse()) {
1488 if (isa<AllocaInst>(Ptr))
1489 return eraseInstFromFunction(SI);
1491 if (isa<AllocaInst>(GEP->getOperand(0))) {
1492 if (GEP->getOperand(0)->hasOneUse())
1493 return eraseInstFromFunction(SI);
1494 }
1495 }
1496 }
1497
1498 // If we have a store to a location which is known constant, we can conclude
1499 // that the store must be storing the constant value (else the memory
1500 // wouldn't be constant), and this must be a noop.
1501 if (!isModSet(AA->getModRefInfoMask(Ptr)))
1502 return eraseInstFromFunction(SI);
1503
1504 // Do really simple DSE, to catch cases where there are several consecutive
1505 // stores to the same location, separated by a few arithmetic operations. This
1506 // situation often occurs with bitfield accesses.
1508 for (unsigned ScanInsts = 6; BBI != SI.getParent()->begin() && ScanInsts;
1509 --ScanInsts) {
1510 --BBI;
1511 // Don't count debug info directives, lest they affect codegen,
1512 // and we skip pointer-to-pointer bitcasts, which are NOPs.
1513 if (BBI->isDebugOrPseudoInst()) {
1514 ScanInsts++;
1515 continue;
1516 }
1517
1518 if (StoreInst *PrevSI = dyn_cast<StoreInst>(BBI)) {
1519 // Prev store isn't volatile, and stores to the same location?
1520 if (PrevSI->isUnordered() &&
1521 equivalentAddressValues(PrevSI->getOperand(1), SI.getOperand(1)) &&
1522 PrevSI->getValueOperand()->getType() ==
1523 SI.getValueOperand()->getType()) {
1524 ++NumDeadStore;
1525 // Manually add back the original store to the worklist now, so it will
1526 // be processed after the operands of the removed store, as this may
1527 // expose additional DSE opportunities.
1528 Worklist.push(&SI);
1529 eraseInstFromFunction(*PrevSI);
1530 return nullptr;
1531 }
1532 break;
1533 }
1534
1535 // If this is a load, we have to stop. However, if the loaded value is from
1536 // the pointer we're loading and is producing the pointer we're storing,
1537 // then *this* store is dead (X = load P; store X -> P).
1538 if (LoadInst *LI = dyn_cast<LoadInst>(BBI)) {
1539 if (LI == Val && equivalentAddressValues(LI->getOperand(0), Ptr)) {
1540 assert(SI.isUnordered() && "can't eliminate ordering operation");
1541 return eraseInstFromFunction(SI);
1542 }
1543
1544 // Otherwise, this is a load from some other location. Stores before it
1545 // may not be dead.
1546 break;
1547 }
1548
1549 // Don't skip over loads, throws or things that can modify memory.
1550 if (BBI->mayWriteToMemory() || BBI->mayReadFromMemory() || BBI->mayThrow())
1551 break;
1552 }
1553
1554 // store X, null -> turns into 'unreachable' in SimplifyCFG
1555 // store X, GEP(null, Y) -> turns into 'unreachable' in SimplifyCFG
1557 if (!isa<PoisonValue>(Val))
1558 return replaceOperand(SI, 0, PoisonValue::get(Val->getType()));
1559 return nullptr; // Do not modify these!
1560 }
1561
1562 // This is a non-terminator unreachable marker. Don't remove it.
1563 if (isa<UndefValue>(Ptr)) {
1564 // Remove guaranteed-to-transfer instructions before the marker.
1566
1567 // Remove all instructions after the marker and handle dead blocks this
1568 // implies.
1570 handleUnreachableFrom(SI.getNextNode(), Worklist);
1572 return nullptr;
1573 }
1574
1575 // store undef, Ptr -> noop
1576 // FIXME: This is technically incorrect because it might overwrite a poison
1577 // value. Change to PoisonValue once #52930 is resolved.
1578 if (isa<UndefValue>(Val))
1579 return eraseInstFromFunction(SI);
1580
1581 if (!NullPointerIsDefined(SI.getFunction(), SI.getPointerAddressSpace()))
1582 if (Value *V = simplifyNonNullOperand(Ptr, /*HasDereferenceable=*/true))
1583 return replaceOperand(SI, 1, V);
1584
1585 // store(ptr1, llvm.protected.field.ptr(ptr2)) ->
1586 // store(llvm.ptrauth.sign(ptr1), ptr2)
1587 if (isa<PointerType>(Val->getType())) {
1588 if (auto *II = dyn_cast<IntrinsicInst>(Ptr)) {
1589 if (II->getIntrinsicID() == Intrinsic::protected_field_ptr) {
1590 std::vector<OperandBundleDef> DSBundle;
1591 if (auto Bundle =
1592 II->getOperandBundle(LLVMContext::OB_deactivation_symbol))
1593 DSBundle.push_back(OperandBundleDef(
1594 "deactivation-symbol", cast<GlobalValue>(Bundle->Inputs[0])));
1595
1597 Builder.SetInsertPoint(&SI);
1598
1600 F.getParent(), Intrinsic::ptrauth_sign, {});
1601 auto *ValInt = Builder.CreatePtrToInt(Val, Builder.getInt64Ty());
1602 Value *Sign = Builder.CreateCall(
1603 SignIntr,
1604 {ValInt, Builder.getInt32(/*AArch64PACKey::DA*/ 2),
1605 II->getOperand(1)},
1606 DSBundle);
1607 Sign = Builder.CreateIntToPtr(Sign, Builder.getPtrTy());
1608
1609 replaceOperand(SI, 0, Sign);
1610 replaceOperand(SI, 1, II->getOperand(0));
1611 return &SI;
1612 }
1613 }
1614 }
1615
1616 return nullptr;
1617}
1618
1619/// Try to transform:
1620/// if () { *P = v1; } else { *P = v2 }
1621/// or:
1622/// *P = v1; if () { *P = v2; }
1623/// into a phi node with a store in the successor.
1625 if (!SI.isUnordered())
1626 return false; // This code has not been audited for volatile/ordered case.
1627
1628 // Check if the successor block has exactly 2 incoming edges.
1629 BasicBlock *StoreBB = SI.getParent();
1630 BasicBlock *DestBB = StoreBB->getTerminator()->getSuccessor(0);
1631 if (!DestBB->hasNPredecessors(2))
1632 return false;
1633
1634 // Capture the other block (the block that doesn't contain our store).
1635 pred_iterator PredIter = pred_begin(DestBB);
1636 if (*PredIter == StoreBB)
1637 ++PredIter;
1638 BasicBlock *OtherBB = *PredIter;
1639
1640 // Bail out if all of the relevant blocks aren't distinct. This can happen,
1641 // for example, if SI is in an infinite loop.
1642 if (StoreBB == DestBB || OtherBB == DestBB)
1643 return false;
1644
1645 // Verify that the other block is not empty apart from the terminator.
1646 BasicBlock::iterator BBI(OtherBB->getTerminator());
1647 if (BBI == OtherBB->begin())
1648 return false;
1649
1650 auto OtherStoreIsMergeable = [&](StoreInst *OtherStore) -> bool {
1651 if (!OtherStore ||
1652 OtherStore->getPointerOperand() != SI.getPointerOperand())
1653 return false;
1654
1655 auto *SIVTy = SI.getValueOperand()->getType();
1656 auto *OSVTy = OtherStore->getValueOperand()->getType();
1657 return CastInst::isBitOrNoopPointerCastable(OSVTy, SIVTy, DL) &&
1658 SI.hasSameSpecialState(OtherStore);
1659 };
1660
1661 // If the other block ends in an unconditional branch, check for the 'if then
1662 // else' case. There is an instruction before the branch.
1663 StoreInst *OtherStore = nullptr;
1664 if (isa<UncondBrInst>(BBI)) {
1665 --BBI;
1666 // Skip over debugging info and pseudo probes.
1667 while (BBI->isDebugOrPseudoInst()) {
1668 if (BBI==OtherBB->begin())
1669 return false;
1670 --BBI;
1671 }
1672 // If this isn't a store, isn't a store to the same location, or is not the
1673 // right kind of store, bail out.
1674 OtherStore = dyn_cast<StoreInst>(BBI);
1675 if (!OtherStoreIsMergeable(OtherStore))
1676 return false;
1677 } else if (auto *OtherBr = dyn_cast<CondBrInst>(BBI)) {
1678 // Otherwise, the other block ended with a conditional branch. If one of the
1679 // destinations is StoreBB, then we have the if/then case.
1680 if (OtherBr->getSuccessor(0) != StoreBB &&
1681 OtherBr->getSuccessor(1) != StoreBB)
1682 return false;
1683
1684 // Okay, we know that OtherBr now goes to Dest and StoreBB, so this is an
1685 // if/then triangle. See if there is a store to the same ptr as SI that
1686 // lives in OtherBB.
1687 for (;; --BBI) {
1688 // Check to see if we find the matching store.
1689 OtherStore = dyn_cast<StoreInst>(BBI);
1690 if (OtherStoreIsMergeable(OtherStore))
1691 break;
1692
1693 // If we find something that may be using or overwriting the stored
1694 // value, or if we run out of instructions, we can't do the transform.
1695 if (BBI->mayReadFromMemory() || BBI->mayThrow() ||
1696 BBI->mayWriteToMemory() || BBI == OtherBB->begin())
1697 return false;
1698 }
1699
1700 // In order to eliminate the store in OtherBr, we have to make sure nothing
1701 // reads or overwrites the stored value in StoreBB.
1702 for (BasicBlock::iterator I = StoreBB->begin(); &*I != &SI; ++I) {
1703 // FIXME: This should really be AA driven.
1704 if (I->mayReadFromMemory() || I->mayThrow() || I->mayWriteToMemory())
1705 return false;
1706 }
1707 } else
1708 return false;
1709
1710 // Insert a PHI node now if we need it.
1711 Value *MergedVal = OtherStore->getValueOperand();
1712 // The debug locations of the original instructions might differ. Merge them.
1713 DebugLoc MergedLoc =
1714 DebugLoc::getMergedLocation(SI.getDebugLoc(), OtherStore->getDebugLoc());
1715 if (MergedVal != SI.getValueOperand()) {
1716 PHINode *PN =
1717 PHINode::Create(SI.getValueOperand()->getType(), 2, "storemerge");
1718 PN->addIncoming(SI.getValueOperand(), SI.getParent());
1719 Builder.SetInsertPoint(OtherStore);
1720 PN->addIncoming(Builder.CreateBitOrPointerCast(MergedVal, PN->getType()),
1721 OtherBB);
1722 MergedVal = InsertNewInstBefore(PN, DestBB->begin());
1723 PN->setDebugLoc(MergedLoc);
1724 }
1725
1726 // Advance to a place where it is safe to insert the new store and insert it.
1727 BBI = DestBB->getFirstInsertionPt();
1728 StoreInst *NewSI =
1729 new StoreInst(MergedVal, SI.getOperand(1), SI.isVolatile(), SI.getAlign(),
1730 SI.getOrdering(), SI.getSyncScopeID());
1731 InsertNewInstBefore(NewSI, BBI);
1732 NewSI->setDebugLoc(MergedLoc);
1733 NewSI->mergeDIAssignID({&SI, OtherStore});
1734
1735 // If the two stores had AA tags, merge them.
1736 AAMDNodes AATags = SI.getAAMetadata();
1737 if (AATags)
1738 NewSI->setAAMetadata(AATags.merge(OtherStore->getAAMetadata()));
1739
1740 // Nuke the old stores.
1742 eraseInstFromFunction(*OtherStore);
1743 return true;
1744}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Rewrite undef for PHI
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static void addToWorklist(Instruction &I, SmallVector< Instruction *, 4 > &Worklist)
Hexagon Common GEP
IRTranslator LLVM IR MI
This file provides internal interfaces used to implement the InstCombine.
static StoreInst * combineStoreToNewValue(InstCombinerImpl &IC, StoreInst &SI, Value *V)
Combine a store to a new type.
static Instruction * combineLoadToOperationType(InstCombinerImpl &IC, LoadInst &Load)
Combine loads to match the type of their uses' value after looking through intervening bitcasts.
static Instruction * replaceGEPIdxWithZero(InstCombinerImpl &IC, Value *Ptr, Instruction &MemI)
static Instruction * simplifyAllocaArraySize(InstCombinerImpl &IC, AllocaInst &AI, DominatorTree &DT)
static bool canSimplifyNullStoreOrGEP(StoreInst &SI)
static bool equivalentAddressValues(Value *A, Value *B)
equivalentAddressValues - Test if A and B will obviously have the same value.
static bool canReplaceGEPIdxWithZero(InstCombinerImpl &IC, GetElementPtrInst *GEPI, Instruction *MemI, unsigned &Idx)
static bool canSimplifyNullLoadOrGEP(LoadInst &LI, Value *Op)
static bool isSupportedAtomicType(Type *Ty)
static bool isDereferenceableForAllocaSize(const Value *V, const AllocaInst *AI, const DataLayout &DL)
Returns true if V is dereferenceable for size of alloca.
static Instruction * unpackLoadToAggregate(InstCombinerImpl &IC, LoadInst &LI)
static cl::opt< unsigned > MaxCopiedFromConstantUsers("instcombine-max-copied-from-constant-users", cl::init(300), cl::desc("Maximum users to visit in copy from constant transform"), cl::Hidden)
static bool combineStoreToValueType(InstCombinerImpl &IC, StoreInst &SI)
Combine stores to match the type of value being stored.
static bool unpackStoreToAggregate(InstCombinerImpl &IC, StoreInst &SI)
static Value * likeBitCastFromVector(InstCombinerImpl &IC, Value *V)
Look for extractelement/insertvalue sequence that acts like a bitcast.
static bool isOnlyCopiedFromConstantMemory(AAResults *AA, AllocaInst *V, MemTransferInst *&TheCopy, SmallVectorImpl< Instruction * > &ToDelete)
isOnlyCopiedFromConstantMemory - Recursively walk the uses of a (derived) pointer to an alloca.
static bool isObjectSizeLessThanOrEq(Value *V, uint64_t MaxSize, const DataLayout &DL)
This file provides the interface for the instcombine pass implementation.
@ RecursionLimit
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define I(x, y, z)
Definition MD5.cpp:57
This file implements a map that provides insertion order iteration.
#define T
uint64_t IntrinsicInst * II
#define P(N)
This file defines the SmallString class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:114
static const uint32_t IV[8]
Definition blake3_impl.h:83
Class for arbitrary precision integers.
Definition APInt.h:78
This class represents a conversion between pointers from one address space to another.
an instruction to allocate memory on the stack
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
PointerType * getType() const
Overload to return most specific pointer type.
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
bool isUsedWithInAlloca() const
Return true if this alloca is used as an inalloca argument to a call.
unsigned getAddressSpace() const
Return the address space for the allocation.
LLVM_ABI std::optional< TypeSize > getAllocationSize(const DataLayout &DL) const
Get allocation size in bytes.
LLVM_ABI bool isArrayAllocation() const
Return true if there is an allocation size parameter to the allocation instruction that is not 1.
void setAlignment(Align Align)
const Value * getArraySize() const
Get the number of elements allocated.
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:461
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
LLVM_ABI bool hasNPredecessors(unsigned N) const
Return true if this block has exactly N predecessors.
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
static LLVM_ABI bool isBitOrNoopPointerCastable(Type *SrcTy, Type *DestTy, const DataLayout &DL)
Check whether a bitcast, inttoptr, or ptrtoint cast between these types is valid and a no-op.
This is the shared class of boolean and integer constants.
Definition Constants.h:87
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
LLVM_ABI IntegerType * getIndexType(LLVMContext &C, unsigned AddressSpace) const
Returns the type of a GEP index in AddressSpace.
A debug info location.
Definition DebugLoc.h:123
static LLVM_ABI DebugLoc getMergedLocation(DebugLoc LocA, DebugLoc LocB)
When two instructions are combined into a single instruction we also need to combine the original loc...
Definition DebugLoc.cpp:179
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:159
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
LLVM_ABI bool isInBounds() const
Determine whether the GEP has the inbounds flag.
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI Type * getIndexedType(Type *Ty, ArrayRef< Value * > IdxList)
Returns the result type of a getelementptr with the given source element type and indexes.
Type * getSourceElementType() const
AllocaInst * CreateAlloca(Type *Ty, unsigned AddrSpace, Value *ArraySize=nullptr, const Twine &Name="")
Definition IRBuilder.h:1860
Value * CreateInsertValue(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &Name="")
Definition IRBuilder.h:2638
LoadInst * CreateAlignedLoad(Type *Ty, Value *Ptr, MaybeAlign Align, const char *Name)
Definition IRBuilder.h:1894
Value * CreateExtractValue(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &Name="")
Definition IRBuilder.h:2631
Value * CreateInBoundsGEP(Type *Ty, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &Name="")
Definition IRBuilder.h:1975
ConstantInt * getInt32(uint32_t C)
Get a constant 32-bit value.
Definition IRBuilder.h:522
LLVM_ABI Value * CreateTypeSize(Type *Ty, TypeSize Size)
Create an expression which evaluates to the number of units in Size at runtime.
Value * CreateIntCast(Value *V, Type *DestTy, bool isSigned, const Twine &Name="")
Definition IRBuilder.h:2272
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Definition IRBuilder.h:207
StoreInst * CreateAlignedStore(Value *Val, Value *Ptr, MaybeAlign Align, bool isVolatile=false)
Definition IRBuilder.h:1913
Value * CreateInBoundsPtrAdd(Value *Ptr, Value *Offset, const Twine &Name="")
Definition IRBuilder.h:2053
LLVM_ABI CallInst * CreateMemTransferInst(Intrinsic::ID IntrID, Value *Dst, MaybeAlign DstAlign, Value *Src, MaybeAlign SrcAlign, Value *Size, bool isVolatile=false, const AAMDNodes &AAInfo=AAMDNodes())
void handleUnreachableFrom(Instruction *I, SmallVectorImpl< BasicBlock * > &Worklist)
Instruction * visitLoadInst(LoadInst &LI)
void handlePotentiallyDeadBlocks(SmallVectorImpl< BasicBlock * > &Worklist)
Instruction * eraseInstFromFunction(Instruction &I) override
Combiner aware instruction erasure.
Instruction * visitStoreInst(StoreInst &SI)
bool mergeStoreIntoSuccessor(StoreInst &SI)
Try to transform: if () { *P = v1; } else { *P = v2 } or: *P = v1; if () { *P = v2; }...
void CreateNonTerminatorUnreachable(Instruction *InsertAt)
Create and insert the idiom we use to indicate a block is unreachable without having to rewrite the C...
bool removeInstructionsBeforeUnreachable(Instruction &I)
LoadInst * combineLoadToNewType(LoadInst &LI, Type *NewTy, const Twine &Suffix="")
Helper to combine a load to a new type.
Instruction * visitAllocSite(Instruction &FI)
Instruction * visitAllocaInst(AllocaInst &AI)
SimplifyQuery SQ
const DataLayout & getDataLayout() const
Instruction * InsertNewInstBefore(Instruction *New, BasicBlock::iterator Old)
Inserts an instruction New before instruction Old.
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
uint64_t MaxArraySizeForCombine
Maximum size of array considered when transforming.
InstructionWorklist & Worklist
A worklist of the instructions that need to be simplified.
Instruction * InsertNewInstWith(Instruction *New, BasicBlock::iterator Old)
Same as InsertNewInstBefore, but also sets the debug loc.
const DataLayout & DL
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CxtI, unsigned Depth=0) const
AssumptionCache & AC
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
DominatorTree & DT
BuilderTy & Builder
LLVM_ABI Instruction * clone() const
Create a copy of 'this' instruction that is identical in all ways except the following:
LLVM_ABI bool isLifetimeStartOrEnd() const LLVM_READONLY
Return true if the instruction is a llvm.lifetime.start or llvm.lifetime.end marker.
LLVM_ABI void mergeDIAssignID(ArrayRef< const Instruction * > SourceInstructions)
Merge the DIAssignID metadata from this instruction and those attached to instructions in SourceInstr...
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI void setAAMetadata(const AAMDNodes &N)
Sets the AA metadata on this instruction from the AAMDNodes structure.
LLVM_ABI void moveBefore(InstListType::iterator InsertPos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
LLVM_ABI bool isAtomic() const LLVM_READONLY
Return true if this instruction has an AtomicOrdering of unordered or higher.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI BasicBlock * getSuccessor(unsigned Idx) const LLVM_READONLY
Return the specified successor. This instruction must be a terminator.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
LLVM_ABI AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI void copyMetadata(const Instruction &SrcInst, ArrayRef< unsigned > WL=ArrayRef< unsigned >())
Copy metadata from SrcInst to this instruction.
An instruction for reading from memory.
unsigned getPointerAddressSpace() const
Returns the address space of the pointer operand.
void setAlignment(Align Align)
Value * getPointerOperand()
bool isVolatile() const
Return true if this is a load from a volatile memory location.
void setAtomic(AtomicOrdering Ordering, SyncScope::ID SSID=SyncScope::System)
Sets the ordering constraint and the synchronization scope ID of this load instruction.
AtomicOrdering getOrdering() const
Returns the ordering constraint of this load instruction.
bool isUnordered() const
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID of this load instruction.
bool isSimple() const
Align getAlign() const
Return the alignment of the access that is being performed.
Metadata node.
Definition Metadata.h:1080
This class wraps the llvm.memcpy/memmove intrinsics.
static constexpr const unsigned PoisonGeneratingIDs[]
Metadata IDs that may generate poison.
Definition Metadata.h:146
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
PointerIntPair - This class implements a pair of a pointer and small integer.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
This class represents the LLVM 'select' instruction.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
bool contains(const_arg_type key) const
Check if the SetVector contains the given key.
Definition SetVector.h:252
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:151
size_type size() const
Definition SmallPtrSet.h:99
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Value * getValueOperand()
void setAtomic(AtomicOrdering Ordering, SyncScope::ID SSID=SyncScope::System)
Sets the ordering constraint and the synchronization scope ID of this store instruction.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getZero()
Definition TypeSize.h:349
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:314
LLVM_ABI bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this is a type whose size is a known multiple of vscale.
Definition Type.cpp:65
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
Definition Type.h:328
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
Definition Type.h:287
bool isX86_AMXTy() const
Return true if this is X86 AMX.
Definition Type.h:202
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:257
void setOperand(unsigned i, Value *Val)
Definition User.h:212
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:549
iterator_range< use_iterator > uses()
Definition Value.h:380
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:318
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:399
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
CallInst * Call
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Abstract Attribute helper functions.
Definition Attributor.h:165
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
bool match(Val *V, const Pattern &P)
auto m_Undef()
Match an arbitrary undef constant.
initializer< Ty > init(const Ty &Val)
LLVM_ABI bool isAvailable()
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:532
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
cl::opt< bool > ProfcheckDisableMetadataFixes
Definition LoopInfo.cpp:60
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI bool isDereferenceableAndAlignedPointer(const Value *V, Type *Ty, Align Alignment, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Returns true if V is always a dereferenceable pointer with alignment greater or equal than requested.
Definition Loads.cpp:229
LLVM_ABI void copyMetadataForLoad(LoadInst &Dest, const LoadInst &Source)
Copy the metadata from the source instruction to the destination (the replacement for the source inst...
Definition Local.cpp:3119
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
LLVM_ABI Value * FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB, BasicBlock::iterator &ScanFrom, unsigned MaxInstsToScan=DefMaxInstsToScan, BatchAAResults *AA=nullptr, bool *IsLoadCSE=nullptr, unsigned *NumScanedInst=nullptr)
Scan backwards to see if we have the value of the given load available locally within a small number ...
Definition Loads.cpp:553
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
LLVM_ABI Align getOrEnforceKnownAlignment(Value *V, MaybeAlign PrefAlign, const DataLayout &DL, const Instruction *CxtI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr)
Try to ensure that the alignment of V is at least PrefAlign bytes.
Definition Local.cpp:1581
bool isModSet(const ModRefInfo MRI)
Definition ModRef.h:49
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
LLVM_ABI bool isSafeToLoadUnconditionally(Value *V, Align Alignment, const APInt &Size, const DataLayout &DL, Instruction *ScanFrom, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Return true if we know that executing a load from this value cannot trap.
Definition Loads.cpp:446
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI bool replaceAllDbgUsesWith(Instruction &From, Value &To, Instruction &DomPoint, DominatorTree &DT)
Point debug users of From to To or salvage them.
Definition Local.cpp:2429
LLVM_ABI Value * simplifyLoadInst(LoadInst *LI, Value *PtrOp, const SimplifyQuery &Q)
Given a load instruction and its pointer operand, fold the result or return null.
LLVM_ABI void combineMetadataForCSE(Instruction *K, const Instruction *J, bool DoesKMove)
Combine the metadata of two instructions so that K can replace J.
Definition Local.cpp:3110
OperandBundleDefT< Value * > OperandBundleDef
Definition AutoUpgrade.h:34
void replace(R &&Range, const T &OldValue, const T &NewValue)
Provide wrappers to std::replace which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1910
DWARFExpression::Operation Op
PredIterator< BasicBlock, Value::user_iterator > pred_iterator
Definition CFG.h:105
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI bool isGuaranteedToTransferExecutionToSuccessor(const Instruction *I)
Return true if this function can prove that the instruction I will always transfer execution to one o...
auto pred_begin(const MachineBasicBlock *BB)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:763
LLVM_ABI AAMDNodes merge(const AAMDNodes &Other) const
Given two sets of AAMDNodes applying to potentially different locations, determine the best AAMDNodes...
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:108