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