LLVM 24.0.0git
SROA.cpp
Go to the documentation of this file.
1//===- SROA.cpp - Scalar Replacement Of Aggregates ------------------------===//
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/// \file
9/// This transformation implements the well known scalar replacement of
10/// aggregates transformation. It tries to identify promotable elements of an
11/// aggregate alloca, and promote them to registers. It will also try to
12/// convert uses of an element (or set of elements) of an alloca into a vector
13/// or bitfield-style integer scalar if appropriate.
14///
15/// It works to do this with minimal slicing of the alloca so that regions
16/// which are merely transferred in and out of external memory remain unchanged
17/// and are not decomposed to scalar code.
18///
19/// Because this also performs alloca promotion, it can be thought of as also
20/// serving the purpose of SSA formation. The algorithm iterates on the
21/// function until all opportunities for promotion have been realized.
22///
23//===----------------------------------------------------------------------===//
24
26#include "ScalarOptions.h"
27#include "llvm/ADT/APInt.h"
28#include "llvm/ADT/ArrayRef.h"
29#include "llvm/ADT/DenseMap.h"
30#include "llvm/ADT/MapVector.h"
32#include "llvm/ADT/STLExtras.h"
33#include "llvm/ADT/SetVector.h"
37#include "llvm/ADT/Statistic.h"
38#include "llvm/ADT/StringRef.h"
39#include "llvm/ADT/Twine.h"
40#include "llvm/ADT/iterator.h"
45#include "llvm/Analysis/Loads.h"
49#include "llvm/IR/BasicBlock.h"
50#include "llvm/IR/Constant.h"
52#include "llvm/IR/Constants.h"
53#include "llvm/IR/DIBuilder.h"
54#include "llvm/IR/DataLayout.h"
55#include "llvm/IR/DebugInfo.h"
58#include "llvm/IR/Dominators.h"
59#include "llvm/IR/Function.h"
60#include "llvm/IR/GlobalAlias.h"
61#include "llvm/IR/IRBuilder.h"
62#include "llvm/IR/InstVisitor.h"
63#include "llvm/IR/Instruction.h"
66#include "llvm/IR/LLVMContext.h"
67#include "llvm/IR/Metadata.h"
68#include "llvm/IR/Module.h"
69#include "llvm/IR/Operator.h"
70#include "llvm/IR/PassManager.h"
71#include "llvm/IR/Type.h"
72#include "llvm/IR/Use.h"
73#include "llvm/IR/User.h"
74#include "llvm/IR/Value.h"
75#include "llvm/IR/ValueHandle.h"
77#include "llvm/Pass.h"
80#include "llvm/Support/Debug.h"
88#include <algorithm>
89#include <cassert>
90#include <cstddef>
91#include <cstdint>
92#include <cstring>
93#include <iterator>
94#include <string>
95#include <tuple>
96#include <utility>
97#include <variant>
98#include <vector>
99
100using namespace llvm;
101
102#define DEBUG_TYPE "sroa"
103
104STATISTIC(NumAllocasAnalyzed, "Number of allocas analyzed for replacement");
105STATISTIC(NumAllocaPartitions, "Number of alloca partitions formed");
106STATISTIC(MaxPartitionsPerAlloca, "Maximum number of partitions per alloca");
107STATISTIC(NumAllocaPartitionUses, "Number of alloca partition uses rewritten");
108STATISTIC(MaxUsesPerAllocaPartition, "Maximum number of uses of a partition");
109STATISTIC(NumNewAllocas, "Number of new, smaller allocas introduced");
110STATISTIC(NumPromoted, "Number of allocas promoted to SSA values");
111STATISTIC(NumLoadsSpeculated, "Number of loads speculated to allow promotion");
112STATISTIC(NumLoadsPredicated,
113 "Number of loads rewritten into predicated loads to allow promotion");
115 NumStoresPredicated,
116 "Number of stores rewritten into predicated stores to allow promotion");
117STATISTIC(NumDeleted, "Number of instructions deleted");
118STATISTIC(NumVectorized, "Number of vectorized aggregates");
119
120namespace {
121
122class AllocaSliceRewriter;
123class AllocaSlices;
124class Partition;
125class Slice;
126
127class SelectHandSpeculativity {
128 unsigned char Storage = 0; // None are speculatable by default.
129 using TrueVal = Bitfield::Element<bool, 0, 1>; // Low 0'th bit.
130 using FalseVal = Bitfield::Element<bool, 1, 1>; // Low 1'th bit.
131public:
132 SelectHandSpeculativity() = default;
133 SelectHandSpeculativity &setAsSpeculatable(bool isTrueVal);
134 bool isSpeculatable(bool isTrueVal) const;
135 bool areAllSpeculatable() const;
136 bool areAnySpeculatable() const;
137 bool areNoneSpeculatable() const;
138 // For interop as int half of PointerIntPair.
139 explicit operator intptr_t() const { return static_cast<intptr_t>(Storage); }
140 explicit SelectHandSpeculativity(intptr_t Storage_) : Storage(Storage_) {}
141};
142static_assert(sizeof(SelectHandSpeculativity) == sizeof(unsigned char));
143
144using PossiblySpeculatableLoad =
146using UnspeculatableStore = StoreInst *;
147using RewriteableMemOp =
148 std::variant<PossiblySpeculatableLoad, UnspeculatableStore>;
149using RewriteableMemOps = SmallVector<RewriteableMemOp, 2>;
150using InstructionSliceMap =
152
153/// An optimization pass providing Scalar Replacement of Aggregates.
154///
155/// This pass takes allocations which can be completely analyzed (that is, they
156/// don't escape) and tries to turn them into scalar SSA values. There are
157/// a few steps to this process.
158///
159/// 1) It takes allocations of aggregates and analyzes the ways in which they
160/// are used to try to split them into smaller allocations, ideally of
161/// a single scalar data type. It will split up memcpy and memset accesses
162/// as necessary and try to isolate individual scalar accesses.
163/// 2) It will transform accesses into forms which are suitable for SSA value
164/// promotion. This can be replacing a memset with a scalar store of an
165/// integer value, or it can involve speculating operations on a PHI or
166/// select to be a PHI or select of the results.
167/// 3) Finally, this will try to detect a pattern of accesses which map cleanly
168/// onto insert and extract operations on a vector value, and convert them to
169/// this form. By doing so, it will enable promotion of vector aggregates to
170/// SSA vector values.
171class SROA {
172 LLVMContext *const C;
173 DomTreeUpdater *const DTU;
174 AssumptionCache *const AC;
175 const bool PreserveCFG;
176 const bool AggregateToVector;
177
178 /// Worklist of alloca instructions to simplify.
179 ///
180 /// Each alloca in the function is added to this. Each new alloca formed gets
181 /// added to it as well to recursively simplify unless that alloca can be
182 /// directly promoted. Finally, each time we rewrite a use of an alloca other
183 /// the one being actively rewritten, we add it back onto the list if not
184 /// already present to ensure it is re-visited.
185 SmallSetVector<AllocaInst *, 16> Worklist;
186
187 /// A collection of instructions to delete.
188 /// We try to batch deletions to simplify code and make things a bit more
189 /// efficient. We also make sure there is no dangling pointers.
190 SmallVector<WeakVH, 8> DeadInsts;
191
192 /// Post-promotion worklist.
193 ///
194 /// Sometimes we discover an alloca which has a high probability of becoming
195 /// viable for SROA after a round of promotion takes place. In those cases,
196 /// the alloca is enqueued here for re-processing.
197 ///
198 /// Note that we have to be very careful to clear allocas out of this list in
199 /// the event they are deleted.
200 SmallSetVector<AllocaInst *, 16> PostPromotionWorklist;
201
202 /// A collection of alloca instructions we can directly promote.
203 SetVector<AllocaInst *, SmallVector<AllocaInst *>,
204 SmallPtrSet<AllocaInst *, 16>, 16>
205 PromotableAllocas;
206
207 /// A worklist of PHIs to speculate prior to promoting allocas.
208 ///
209 /// All of these PHIs have been checked for the safety of speculation and by
210 /// being speculated will allow promoting allocas currently in the promotable
211 /// queue.
212 SmallSetVector<PHINode *, 8> SpeculatablePHIs;
213
214 /// A worklist of PHIs whose stores should be predicated onto incoming edges.
215 ///
216 /// All of these PHIs have been checked so that rewriting their stores will
217 /// allow the corresponding allocas to be promoted. Edges which require
218 /// splitting are only present when CFG modification is allowed.
219 SmallSetVector<PHINode *, 8> PHIsWithStoreToRewrite;
220
221 /// A worklist of select instructions to rewrite prior to promoting
222 /// allocas.
223 SmallMapVector<SelectInst *, RewriteableMemOps, 8> SelectsToRewrite;
224
225 /// Select instructions that use an alloca and are subsequently loaded can be
226 /// rewritten to load both input pointers and then select between the result,
227 /// allowing the load of the alloca to be promoted.
228 /// From this:
229 /// %P2 = select i1 %cond, ptr %Alloca, ptr %Other
230 /// %V = load <type>, ptr %P2
231 /// to:
232 /// %V1 = load <type>, ptr %Alloca -> will be mem2reg'd
233 /// %V2 = load <type>, ptr %Other
234 /// %V = select i1 %cond, <type> %V1, <type> %V2
235 ///
236 /// We can do this to a select if its only uses are loads
237 /// and if either the operand to the select can be loaded unconditionally,
238 /// or if we are allowed to perform CFG modifications.
239 static std::optional<RewriteableMemOps>
240 isSafeSelectToSpeculate(SelectInst &SI, bool PreserveCFG);
241
242public:
243 SROA(LLVMContext *C, DomTreeUpdater *DTU, AssumptionCache *AC,
244 SROAOptions Options)
245 : C(C), DTU(DTU), AC(AC),
246 PreserveCFG(Options.CFG == SROAOptions::PreserveCFG),
247 AggregateToVector(Options.AggregateToVector) {}
248
249 /// Main run method used by both the SROAPass and by the legacy pass.
250 std::pair<bool /*Changed*/, bool /*CFGChanged*/> runSROA(Function &F);
251
252private:
253 friend class AllocaSliceRewriter;
254
255 bool presplitLoadsAndStores(AllocaInst &AI, AllocaSlices &AS);
256 std::pair<AllocaInst *, uint64_t>
257 rewritePartition(AllocaInst &AI, AllocaSlices &AS, Partition &P);
258 bool splitAlloca(AllocaInst &AI, AllocaSlices &AS);
259 bool propagateStoredValuesToLoads(AllocaInst &AI, AllocaSlices &AS);
260 std::pair<bool /*Changed*/, bool /*CFGChanged*/> runOnAlloca(AllocaInst &AI);
261 void clobberUse(Use &U);
262 bool deleteDeadInstructions(SmallPtrSetImpl<AllocaInst *> &DeletedAllocas);
263 bool promoteAllocas();
264};
265
266} // end anonymous namespace
267
268/// Calculate the fragment of a variable to use when slicing a store
269/// based on the slice dimensions, existing fragment, and base storage
270/// fragment.
271/// Results:
272/// UseFrag - Use Target as the new fragment.
273/// UseNoFrag - The new slice already covers the whole variable.
274/// Skip - The new alloca slice doesn't include this variable.
275/// FIXME: Can we use calculateFragmentIntersect instead?
276namespace {
277enum FragCalcResult { UseFrag, UseNoFrag, Skip };
278}
279static FragCalcResult
281 uint64_t NewStorageSliceOffsetInBits,
282 uint64_t NewStorageSliceSizeInBits,
283 std::optional<DIExpression::FragmentInfo> StorageFragment,
284 std::optional<DIExpression::FragmentInfo> CurrentFragment,
286 // If the base storage describes part of the variable apply the offset and
287 // the size constraint.
288 if (StorageFragment) {
289 Target.SizeInBits =
290 std::min(NewStorageSliceSizeInBits, StorageFragment->SizeInBits);
291 Target.OffsetInBits =
292 NewStorageSliceOffsetInBits + StorageFragment->OffsetInBits;
293 } else {
294 Target.SizeInBits = NewStorageSliceSizeInBits;
295 Target.OffsetInBits = NewStorageSliceOffsetInBits;
296 }
297
298 // If this slice extracts the entirety of an independent variable from a
299 // larger alloca, do not produce a fragment expression, as the variable is
300 // not fragmented.
301 if (!CurrentFragment) {
302 if (auto Size = Variable->getSizeInBits()) {
303 // Treat the current fragment as covering the whole variable.
304 CurrentFragment = DIExpression::FragmentInfo(*Size, 0);
305 if (Target == CurrentFragment)
306 return UseNoFrag;
307 }
308 }
309
310 // No additional work to do if there isn't a fragment already, or there is
311 // but it already exactly describes the new assignment.
312 if (!CurrentFragment || *CurrentFragment == Target)
313 return UseFrag;
314
315 // Reject the target fragment if it doesn't fit wholly within the current
316 // fragment. TODO: We could instead chop up the target to fit in the case of
317 // a partial overlap.
318 if (Target.startInBits() < CurrentFragment->startInBits() ||
319 Target.endInBits() > CurrentFragment->endInBits())
320 return Skip;
321
322 // Target fits within the current fragment, return it.
323 return UseFrag;
324}
325
327 return DebugVariable(DVR->getVariable(), std::nullopt,
328 DVR->getDebugLoc().getInlinedAt());
329}
330
331/// Find linked dbg.assign and generate a new one with the correct
332/// FragmentInfo. Link Inst to the new dbg.assign. If Value is nullptr the
333/// value component is copied from the old dbg.assign to the new.
334/// \param OldAlloca Alloca for the variable before splitting.
335/// \param IsSplit True if the store (not necessarily alloca)
336/// is being split.
337/// \param OldAllocaOffsetInBits Offset of the slice taken from OldAlloca.
338/// \param SliceSizeInBits New number of bits being written to.
339/// \param OldInst Instruction that is being split.
340/// \param Inst New instruction performing this part of the
341/// split store.
342/// \param Dest Store destination.
343/// \param Value Stored value.
344/// \param DL Datalayout.
345static void migrateDebugInfo(AllocaInst *OldAlloca, bool IsSplit,
346 uint64_t OldAllocaOffsetInBits,
347 uint64_t SliceSizeInBits, Instruction *OldInst,
348 Instruction *Inst, Value *Dest, Value *Value,
349 const DataLayout &DL) {
350 // If we want allocas to be migrated using this helper then we need to ensure
351 // that the BaseFragments map code still works. A simple solution would be
352 // to choose to always clone alloca dbg_assigns (rather than sometimes
353 // "stealing" them).
354 assert(!isa<AllocaInst>(Inst) && "Unexpected alloca");
355
356 auto DVRAssignMarkerRange = at::getDVRAssignmentMarkers(OldInst);
357 // Nothing to do if OldInst has no linked dbg.assign intrinsics.
358 if (DVRAssignMarkerRange.empty())
359 return;
360
361 LLVM_DEBUG(dbgs() << " migrateDebugInfo\n");
362 LLVM_DEBUG(dbgs() << " OldAlloca: " << *OldAlloca << "\n");
363 LLVM_DEBUG(dbgs() << " IsSplit: " << IsSplit << "\n");
364 LLVM_DEBUG(dbgs() << " OldAllocaOffsetInBits: " << OldAllocaOffsetInBits
365 << "\n");
366 LLVM_DEBUG(dbgs() << " SliceSizeInBits: " << SliceSizeInBits << "\n");
367 LLVM_DEBUG(dbgs() << " OldInst: " << *OldInst << "\n");
368 LLVM_DEBUG(dbgs() << " Inst: " << *Inst << "\n");
369 LLVM_DEBUG(dbgs() << " Dest: " << *Dest << "\n");
370 if (Value)
371 LLVM_DEBUG(dbgs() << " Value: " << *Value << "\n");
372
373 /// Map of aggregate variables to their fragment associated with OldAlloca.
375 BaseFragments;
376 for (auto *DVR : at::getDVRAssignmentMarkers(OldAlloca))
377 BaseFragments[getAggregateVariable(DVR)] =
378 DVR->getExpression()->getFragmentInfo();
379
380 // The new inst needs a DIAssignID unique metadata tag (if OldInst has
381 // one). It shouldn't already have one: assert this assumption.
382 assert(!Inst->getMetadata(LLVMContext::MD_DIAssignID));
383 DIAssignID *NewID = nullptr;
384 auto &Ctx = Inst->getContext();
385 DIBuilder DIB(*OldInst->getModule(), /*AllowUnresolved*/ false);
386 assert(OldAlloca->isStaticAlloca());
387
388 auto MigrateDbgAssign = [&](DbgVariableRecord *DbgAssign) {
389 LLVM_DEBUG(dbgs() << " existing dbg.assign is: " << *DbgAssign
390 << "\n");
391 auto *Expr = DbgAssign->getExpression();
392 bool SetKillLocation = false;
393
394 if (IsSplit) {
395 std::optional<DIExpression::FragmentInfo> BaseFragment;
396 {
397 auto R = BaseFragments.find(getAggregateVariable(DbgAssign));
398 if (R == BaseFragments.end())
399 return;
400 BaseFragment = R->second;
401 }
402 std::optional<DIExpression::FragmentInfo> CurrentFragment =
403 Expr->getFragmentInfo();
404 DIExpression::FragmentInfo NewFragment;
405 FragCalcResult Result = calculateFragment(
406 DbgAssign->getVariable(), OldAllocaOffsetInBits, SliceSizeInBits,
407 BaseFragment, CurrentFragment, NewFragment);
408
409 if (Result == Skip)
410 return;
411 if (Result == UseFrag && !(NewFragment == CurrentFragment)) {
412 if (CurrentFragment) {
413 // Rewrite NewFragment to be relative to the existing one (this is
414 // what createFragmentExpression wants). CalculateFragment has
415 // already resolved the size for us. FIXME: Should it return the
416 // relative fragment too?
417 NewFragment.OffsetInBits -= CurrentFragment->OffsetInBits;
418 }
419 // Add the new fragment info to the existing expression if possible.
421 Expr, NewFragment.OffsetInBits, NewFragment.SizeInBits)) {
422 Expr = *E;
423 } else {
424 // Otherwise, add the new fragment info to an empty expression and
425 // discard the value component of this dbg.assign as the value cannot
426 // be computed with the new fragment.
428 DIExpression::get(Expr->getContext(), {}),
429 NewFragment.OffsetInBits, NewFragment.SizeInBits);
430 SetKillLocation = true;
431 }
432 }
433 }
434
435 // If we haven't created a DIAssignID ID do that now and attach it to Inst.
436 if (!NewID) {
437 NewID = DIAssignID::getDistinct(Ctx);
438 Inst->setMetadata(LLVMContext::MD_DIAssignID, NewID);
439 }
440
441 DbgVariableRecord *NewAssign;
442 if (IsSplit) {
443 ::Value *NewValue = Value ? Value : DbgAssign->getValue();
445 Inst, NewValue, DbgAssign->getVariable(), Expr, Dest,
446 DIExpression::get(Expr->getContext(), {}), DbgAssign->getDebugLoc()));
447 } else {
448 // The store is not split, simply steal the existing dbg_assign.
449 NewAssign = DbgAssign;
450 NewAssign->setAssignId(NewID); // FIXME: Can we avoid generating new IDs?
451 NewAssign->setAddress(Dest);
452 if (Value)
453 NewAssign->replaceVariableLocationOp(0u, Value);
454 assert(Expr == NewAssign->getExpression());
455 }
456
457 // If we've updated the value but the original dbg.assign has an arglist
458 // then kill it now - we can't use the requested new value.
459 // We can't replace the DIArgList with the new value as it'd leave
460 // the DIExpression in an invalid state (DW_OP_LLVM_arg operands without
461 // an arglist). And we can't keep the DIArgList in case the linked store
462 // is being split - in which case the DIArgList + expression may no longer
463 // be computing the correct value.
464 // This should be a very rare situation as it requires the value being
465 // stored to differ from the dbg.assign (i.e., the value has been
466 // represented differently in the debug intrinsic for some reason).
467 SetKillLocation |=
468 Value && (DbgAssign->hasArgList() ||
469 !DbgAssign->getExpression()->isSingleLocationExpression());
470 if (SetKillLocation)
471 NewAssign->setKillLocation();
472
473 // We could use more precision here at the cost of some additional (code)
474 // complexity - if the original dbg.assign was adjacent to its store, we
475 // could position this new dbg.assign adjacent to its store rather than the
476 // old dbg.assgn. That would result in interleaved dbg.assigns rather than
477 // what we get now:
478 // split store !1
479 // split store !2
480 // dbg.assign !1
481 // dbg.assign !2
482 // This (current behaviour) results results in debug assignments being
483 // noted as slightly offset (in code) from the store. In practice this
484 // should have little effect on the debugging experience due to the fact
485 // that all the split stores should get the same line number.
486 if (NewAssign != DbgAssign) {
487 NewAssign->moveBefore(DbgAssign->getIterator());
488 NewAssign->setDebugLoc(DbgAssign->getDebugLoc());
489 }
490 LLVM_DEBUG(dbgs() << "Created new assign: " << *NewAssign << "\n");
491 };
492
493 for_each(DVRAssignMarkerRange, MigrateDbgAssign);
494}
495
496namespace {
497
498/// A custom IRBuilder inserter which prefixes all names, but only in
499/// Assert builds.
500class IRBuilderPrefixedInserter final : public IRBuilderDefaultInserter {
501 std::string Prefix;
502
503 Twine getNameWithPrefix(const Twine &Name) const {
504 return Name.isTriviallyEmpty() ? Name : Prefix + Name;
505 }
506
507public:
508 void SetNamePrefix(const Twine &P) { Prefix = P.str(); }
509
510 void InsertHelper(Instruction *I, const Twine &Name,
511 BasicBlock::iterator InsertPt) const {
512 IRBuilderDefaultInserter::InsertHelper(I, getNameWithPrefix(Name),
513 InsertPt);
514 }
515};
516
517/// Provide a type for IRBuilder that drops names in release builds.
519
520/// A used slice of an alloca.
521///
522/// This structure represents a slice of an alloca used by some instruction. It
523/// stores both the begin and end offsets of this use, a pointer to the use
524/// itself, and a flag indicating whether we can classify the use as splittable
525/// or not when forming partitions of the alloca.
526class Slice {
527 /// The beginning offset of the range.
528 uint64_t BeginOffset = 0;
529
530 /// The ending offset, not included in the range.
531 uint64_t EndOffset = 0;
532
533 /// Storage for both the use of this slice and whether it can be
534 /// split.
535 PointerIntPair<Use *, 1, bool> UseAndIsSplittable;
536
537public:
538 Slice() = default;
539
540 Slice(uint64_t BeginOffset, uint64_t EndOffset, Use *U, bool IsSplittable)
541 : BeginOffset(BeginOffset), EndOffset(EndOffset),
542 UseAndIsSplittable(U, IsSplittable) {}
543
544 uint64_t beginOffset() const { return BeginOffset; }
545 uint64_t endOffset() const { return EndOffset; }
546
547 bool isSplittable() const { return UseAndIsSplittable.getInt(); }
548 void makeUnsplittable() { UseAndIsSplittable.setInt(false); }
549
550 Use *getUse() const { return UseAndIsSplittable.getPointer(); }
551
552 bool isDead() const { return getUse() == nullptr; }
553 void kill() { UseAndIsSplittable.setPointer(nullptr); }
554
555 /// Support for ordering ranges.
556 ///
557 /// This provides an ordering over ranges such that start offsets are
558 /// always increasing, and within equal start offsets, the end offsets are
559 /// decreasing. Thus the spanning range comes first in a cluster with the
560 /// same start position.
561 bool operator<(const Slice &RHS) const {
562 if (beginOffset() < RHS.beginOffset())
563 return true;
564 if (beginOffset() > RHS.beginOffset())
565 return false;
566 if (isSplittable() != RHS.isSplittable())
567 return !isSplittable();
568 if (endOffset() > RHS.endOffset())
569 return true;
570 return false;
571 }
572
573 /// Support comparison with a single offset to allow binary searches.
574 [[maybe_unused]] friend bool operator<(const Slice &LHS, uint64_t RHSOffset) {
575 return LHS.beginOffset() < RHSOffset;
576 }
577 [[maybe_unused]] friend bool operator<(uint64_t LHSOffset, const Slice &RHS) {
578 return LHSOffset < RHS.beginOffset();
579 }
580
581 bool operator==(const Slice &RHS) const {
582 return isSplittable() == RHS.isSplittable() &&
583 beginOffset() == RHS.beginOffset() && endOffset() == RHS.endOffset();
584 }
585 bool operator!=(const Slice &RHS) const { return !operator==(RHS); }
586};
587
588/// Representation of the alloca slices.
589///
590/// This class represents the slices of an alloca which are formed by its
591/// various uses. If a pointer escapes, we can't fully build a representation
592/// for the slices used and we reflect that in this structure. The uses are
593/// stored, sorted by increasing beginning offset and with unsplittable slices
594/// starting at a particular offset before splittable slices.
595class AllocaSlices {
596public:
597 /// Construct the slices of a particular alloca.
598 AllocaSlices(const DataLayout &DL, AllocaInst &AI);
599
600 /// Test whether a pointer to the allocation escapes our analysis.
601 ///
602 /// If this is true, the slices are never fully built and should be
603 /// ignored.
604 bool isEscaped() const { return PointerEscapingInstr; }
605 bool isEscapedReadOnly() const { return PointerEscapingInstrReadOnly; }
606
607 /// Support for iterating over the slices.
608 /// @{
609 using iterator = SmallVectorImpl<Slice>::iterator;
610 using range = iterator_range<iterator>;
611
612 iterator begin() { return Slices.begin(); }
613 iterator end() { return Slices.end(); }
614
615 using const_iterator = SmallVectorImpl<Slice>::const_iterator;
616 using const_range = iterator_range<const_iterator>;
617
618 const_iterator begin() const { return Slices.begin(); }
619 const_iterator end() const { return Slices.end(); }
620 /// @}
621
622 /// Erase a range of slices.
623 void erase(iterator Start, iterator Stop) { Slices.erase(Start, Stop); }
624
625 /// Insert new slices for this alloca.
626 ///
627 /// This moves the slices into the alloca's slices collection, and re-sorts
628 /// everything so that the usual ordering properties of the alloca's slices
629 /// hold.
630 void insert(ArrayRef<Slice> NewSlices) {
631 int OldSize = Slices.size();
632 Slices.append(NewSlices.begin(), NewSlices.end());
633 auto SliceI = Slices.begin() + OldSize;
634 std::stable_sort(SliceI, Slices.end());
635 std::inplace_merge(Slices.begin(), SliceI, Slices.end());
636 }
637
638 // Forward declare the iterator and range accessor for walking the
639 // partitions.
640 class partition_iterator;
642
643 /// Access the dead users for this alloca.
644 ArrayRef<Instruction *> getDeadUsers() const { return DeadUsers; }
645
646 /// Access Uses that should be dropped if the alloca is promotable.
647 ArrayRef<Use *> getDeadUsesIfPromotable() const {
648 return DeadUseIfPromotable;
649 }
650
651 /// Access the dead operands referring to this alloca.
652 ///
653 /// These are operands which have cannot actually be used to refer to the
654 /// alloca as they are outside its range and the user doesn't correct for
655 /// that. These mostly consist of PHI node inputs and the like which we just
656 /// need to replace with undef.
657 ArrayRef<Use *> getDeadOperands() const { return DeadOperands; }
658
659#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
660 void print(raw_ostream &OS, const_iterator I, StringRef Indent = " ") const;
661 void printSlice(raw_ostream &OS, const_iterator I,
662 StringRef Indent = " ") const;
663 void printUse(raw_ostream &OS, const_iterator I,
664 StringRef Indent = " ") const;
665 void print(raw_ostream &OS) const;
666 void dump(const_iterator I) const;
667 void dump() const;
668#endif
669
670private:
671 template <typename DerivedT, typename RetT = void> class BuilderBase;
672 class SliceBuilder;
673
674 friend class AllocaSlices::SliceBuilder;
675
676#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
677 /// Handle to alloca instruction to simplify method interfaces.
678 AllocaInst &AI;
679#endif
680
681 /// The instruction responsible for this alloca not having a known set
682 /// of slices.
683 ///
684 /// When an instruction (potentially) escapes the pointer to the alloca, we
685 /// store a pointer to that here and abort trying to form slices of the
686 /// alloca. This will be null if the alloca slices are analyzed successfully.
687 Instruction *PointerEscapingInstr;
688 Instruction *PointerEscapingInstrReadOnly;
689
690 /// The slices of the alloca.
691 ///
692 /// We store a vector of the slices formed by uses of the alloca here. This
693 /// vector is sorted by increasing begin offset, and then the unsplittable
694 /// slices before the splittable ones. See the Slice inner class for more
695 /// details.
697
698 /// Instructions which will become dead if we rewrite the alloca.
699 ///
700 /// Note that these are not separated by slice. This is because we expect an
701 /// alloca to be completely rewritten or not rewritten at all. If rewritten,
702 /// all these instructions can simply be removed and replaced with poison as
703 /// they come from outside of the allocated space.
704 SmallVector<Instruction *, 8> DeadUsers;
705
706 /// Uses which will become dead if can promote the alloca.
707 SmallVector<Use *, 8> DeadUseIfPromotable;
708
709 /// Operands which will become dead if we rewrite the alloca.
710 ///
711 /// These are operands that in their particular use can be replaced with
712 /// poison when we rewrite the alloca. These show up in out-of-bounds inputs
713 /// to PHI nodes and the like. They aren't entirely dead (there might be
714 /// a GEP back into the bounds using it elsewhere) and nor is the PHI, but we
715 /// want to swap this particular input for poison to simplify the use lists of
716 /// the alloca.
717 SmallVector<Use *, 8> DeadOperands;
718};
719
720/// A partition of the slices.
721///
722/// An ephemeral representation for a range of slices which can be viewed as
723/// a partition of the alloca. This range represents a span of the alloca's
724/// memory which cannot be split, and provides access to all of the slices
725/// overlapping some part of the partition.
726///
727/// Objects of this type are produced by traversing the alloca's slices, but
728/// are only ephemeral and not persistent.
729class Partition {
730private:
731 friend class AllocaSlices;
732 friend class AllocaSlices::partition_iterator;
733
734 using iterator = AllocaSlices::iterator;
735
736 /// The beginning and ending offsets of the alloca for this
737 /// partition.
738 uint64_t BeginOffset = 0, EndOffset = 0;
739
740 /// The start and end iterators of this partition.
741 iterator SI, SJ;
742
743 /// A collection of split slice tails overlapping the partition.
744 SmallVector<Slice *, 4> SplitTails;
745
746 /// Raw constructor builds an empty partition starting and ending at
747 /// the given iterator.
748 Partition(iterator SI) : SI(SI), SJ(SI) {}
749
750public:
751 /// The start offset of this partition.
752 ///
753 /// All of the contained slices start at or after this offset.
754 uint64_t beginOffset() const { return BeginOffset; }
755
756 /// The end offset of this partition.
757 ///
758 /// All of the contained slices end at or before this offset.
759 uint64_t endOffset() const { return EndOffset; }
760
761 /// The size of the partition.
762 ///
763 /// Note that this can never be zero.
764 uint64_t size() const {
765 assert(BeginOffset < EndOffset && "Partitions must span some bytes!");
766 return EndOffset - BeginOffset;
767 }
768
769 /// Test whether this partition contains no slices, and merely spans
770 /// a region occupied by split slices.
771 bool empty() const { return SI == SJ; }
772
773 /// \name Iterate slices that start within the partition.
774 /// These may be splittable or unsplittable. They have a begin offset >= the
775 /// partition begin offset.
776 /// @{
777 // FIXME: We should probably define a "concat_iterator" helper and use that
778 // to stitch together pointee_iterators over the split tails and the
779 // contiguous iterators of the partition. That would give a much nicer
780 // interface here. We could then additionally expose filtered iterators for
781 // split, unsplit, and unsplittable splices based on the usage patterns.
782 iterator begin() const { return SI; }
783 iterator end() const { return SJ; }
784 /// @}
785
786 /// Get the sequence of split slice tails.
787 ///
788 /// These tails are of slices which start before this partition but are
789 /// split and overlap into the partition. We accumulate these while forming
790 /// partitions.
791 ArrayRef<Slice *> splitSliceTails() const { return SplitTails; }
792};
793
794} // end anonymous namespace
795
796/// An iterator over partitions of the alloca's slices.
797///
798/// This iterator implements the core algorithm for partitioning the alloca's
799/// slices. It is a forward iterator as we don't support backtracking for
800/// efficiency reasons, and re-use a single storage area to maintain the
801/// current set of split slices.
802///
803/// It is templated on the slice iterator type to use so that it can operate
804/// with either const or non-const slice iterators.
806 : public iterator_facade_base<partition_iterator, std::forward_iterator_tag,
807 Partition> {
808 friend class AllocaSlices;
809
810 /// Most of the state for walking the partitions is held in a class
811 /// with a nice interface for examining them.
812 Partition P;
813
814 /// We need to keep the end of the slices to know when to stop.
815 AllocaSlices::iterator SE;
816
817 /// We also need to keep track of the maximum split end offset seen.
818 /// FIXME: Do we really?
819 uint64_t MaxSplitSliceEndOffset = 0;
820
821 /// Sets the partition to be empty at given iterator, and sets the
822 /// end iterator.
823 partition_iterator(AllocaSlices::iterator SI, AllocaSlices::iterator SE)
824 : P(SI), SE(SE) {
825 // If not already at the end, advance our state to form the initial
826 // partition.
827 if (SI != SE)
828 advance();
829 }
830
831 /// Advance the iterator to the next partition.
832 ///
833 /// Requires that the iterator not be at the end of the slices.
834 void advance() {
835 assert((P.SI != SE || !P.SplitTails.empty()) &&
836 "Cannot advance past the end of the slices!");
837
838 // Clear out any split uses which have ended.
839 if (!P.SplitTails.empty()) {
840 if (P.EndOffset >= MaxSplitSliceEndOffset) {
841 // If we've finished all splits, this is easy.
842 P.SplitTails.clear();
843 MaxSplitSliceEndOffset = 0;
844 } else {
845 // Remove the uses which have ended in the prior partition. This
846 // cannot change the max split slice end because we just checked that
847 // the prior partition ended prior to that max.
848 llvm::erase_if(P.SplitTails,
849 [&](Slice *S) { return S->endOffset() <= P.EndOffset; });
850 assert(llvm::any_of(P.SplitTails,
851 [&](Slice *S) {
852 return S->endOffset() == MaxSplitSliceEndOffset;
853 }) &&
854 "Could not find the current max split slice offset!");
855 assert(llvm::all_of(P.SplitTails,
856 [&](Slice *S) {
857 return S->endOffset() <= MaxSplitSliceEndOffset;
858 }) &&
859 "Max split slice end offset is not actually the max!");
860 }
861 }
862
863 // If P.SI is already at the end, then we've cleared the split tail and
864 // now have an end iterator.
865 if (P.SI == SE) {
866 assert(P.SplitTails.empty() && "Failed to clear the split slices!");
867 return;
868 }
869
870 // If we had a non-empty partition previously, set up the state for
871 // subsequent partitions.
872 if (P.SI != P.SJ) {
873 // Accumulate all the splittable slices which started in the old
874 // partition into the split list.
875 for (Slice &S : P)
876 if (S.isSplittable() && S.endOffset() > P.EndOffset) {
877 P.SplitTails.push_back(&S);
878 MaxSplitSliceEndOffset =
879 std::max(S.endOffset(), MaxSplitSliceEndOffset);
880 }
881
882 // Start from the end of the previous partition.
883 P.SI = P.SJ;
884
885 // If P.SI is now at the end, we at most have a tail of split slices.
886 if (P.SI == SE) {
887 P.BeginOffset = P.EndOffset;
888 P.EndOffset = MaxSplitSliceEndOffset;
889 return;
890 }
891
892 // If the we have split slices and the next slice is after a gap and is
893 // not splittable immediately form an empty partition for the split
894 // slices up until the next slice begins.
895 if (!P.SplitTails.empty() && P.SI->beginOffset() != P.EndOffset &&
896 !P.SI->isSplittable()) {
897 P.BeginOffset = P.EndOffset;
898 P.EndOffset = P.SI->beginOffset();
899 return;
900 }
901 }
902
903 // OK, we need to consume new slices. Set the end offset based on the
904 // current slice, and step SJ past it. The beginning offset of the
905 // partition is the beginning offset of the next slice unless we have
906 // pre-existing split slices that are continuing, in which case we begin
907 // at the prior end offset.
908 P.BeginOffset = P.SplitTails.empty() ? P.SI->beginOffset() : P.EndOffset;
909 P.EndOffset = P.SI->endOffset();
910 ++P.SJ;
911
912 // There are two strategies to form a partition based on whether the
913 // partition starts with an unsplittable slice or a splittable slice.
914 if (!P.SI->isSplittable()) {
915 // When we're forming an unsplittable region, it must always start at
916 // the first slice and will extend through its end.
917 assert(P.BeginOffset == P.SI->beginOffset());
918
919 // Form a partition including all of the overlapping slices with this
920 // unsplittable slice.
921 while (P.SJ != SE && P.SJ->beginOffset() < P.EndOffset) {
922 if (!P.SJ->isSplittable())
923 P.EndOffset = std::max(P.EndOffset, P.SJ->endOffset());
924 ++P.SJ;
925 }
926
927 // We have a partition across a set of overlapping unsplittable
928 // partitions.
929 return;
930 }
931
932 // If we're starting with a splittable slice, then we need to form
933 // a synthetic partition spanning it and any other overlapping splittable
934 // splices.
935 assert(P.SI->isSplittable() && "Forming a splittable partition!");
936
937 // Collect all of the overlapping splittable slices.
938 while (P.SJ != SE && P.SJ->beginOffset() < P.EndOffset &&
939 P.SJ->isSplittable()) {
940 P.EndOffset = std::max(P.EndOffset, P.SJ->endOffset());
941 ++P.SJ;
942 }
943
944 // Back upiP.EndOffset if we ended the span early when encountering an
945 // unsplittable slice. This synthesizes the early end offset of
946 // a partition spanning only splittable slices.
947 if (P.SJ != SE && P.SJ->beginOffset() < P.EndOffset) {
948 assert(!P.SJ->isSplittable());
949 P.EndOffset = P.SJ->beginOffset();
950 }
951 }
952
953public:
954 bool operator==(const partition_iterator &RHS) const {
955 assert(SE == RHS.SE &&
956 "End iterators don't match between compared partition iterators!");
957
958 // The observed positions of partitions is marked by the P.SI iterator and
959 // the emptiness of the split slices. The latter is only relevant when
960 // P.SI == SE, as the end iterator will additionally have an empty split
961 // slices list, but the prior may have the same P.SI and a tail of split
962 // slices.
963 if (P.SI == RHS.P.SI && P.SplitTails.empty() == RHS.P.SplitTails.empty()) {
964 assert(P.SJ == RHS.P.SJ &&
965 "Same set of slices formed two different sized partitions!");
966 assert(P.SplitTails.size() == RHS.P.SplitTails.size() &&
967 "Same slice position with differently sized non-empty split "
968 "slice tails!");
969 return true;
970 }
971 return false;
972 }
973
974 partition_iterator &operator++() {
975 advance();
976 return *this;
977 }
978
979 Partition &operator*() { return P; }
980};
981
982/// A forward range over the partitions of the alloca's slices.
983///
984/// This accesses an iterator range over the partitions of the alloca's
985/// slices. It computes these partitions on the fly based on the overlapping
986/// offsets of the slices and the ability to split them. It will visit "empty"
987/// partitions to cover regions of the alloca only accessed via split
988/// slices.
989iterator_range<AllocaSlices::partition_iterator> AllocaSlices::partitions() {
990 return make_range(partition_iterator(begin(), end()),
991 partition_iterator(end(), end()));
992}
993
995 // If the condition being selected on is a constant or the same value is
996 // being selected between, fold the select. Yes this does (rarely) happen
997 // early on.
998 if (ConstantInt *CI = dyn_cast<ConstantInt>(SI.getCondition()))
999 return SI.getOperand(1 + CI->isZero());
1000 if (SI.getOperand(1) == SI.getOperand(2))
1001 return SI.getOperand(1);
1002
1003 return nullptr;
1004}
1005
1006/// A helper that folds a PHI node or a select.
1008 if (PHINode *PN = dyn_cast<PHINode>(&I)) {
1009 // If PN merges together the same value, return that value.
1010 return PN->hasConstantValue();
1011 }
1013}
1014
1015/// Builder for the alloca slices.
1016///
1017/// This class builds a set of alloca slices by recursively visiting the uses
1018/// of an alloca and making a slice for each load and store at each offset.
1019class AllocaSlices::SliceBuilder : public PtrUseVisitor<SliceBuilder> {
1020 friend class PtrUseVisitor<SliceBuilder>;
1021 friend class InstVisitor<SliceBuilder>;
1022
1023 using Base = PtrUseVisitor<SliceBuilder>;
1024
1025 const uint64_t AllocSize;
1026 AllocaSlices &AS;
1027
1028 SmallDenseMap<Instruction *, unsigned> MemTransferSliceMap;
1030
1031 /// Set to de-duplicate dead instructions found in the use walk.
1032 SmallPtrSet<Instruction *, 4> VisitedDeadInsts;
1033
1034public:
1035 SliceBuilder(const DataLayout &DL, AllocaInst &AI, AllocaSlices &AS)
1037 AllocSize(AI.getAllocationSize(DL)->getFixedValue()), AS(AS) {}
1038
1039private:
1040 void markAsDead(Instruction &I) {
1041 if (VisitedDeadInsts.insert(&I).second)
1042 AS.DeadUsers.push_back(&I);
1043 }
1044
1045 void insertUse(Instruction &I, const APInt &Offset, uint64_t Size,
1046 bool IsSplittable = false) {
1047 // Completely skip uses which have a zero size or start either before or
1048 // past the end of the allocation.
1049 if (Size == 0 || Offset.uge(AllocSize)) {
1050 LLVM_DEBUG(dbgs() << "WARNING: Ignoring " << Size << " byte use @"
1051 << Offset
1052 << " which has zero size or starts outside of the "
1053 << AllocSize << " byte alloca:\n"
1054 << " alloca: " << AS.AI << "\n"
1055 << " use: " << I << "\n");
1056 return markAsDead(I);
1057 }
1058
1059 uint64_t BeginOffset = Offset.getZExtValue();
1060 uint64_t EndOffset = BeginOffset + Size;
1061
1062 // Clamp the end offset to the end of the allocation. Note that this is
1063 // formulated to handle even the case where "BeginOffset + Size" overflows.
1064 // This may appear superficially to be something we could ignore entirely,
1065 // but that is not so! There may be widened loads or PHI-node uses where
1066 // some instructions are dead but not others. We can't completely ignore
1067 // them, and so have to record at least the information here.
1068 assert(AllocSize >= BeginOffset); // Established above.
1069 if (Size > AllocSize - BeginOffset) {
1070 LLVM_DEBUG(dbgs() << "WARNING: Clamping a " << Size << " byte use @"
1071 << Offset << " to remain within the " << AllocSize
1072 << " byte alloca:\n"
1073 << " alloca: " << AS.AI << "\n"
1074 << " use: " << I << "\n");
1075 EndOffset = AllocSize;
1076 }
1077
1078 AS.Slices.push_back(Slice(BeginOffset, EndOffset, U, IsSplittable));
1079 }
1080
1081 void visitBitCastInst(BitCastInst &BC) {
1082 if (BC.use_empty())
1083 return markAsDead(BC);
1084
1085 return Base::visitBitCastInst(BC);
1086 }
1087
1088 void visitAddrSpaceCastInst(AddrSpaceCastInst &ASC) {
1089 if (ASC.use_empty())
1090 return markAsDead(ASC);
1091
1092 return Base::visitAddrSpaceCastInst(ASC);
1093 }
1094
1095 void visitGetElementPtrInst(GetElementPtrInst &GEPI) {
1096 if (GEPI.use_empty())
1097 return markAsDead(GEPI);
1098
1099 return Base::visitGetElementPtrInst(GEPI);
1100 }
1101
1102 void handleLoadOrStore(Type *Ty, Instruction &I, const APInt &Offset,
1103 uint64_t Size, bool IsVolatile) {
1104 // We allow splitting of non-volatile loads and stores where the type is an
1105 // integer type. These may be used to implement 'memcpy' or other "transfer
1106 // of bits" patterns.
1107 bool IsSplittable =
1108 Ty->isIntegerTy() && !IsVolatile && DL.typeSizeEqualsStoreSize(Ty);
1109
1110 insertUse(I, Offset, Size, IsSplittable);
1111 }
1112
1113 void visitLoadInst(LoadInst &LI) {
1114 assert((!LI.isSimple() || LI.getType()->isSingleValueType()) &&
1115 "All simple FCA loads should have been pre-split");
1116
1117 // If there is a load with an unknown offset, we can still perform store
1118 // to load forwarding for other known-offset loads.
1119 if (!IsOffsetKnown)
1120 return PI.setEscapedReadOnly(&LI);
1121
1122 TypeSize Size = DL.getTypeStoreSize(LI.getType());
1123 if (Size.isScalable()) {
1124 unsigned VScale = LI.getFunction()->getVScaleValue();
1125 if (!VScale)
1126 return PI.setAborted(&LI);
1127
1128 Size = TypeSize::getFixed(Size.getKnownMinValue() * VScale);
1129 }
1130
1131 return handleLoadOrStore(LI.getType(), LI, Offset, Size.getFixedValue(),
1132 LI.isVolatile());
1133 }
1134
1135 void visitStoreInst(StoreInst &SI) {
1136 Value *ValOp = SI.getValueOperand();
1137 if (ValOp == *U)
1138 return PI.setEscapedAndAborted(&SI);
1139 if (!IsOffsetKnown)
1140 return PI.setAborted(&SI);
1141
1142 TypeSize StoreSize = DL.getTypeStoreSize(ValOp->getType());
1143 if (StoreSize.isScalable()) {
1144 unsigned VScale = SI.getFunction()->getVScaleValue();
1145 if (!VScale)
1146 return PI.setAborted(&SI);
1147
1148 StoreSize = TypeSize::getFixed(StoreSize.getKnownMinValue() * VScale);
1149 }
1150
1151 uint64_t Size = StoreSize.getFixedValue();
1152
1153 // If this memory access can be shown to *statically* extend outside the
1154 // bounds of the allocation, it's behavior is undefined, so simply
1155 // ignore it. Note that this is more strict than the generic clamping
1156 // behavior of insertUse. We also try to handle cases which might run the
1157 // risk of overflow.
1158 // FIXME: We should instead consider the pointer to have escaped if this
1159 // function is being instrumented for addressing bugs or race conditions.
1160 if (Size > AllocSize || Offset.ugt(AllocSize - Size)) {
1161 LLVM_DEBUG(dbgs() << "WARNING: Ignoring " << Size << " byte store @"
1162 << Offset << " which extends past the end of the "
1163 << AllocSize << " byte alloca:\n"
1164 << " alloca: " << AS.AI << "\n"
1165 << " use: " << SI << "\n");
1166 return markAsDead(SI);
1167 }
1168
1169 assert((!SI.isSimple() || ValOp->getType()->isSingleValueType()) &&
1170 "All simple FCA stores should have been pre-split");
1171 handleLoadOrStore(ValOp->getType(), SI, Offset, Size, SI.isVolatile());
1172 }
1173
1174 void visitMemSetInst(MemSetInst &II) {
1175 assert(II.getRawDest() == *U && "Pointer use is not the destination?");
1176 ConstantInt *Length = dyn_cast<ConstantInt>(II.getLength());
1177 if ((Length && Length->getValue() == 0) ||
1178 (IsOffsetKnown && Offset.uge(AllocSize)))
1179 // Zero-length mem transfer intrinsics can be ignored entirely.
1180 return markAsDead(II);
1181
1182 if (!IsOffsetKnown)
1183 return PI.setAborted(&II);
1184
1185 insertUse(II, Offset,
1186 Length ? Length->getLimitedValue()
1187 : AllocSize - Offset.getLimitedValue(),
1188 (bool)Length);
1189 }
1190
1191 void visitMemTransferInst(MemTransferInst &II) {
1192 ConstantInt *Length = dyn_cast<ConstantInt>(II.getLength());
1193 if (Length && Length->getValue() == 0)
1194 // Zero-length mem transfer intrinsics can be ignored entirely.
1195 return markAsDead(II);
1196
1197 // Because we can visit these intrinsics twice, also check to see if the
1198 // first time marked this instruction as dead. If so, skip it.
1199 if (VisitedDeadInsts.count(&II))
1200 return;
1201
1202 if (!IsOffsetKnown)
1203 return PI.setAborted(&II);
1204
1205 // This side of the transfer is completely out-of-bounds, and so we can
1206 // nuke the entire transfer. However, we also need to nuke the other side
1207 // if already added to our partitions.
1208 // FIXME: Yet another place we really should bypass this when
1209 // instrumenting for ASan.
1210 if (Offset.uge(AllocSize)) {
1211 auto MTPI = MemTransferSliceMap.find(&II);
1212 if (MTPI != MemTransferSliceMap.end())
1213 AS.Slices[MTPI->second].kill();
1214 return markAsDead(II);
1215 }
1216
1217 uint64_t RawOffset = Offset.getLimitedValue();
1218 uint64_t Size = Length ? Length->getLimitedValue() : AllocSize - RawOffset;
1219
1220 // Check for the special case where the same exact value is used for both
1221 // source and dest.
1222 if (*U == II.getRawDest() && *U == II.getRawSource()) {
1223 // For non-volatile transfers this is a no-op.
1224 if (!II.isVolatile())
1225 return markAsDead(II);
1226
1227 return insertUse(II, Offset, Size, /*IsSplittable=*/false);
1228 }
1229
1230 // If we have seen both source and destination for a mem transfer, then
1231 // they both point to the same alloca.
1232 bool Inserted;
1233 SmallDenseMap<Instruction *, unsigned>::iterator MTPI;
1234 std::tie(MTPI, Inserted) =
1235 MemTransferSliceMap.insert(std::make_pair(&II, AS.Slices.size()));
1236 unsigned PrevIdx = MTPI->second;
1237 if (!Inserted) {
1238 Slice &PrevP = AS.Slices[PrevIdx];
1239
1240 // Check if the begin offsets match and this is a non-volatile transfer.
1241 // In that case, we can completely elide the transfer.
1242 if (!II.isVolatile() && PrevP.beginOffset() == RawOffset) {
1243 PrevP.kill();
1244 return markAsDead(II);
1245 }
1246
1247 // Otherwise we have an offset transfer within the same alloca. We can't
1248 // split those.
1249 PrevP.makeUnsplittable();
1250 }
1251
1252 // Insert the use now that we've fixed up the splittable nature.
1253 insertUse(II, Offset, Size, /*IsSplittable=*/Inserted && Length);
1254
1255 // Check that we ended up with a valid index in the map.
1256 assert(AS.Slices[PrevIdx].getUse()->getUser() == &II &&
1257 "Map index doesn't point back to a slice with this user.");
1258 }
1259
1260 // Disable SRoA for any intrinsics except for lifetime invariants.
1261 // FIXME: What about debug intrinsics? This matches old behavior, but
1262 // doesn't make sense.
1263 void visitIntrinsicInst(IntrinsicInst &II) {
1264 if (II.isDroppable()) {
1265 AS.DeadUseIfPromotable.push_back(U);
1266 return;
1267 }
1268
1269 if (!IsOffsetKnown)
1270 return PI.setAborted(&II);
1271
1272 if (II.isLifetimeStartOrEnd()) {
1273 insertUse(II, Offset, AllocSize, true);
1274 return;
1275 }
1276
1277 Base::visitIntrinsicInst(II);
1278 }
1279
1280 Instruction *hasUnsafePHIOrSelectUse(Instruction *Root, uint64_t &Size) {
1281 // We consider any PHI or select that results in a direct load or store of
1282 // the same offset to be a viable use for slicing purposes. These uses
1283 // are considered unsplittable and the size is the maximum loaded or stored
1284 // size.
1285 SmallPtrSet<Instruction *, 4> Visited;
1287 Visited.insert(Root);
1288 Uses.push_back(std::make_pair(cast<Instruction>(*U), Root));
1289 const DataLayout &DL = Root->getDataLayout();
1290 // If there are no loads or stores, the access is dead. We mark that as
1291 // a size zero access.
1292 Size = 0;
1293 do {
1294 Instruction *I, *UsedI;
1295 std::tie(UsedI, I) = Uses.pop_back_val();
1296
1297 if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
1298 TypeSize LoadSize = DL.getTypeStoreSize(LI->getType());
1299 if (LoadSize.isScalable()) {
1300 PI.setAborted(LI);
1301 return nullptr;
1302 }
1303 Size = std::max(Size, LoadSize.getFixedValue());
1304 continue;
1305 }
1306 if (StoreInst *SI = dyn_cast<StoreInst>(I)) {
1307 Value *Op = SI->getOperand(0);
1308 if (Op == UsedI)
1309 return SI;
1310 TypeSize StoreSize = DL.getTypeStoreSize(Op->getType());
1311 if (StoreSize.isScalable()) {
1312 PI.setAborted(SI);
1313 return nullptr;
1314 }
1315 Size = std::max(Size, StoreSize.getFixedValue());
1316 continue;
1317 }
1318
1319 if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(I)) {
1320 if (!GEP->hasAllZeroIndices())
1321 return GEP;
1322 } else if (!isa<BitCastInst>(I) && !isa<PHINode>(I) &&
1324 return I;
1325 }
1326
1327 for (User *U : I->users())
1328 if (Visited.insert(cast<Instruction>(U)).second)
1329 Uses.push_back(std::make_pair(I, cast<Instruction>(U)));
1330 } while (!Uses.empty());
1331
1332 return nullptr;
1333 }
1334
1335 void visitPHINodeOrSelectInst(Instruction &I) {
1337 if (I.use_empty())
1338 return markAsDead(I);
1339
1340 // If this is a PHI node before a catchswitch, we cannot insert any non-PHI
1341 // instructions in this BB, which may be required during rewriting. Bail out
1342 // on these cases.
1343 if (isa<PHINode>(I) && !I.getParent()->hasInsertionPt())
1344 return PI.setAborted(&I);
1345
1346 // TODO: We could use simplifyInstruction here to fold PHINodes and
1347 // SelectInsts. However, doing so requires to change the current
1348 // dead-operand-tracking mechanism. For instance, suppose neither loading
1349 // from %U nor %other traps. Then "load (select undef, %U, %other)" does not
1350 // trap either. However, if we simply replace %U with undef using the
1351 // current dead-operand-tracking mechanism, "load (select undef, undef,
1352 // %other)" may trap because the select may return the first operand
1353 // "undef".
1354 if (Value *Result = foldPHINodeOrSelectInst(I)) {
1355 if (Result == *U)
1356 // If the result of the constant fold will be the pointer, recurse
1357 // through the PHI/select as if we had RAUW'ed it.
1358 enqueueUsers(I);
1359 else
1360 // Otherwise the operand to the PHI/select is dead, and we can replace
1361 // it with poison.
1362 AS.DeadOperands.push_back(U);
1363
1364 return;
1365 }
1366
1367 if (!IsOffsetKnown)
1368 return PI.setAborted(&I);
1369
1370 // See if we already have computed info on this node.
1371 uint64_t &Size = PHIOrSelectSizes[&I];
1372 if (!Size) {
1373 // This is a new PHI/Select, check for an unsafe use of it.
1374 if (Instruction *UnsafeI = hasUnsafePHIOrSelectUse(&I, Size))
1375 return PI.setAborted(UnsafeI);
1376 }
1377
1378 // For PHI and select operands outside the alloca, we can't nuke the entire
1379 // phi or select -- the other side might still be relevant, so we special
1380 // case them here and use a separate structure to track the operands
1381 // themselves which should be replaced with poison.
1382 // FIXME: This should instead be escaped in the event we're instrumenting
1383 // for address sanitization.
1384 if (Offset.uge(AllocSize)) {
1385 AS.DeadOperands.push_back(U);
1386 return;
1387 }
1388
1389 insertUse(I, Offset, Size);
1390 }
1391
1392 void visitPHINode(PHINode &PN) { visitPHINodeOrSelectInst(PN); }
1393
1394 void visitSelectInst(SelectInst &SI) { visitPHINodeOrSelectInst(SI); }
1395
1396 /// Disable SROA entirely if there are unhandled users of the alloca.
1397 void visitInstruction(Instruction &I) { PI.setAborted(&I); }
1398
1399 void visitCallBase(CallBase &CB) {
1400 // If the call operand is read-only and only does a read-only or address
1401 // capture, then we mark it as EscapedReadOnly.
1402 if (CB.isDataOperand(U) &&
1403 !capturesFullProvenance(CB.getCaptureInfo(U->getOperandNo())) &&
1404 CB.onlyReadsMemory(U->getOperandNo())) {
1405 PI.setEscapedReadOnly(&CB);
1406 return;
1407 }
1408
1409 Base::visitCallBase(CB);
1410 }
1411};
1412
1413AllocaSlices::AllocaSlices(const DataLayout &DL, AllocaInst &AI)
1414 :
1415#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1416 AI(AI),
1417#endif
1418 PointerEscapingInstr(nullptr), PointerEscapingInstrReadOnly(nullptr) {
1419 SliceBuilder PB(DL, AI, *this);
1420 SliceBuilder::PtrInfo PtrI = PB.visitPtr(AI);
1421 if (PtrI.isEscaped() || PtrI.isAborted()) {
1422 // FIXME: We should sink the escape vs. abort info into the caller nicely,
1423 // possibly by just storing the PtrInfo in the AllocaSlices.
1424 PointerEscapingInstr = PtrI.getEscapingInst() ? PtrI.getEscapingInst()
1425 : PtrI.getAbortingInst();
1426 assert(PointerEscapingInstr && "Did not track a bad instruction");
1427 return;
1428 }
1429 PointerEscapingInstrReadOnly = PtrI.getEscapedReadOnlyInst();
1430
1431 llvm::erase_if(Slices, [](const Slice &S) { return S.isDead(); });
1432
1433 // Sort the uses. This arranges for the offsets to be in ascending order,
1434 // and the sizes to be in descending order.
1435 llvm::stable_sort(Slices);
1436}
1437
1438#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1439
1440void AllocaSlices::print(raw_ostream &OS, const_iterator I,
1441 StringRef Indent) const {
1442 printSlice(OS, I, Indent);
1443 OS << "\n";
1444 printUse(OS, I, Indent);
1445}
1446
1447void AllocaSlices::printSlice(raw_ostream &OS, const_iterator I,
1448 StringRef Indent) const {
1449 OS << Indent << "[" << I->beginOffset() << "," << I->endOffset() << ")"
1450 << " slice #" << (I - begin())
1451 << (I->isSplittable() ? " (splittable)" : "");
1452}
1453
1454void AllocaSlices::printUse(raw_ostream &OS, const_iterator I,
1455 StringRef Indent) const {
1456 OS << Indent << " used by: " << *I->getUse()->getUser() << "\n";
1457}
1458
1459void AllocaSlices::print(raw_ostream &OS) const {
1460 if (PointerEscapingInstr) {
1461 OS << "Can't analyze slices for alloca: " << AI << "\n"
1462 << " A pointer to this alloca escaped by:\n"
1463 << " " << *PointerEscapingInstr << "\n";
1464 return;
1465 }
1466
1467 if (PointerEscapingInstrReadOnly)
1468 OS << "Escapes into ReadOnly: " << *PointerEscapingInstrReadOnly << "\n";
1469
1470 OS << "Slices of alloca: " << AI << "\n";
1471 for (const_iterator I = begin(), E = end(); I != E; ++I)
1472 print(OS, I);
1473}
1474
1475LLVM_DUMP_METHOD void AllocaSlices::dump(const_iterator I) const {
1476 print(dbgs(), I);
1477}
1478LLVM_DUMP_METHOD void AllocaSlices::dump() const { print(dbgs()); }
1479
1480#endif // !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1481
1482/// Find a common load/store type used through a pointer PHI or select.
1483///
1484/// Look through a PHI or select to see if all of its users are loads or stores
1485/// of one common type. Whether those accesses can be speculated does not affect
1486/// the type they use and is checked separately when attempting promotion.
1488 assert((isa<PHINode, SelectInst>(I)) && "expected a PHI or select");
1489 Type *Ty = nullptr;
1490
1491 for (User *U : I.users()) {
1492 Type *UserTy = nullptr;
1493 if (auto *LI = dyn_cast<LoadInst>(U))
1494 UserTy = LI->getType();
1495 else if (auto *Store = dyn_cast<StoreInst>(U))
1496 // Slice building rejects stores of the PHI-or-select-derived pointer, so
1497 // it must be the store's pointer operand here.
1498 UserTy = Store->getValueOperand()->getType();
1499
1500 if (!UserTy || (Ty && Ty != UserTy))
1501 return nullptr;
1502 Ty = UserTy;
1503 }
1504
1505 return Ty;
1506}
1507
1508/// Walk the range of a partitioning looking for a common type to cover this
1509/// sequence of slices.
1510static std::pair<Type *, IntegerType *>
1511findCommonType(AllocaSlices::const_iterator B, AllocaSlices::const_iterator E,
1512 uint64_t EndOffset) {
1513 Type *Ty = nullptr;
1514 bool TyIsCommon = true;
1515 IntegerType *ITy = nullptr;
1516
1517 // Note that we need to look at *every* alloca slice's Use to ensure we
1518 // always get consistent results regardless of the order of slices.
1519 for (AllocaSlices::const_iterator I = B; I != E; ++I) {
1520 Use *U = I->getUse();
1521 if (isa<IntrinsicInst>(*U->getUser()))
1522 continue;
1523 if (I->beginOffset() != B->beginOffset() || I->endOffset() != EndOffset)
1524 continue;
1525
1526 Type *UserTy = nullptr;
1527 if (LoadInst *LI = dyn_cast<LoadInst>(U->getUser())) {
1528 UserTy = LI->getType();
1529 } else if (StoreInst *SI = dyn_cast<StoreInst>(U->getUser())) {
1530 UserTy = SI->getValueOperand()->getType();
1531 } else if (isa<PHINode, SelectInst>(U->getUser())) {
1532 UserTy =
1534 }
1535
1536 if (IntegerType *UserITy = dyn_cast_or_null<IntegerType>(UserTy)) {
1537 // If the type is larger than the partition, skip it. We only encounter
1538 // this for split integer operations where we want to use the type of the
1539 // entity causing the split. Also skip if the type is not a byte width
1540 // multiple.
1541 if (UserITy->getBitWidth() % 8 != 0 ||
1542 UserITy->getBitWidth() / 8 > (EndOffset - B->beginOffset()))
1543 continue;
1544
1545 // Track the largest bitwidth integer type used in this way in case there
1546 // is no common type.
1547 if (!ITy || ITy->getBitWidth() < UserITy->getBitWidth())
1548 ITy = UserITy;
1549 }
1550
1551 // To avoid depending on the order of slices, Ty and TyIsCommon must not
1552 // depend on types skipped above.
1553 if (!UserTy || (Ty && Ty != UserTy))
1554 TyIsCommon = false; // Give up on anything but an iN type.
1555 else
1556 Ty = UserTy;
1557 }
1558
1559 return {TyIsCommon ? Ty : nullptr, ITy};
1560}
1561
1562/// PHI instructions that use an alloca and are subsequently loaded can be
1563/// rewritten to load both input pointers in the pred blocks and then PHI the
1564/// results, allowing the load of the alloca to be promoted.
1565/// From this:
1566/// %P2 = phi [i32* %Alloca, i32* %Other]
1567/// %V = load i32* %P2
1568/// to:
1569/// %V1 = load i32* %Alloca -> will be mem2reg'd
1570/// ...
1571/// %V2 = load i32* %Other
1572/// ...
1573/// %V = phi [i32 %V1, i32 %V2]
1574///
1575/// We can do this to a PHI if its only uses are loads and if any loads moved
1576/// across other outgoing edges can be executed unconditionally.
1577///
1578/// FIXME: This should be hoisted into a generic utility, likely in
1579/// Transforms/Util/Local.h
1581 const DataLayout &DL = PN.getDataLayout();
1582
1583 // For now, we can only do this promotion if the load is in the same block
1584 // as the PHI, and if there are no stores between the phi and load.
1585 // TODO: Allow recursive phi users.
1586 BasicBlock *BB = PN.getParent();
1587 Align MaxAlign;
1588 uint64_t APWidth = DL.getIndexTypeSizeInBits(PN.getType());
1589 Type *LoadType = nullptr;
1590 for (User *U : PN.users()) {
1592 if (!LI || !LI->isSimple())
1593 return false;
1594
1595 // For now we only allow loads in the same block as the PHI. This is
1596 // a common case that happens when instcombine merges two loads through
1597 // a PHI.
1598 if (LI->getParent() != BB)
1599 return false;
1600
1601 if (LoadType) {
1602 if (LoadType != LI->getType())
1603 return false;
1604 } else {
1605 LoadType = LI->getType();
1606 }
1607
1608 // Ensure that there are no instructions between the PHI and the load that
1609 // could store.
1610 for (BasicBlock::iterator BBI(PN); &*BBI != LI; ++BBI)
1611 if (BBI->mayWriteToMemory())
1612 return false;
1613
1614 MaxAlign = std::max(MaxAlign, LI->getAlign());
1615 }
1616
1617 if (!LoadType)
1618 return false;
1619
1620 APInt LoadSize =
1621 APInt(APWidth, DL.getTypeStoreSize(LoadType).getFixedValue());
1622
1623 // We can only transform this if it is safe to push the loads into the
1624 // predecessor blocks. The only thing to watch out for is that we can't put
1625 // a possibly trapping load in the predecessor if it is a critical edge.
1626 for (unsigned Idx = 0, Num = PN.getNumIncomingValues(); Idx != Num; ++Idx) {
1628 Value *InVal = PN.getIncomingValue(Idx);
1629
1630 // If the value is produced by the terminator of the predecessor (an
1631 // invoke) or it has side-effects, there is no valid place to put a load
1632 // in the predecessor.
1633 if (TI == InVal || TI->mayHaveSideEffects())
1634 return false;
1635
1636 // If the predecessor has a single successor, then the edge isn't
1637 // critical.
1638 if (TI->getNumSuccessors() == 1)
1639 continue;
1640
1641 // If this pointer is always safe to load, or if we can prove that there
1642 // is already a load in the block, then we can move the load to the pred
1643 // block.
1644 if (isSafeToLoadUnconditionally(InVal, MaxAlign, LoadSize,
1645 SimplifyQuery(DL, TI)))
1646 continue;
1647
1648 return false;
1649 }
1650
1651 return true;
1652}
1653
1654/// Check whether a single store through PN can be moved onto each incoming
1655/// edge.
1656static StoreInst *getPHIStoreToRewrite(PHINode &PN, bool PreserveCFG,
1657 DominatorTree &DT) {
1658 // TODO: Support multiple stores and mixed load/store users.
1659 // TODO: Look through other instructions, such as other phis or addrspacecasts
1660 if (!PN.hasOneUse())
1661 return nullptr;
1662
1663 auto *SI = dyn_cast<StoreInst>(PN.user_back());
1664 if (!SI || SI->getPointerOperand() != &PN)
1665 return nullptr;
1666
1667 if (SI->isVolatile())
1668 return nullptr;
1669
1670 BasicBlock *BB = PN.getParent();
1671 // TODO: Allow a harmless prefix between the PHIs and the store.
1672 if (&*BB->getFirstNonPHIOrDbg() != SI)
1673 return nullptr;
1674
1675 Value *StoredValue = SI->getValueOperand();
1677 for (unsigned Idx = 0, Num = PN.getNumIncomingValues(); Idx != Num; ++Idx) {
1678 BasicBlock *Pred = PN.getIncomingBlock(Idx);
1679
1680 // Only one store is needed for duplicate edges from the same predecessor.
1681 if (!SeenPreds.insert(Pred).second)
1682 continue;
1683
1684 // TODO: Support other terminators.
1685 Instruction *TI = Pred->getTerminator();
1687 return nullptr;
1688
1689 if (Pred == BB)
1690 return nullptr;
1691
1692 // TODO: If StoredValue is another PHI in BB, use its corresponding
1693 // incoming value instead of requiring it to dominate every predecessor.
1694 if (!DT.dominates(StoredValue, TI))
1695 return nullptr;
1696
1697 if (TI->getNumSuccessors() == 1)
1698 continue;
1699
1700 // If the predecessor has more than one successor, then we will need to
1701 // split it so that we can insert the store only on the path to this BB.
1702 if (PreserveCFG || !BB->canSplitPredecessors())
1703 return nullptr;
1704 }
1705
1706 return SI;
1707}
1708
1709static void speculatePHINodeLoads(IRBuilderTy &IRB, PHINode &PN) {
1710 LLVM_DEBUG(dbgs() << " original: " << PN << "\n");
1711
1712 LoadInst *SomeLoad = cast<LoadInst>(PN.user_back());
1713 Type *LoadTy = SomeLoad->getType();
1714 IRB.SetInsertPoint(&PN);
1715 PHINode *NewPN = IRB.CreatePHI(LoadTy, PN.getNumIncomingValues(),
1716 PN.getName() + ".sroa.speculated");
1717
1718 // Get the AA tags and alignment to use from one of the loads. It does not
1719 // matter which one we get and if any differ.
1720 AAMDNodes AATags = SomeLoad->getAAMetadata();
1721 Align Alignment = SomeLoad->getAlign();
1722
1723 // Rewrite all loads of the PN to use the new PHI.
1724 while (!PN.use_empty()) {
1725 LoadInst *LI = cast<LoadInst>(PN.user_back());
1726 LI->replaceAllUsesWith(NewPN);
1727 LI->eraseFromParent();
1728 }
1729
1730 // Inject loads into all of the pred blocks.
1731 DenseMap<BasicBlock *, Value *> InjectedLoads;
1732 for (unsigned Idx = 0, Num = PN.getNumIncomingValues(); Idx != Num; ++Idx) {
1733 BasicBlock *Pred = PN.getIncomingBlock(Idx);
1734 Value *InVal = PN.getIncomingValue(Idx);
1735
1736 // A PHI node is allowed to have multiple (duplicated) entries for the same
1737 // basic block, as long as the value is the same. So if we already injected
1738 // a load in the predecessor, then we should reuse the same load for all
1739 // duplicated entries.
1740 if (Value *V = InjectedLoads.lookup(Pred)) {
1741 NewPN->addIncoming(V, Pred);
1742 continue;
1743 }
1744
1745 Instruction *TI = Pred->getTerminator();
1746 IRB.SetInsertPoint(TI);
1747
1748 LoadInst *Load = IRB.CreateAlignedLoad(
1749 LoadTy, InVal, Alignment,
1750 (PN.getName() + ".sroa.speculate.load." + Pred->getName()));
1751 ++NumLoadsSpeculated;
1752 if (AATags)
1753 Load->setAAMetadata(AATags);
1754 NewPN->addIncoming(Load, Pred);
1755 InjectedLoads[Pred] = Load;
1756 }
1757
1758 LLVM_DEBUG(dbgs() << " speculated to: " << *NewPN << "\n");
1759 PN.eraseFromParent();
1760}
1761
1762/// Move a store through a pointer PHI onto each of the PHI's incoming edges.
1763/// Returns whether this required modifying the CFG.
1766 LLVM_DEBUG(dbgs() << " original: " << PN << "\n"
1767 << " " << SI << "\n");
1768
1769 // Splitting one edge rewrites all PHIs in the destination block. Snapshot
1770 // the original predecessor/value pairs before making any CFG changes.
1773 for (unsigned Idx = 0, Num = PN.getNumIncomingValues(); Idx != Num; ++Idx) {
1774 BasicBlock *Pred = PN.getIncomingBlock(Idx);
1775 if (!SeenPreds.insert(Pred).second)
1776 continue;
1777 Value *InVal = PN.getIncomingValue(Idx);
1778 IncomingValues.emplace_back(Pred, InVal);
1779
1780 // Revisit every alloca exposed by removing the pointer PHI.
1781 if (auto *AI = dyn_cast<AllocaInst>(getUnderlyingObject(InVal)))
1782 Worklist.insert(AI);
1783 }
1784
1785 bool CFGChanged = false;
1786 BasicBlock *BB = PN.getParent();
1787 for (auto [Pred, InVal] : IncomingValues) {
1788 BasicBlock *StoreBB = Pred;
1789 if (Pred->getTerminator()->getNumSuccessors() != 1) {
1790 StoreBB = SplitBlockPredecessors(BB, {Pred}, ".sroa.store", &DTU);
1791 assert(StoreBB && "store edge was not checked for splitting");
1792 CFGChanged = true;
1793 }
1794
1795 auto *NewStore = cast<StoreInst>(SI.clone());
1796 NewStore->setOperand(StoreInst::getPointerOperandIndex(), InVal);
1797 NewStore->insertBefore(StoreBB->getTerminator()->getIterator());
1798 ++NumStoresPredicated;
1799 LLVM_DEBUG(dbgs() << " to: " << *NewStore << "\n");
1800 }
1801
1802 SI.eraseFromParent();
1803 PN.eraseFromParent();
1804 return CFGChanged;
1805}
1806
1807SelectHandSpeculativity &
1808SelectHandSpeculativity::setAsSpeculatable(bool isTrueVal) {
1809 if (isTrueVal)
1811 else
1813 return *this;
1814}
1815
1816bool SelectHandSpeculativity::isSpeculatable(bool isTrueVal) const {
1817 return isTrueVal ? Bitfield::get<SelectHandSpeculativity::TrueVal>(Storage)
1818 : Bitfield::get<SelectHandSpeculativity::FalseVal>(Storage);
1819}
1820
1821bool SelectHandSpeculativity::areAllSpeculatable() const {
1822 return isSpeculatable(/*isTrueVal=*/true) &&
1823 isSpeculatable(/*isTrueVal=*/false);
1824}
1825
1826bool SelectHandSpeculativity::areAnySpeculatable() const {
1827 return isSpeculatable(/*isTrueVal=*/true) ||
1828 isSpeculatable(/*isTrueVal=*/false);
1829}
1830bool SelectHandSpeculativity::areNoneSpeculatable() const {
1831 return !areAnySpeculatable();
1832}
1833
1834static SelectHandSpeculativity
1836 assert(LI.isSimple() && "Only for simple loads");
1837 SelectHandSpeculativity Spec;
1838
1839 const DataLayout &DL = SI.getDataLayout();
1840 for (Value *Value : {SI.getTrueValue(), SI.getFalseValue()})
1842 SimplifyQuery(DL, &LI)))
1843 Spec.setAsSpeculatable(/*isTrueVal=*/Value == SI.getTrueValue());
1844 else if (PreserveCFG)
1845 return Spec;
1846
1847 return Spec;
1848}
1849
1850std::optional<RewriteableMemOps>
1851SROA::isSafeSelectToSpeculate(SelectInst &SI, bool PreserveCFG) {
1852 RewriteableMemOps Ops;
1853
1854 for (User *U : SI.users()) {
1855 if (auto *Store = dyn_cast<StoreInst>(U)) {
1856 // Note that atomic stores can be transformed; atomic semantics do not
1857 // have any meaning for a local alloca. Stores are not speculatable,
1858 // however, so if we can't turn it into a predicated store, we are done.
1859 if (Store->isVolatile() || PreserveCFG)
1860 return {}; // Give up on this `select`.
1861 Ops.emplace_back(Store);
1862 continue;
1863 }
1864
1865 auto *LI = dyn_cast<LoadInst>(U);
1866
1867 // Note that atomic loads can be transformed;
1868 // atomic semantics do not have any meaning for a local alloca.
1869 if (!LI || LI->isVolatile())
1870 return {}; // Give up on this `select`.
1871
1872 PossiblySpeculatableLoad Load(LI);
1873 if (!LI->isSimple()) {
1874 // If the `load` is not simple, we can't speculatively execute it,
1875 // but we could handle this via a CFG modification. But can we?
1876 if (PreserveCFG)
1877 return {}; // Give up on this `select`.
1878 Ops.emplace_back(Load);
1879 continue;
1880 }
1881
1882 SelectHandSpeculativity Spec =
1883 isSafeLoadOfSelectToSpeculate(*LI, SI, PreserveCFG);
1884 if (PreserveCFG && !Spec.areAllSpeculatable())
1885 return {}; // Give up on this `select`.
1886
1887 Load.setInt(Spec);
1888 Ops.emplace_back(Load);
1889 }
1890
1891 return Ops;
1892}
1893
1895 IRBuilderTy &IRB) {
1896 LLVM_DEBUG(dbgs() << " original load: " << SI << "\n");
1897
1898 Value *TV = SI.getTrueValue();
1899 Value *FV = SI.getFalseValue();
1900 // Replace the given load of the select with a select of two loads.
1901
1902 assert(LI.isSimple() && "We only speculate simple loads");
1903
1904 IRB.SetInsertPoint(&LI);
1905
1906 LoadInst *TL =
1907 IRB.CreateAlignedLoad(LI.getType(), TV, LI.getAlign(),
1908 LI.getName() + ".sroa.speculate.load.true");
1909 LoadInst *FL =
1910 IRB.CreateAlignedLoad(LI.getType(), FV, LI.getAlign(),
1911 LI.getName() + ".sroa.speculate.load.false");
1912 NumLoadsSpeculated += 2;
1913
1914 // Transfer alignment and AA info if present.
1915 TL->setAlignment(LI.getAlign());
1916 FL->setAlignment(LI.getAlign());
1917
1918 AAMDNodes Tags = LI.getAAMetadata();
1919 if (Tags) {
1920 TL->setAAMetadata(Tags);
1921 FL->setAAMetadata(Tags);
1922 }
1923
1924 Value *V = IRB.CreateSelect(SI.getCondition(), TL, FL,
1925 LI.getName() + ".sroa.speculated", &SI);
1926
1927 LLVM_DEBUG(dbgs() << " speculated to: " << *V << "\n");
1928 LI.replaceAllUsesWith(V);
1929}
1930
1931template <typename T>
1933 SelectHandSpeculativity Spec,
1934 DomTreeUpdater &DTU) {
1935 assert((isa<LoadInst>(I) || isa<StoreInst>(I)) && "Only for load and store!");
1936 LLVM_DEBUG(dbgs() << " original mem op: " << I << "\n");
1937 BasicBlock *Head = I.getParent();
1938 Instruction *ThenTerm = nullptr;
1939 Instruction *ElseTerm = nullptr;
1940 if (Spec.areNoneSpeculatable())
1941 SplitBlockAndInsertIfThenElse(SI.getCondition(), &I, &ThenTerm, &ElseTerm,
1942 SI.getMetadata(LLVMContext::MD_prof), &DTU);
1943 else {
1944 SplitBlockAndInsertIfThen(SI.getCondition(), &I, /*Unreachable=*/false,
1945 SI.getMetadata(LLVMContext::MD_prof), &DTU,
1946 /*LI=*/nullptr, /*ThenBlock=*/nullptr);
1947 if (Spec.isSpeculatable(/*isTrueVal=*/true))
1948 cast<CondBrInst>(Head->getTerminator())->swapSuccessors();
1949 }
1950 auto *HeadBI = cast<CondBrInst>(Head->getTerminator());
1951 Spec = {}; // Do not use `Spec` beyond this point.
1952 BasicBlock *Tail = I.getParent();
1953 Tail->setName(Head->getName() + ".cont");
1954 PHINode *PN;
1955 if (isa<LoadInst>(I))
1956 PN = PHINode::Create(I.getType(), 2, "", I.getIterator());
1957 for (BasicBlock *SuccBB : successors(Head)) {
1958 bool IsThen = SuccBB == HeadBI->getSuccessor(0);
1959 int SuccIdx = IsThen ? 0 : 1;
1960 auto *NewMemOpBB = SuccBB == Tail ? Head : SuccBB;
1961 auto &CondMemOp = cast<T>(*I.clone());
1962 if (NewMemOpBB != Head) {
1963 NewMemOpBB->setName(Head->getName() + (IsThen ? ".then" : ".else"));
1964 if (isa<LoadInst>(I))
1965 ++NumLoadsPredicated;
1966 else
1967 ++NumStoresPredicated;
1968 } else {
1969 CondMemOp.dropUBImplyingAttrsAndMetadata();
1970 ++NumLoadsSpeculated;
1971 }
1972 CondMemOp.insertBefore(NewMemOpBB->getTerminator()->getIterator());
1973 Value *Ptr = SI.getOperand(1 + SuccIdx);
1974 CondMemOp.setOperand(I.getPointerOperandIndex(), Ptr);
1975 if (isa<LoadInst>(I)) {
1976 CondMemOp.setName(I.getName() + (IsThen ? ".then" : ".else") + ".val");
1977 PN->addIncoming(&CondMemOp, NewMemOpBB);
1978 } else
1979 LLVM_DEBUG(dbgs() << " to: " << CondMemOp << "\n");
1980 }
1981 if (isa<LoadInst>(I)) {
1982 PN->takeName(&I);
1983 LLVM_DEBUG(dbgs() << " to: " << *PN << "\n");
1984 I.replaceAllUsesWith(PN);
1985 }
1986}
1987
1989 SelectHandSpeculativity Spec,
1990 DomTreeUpdater &DTU) {
1991 if (auto *LI = dyn_cast<LoadInst>(&I))
1992 rewriteMemOpOfSelect(SelInst, *LI, Spec, DTU);
1993 else if (auto *SI = dyn_cast<StoreInst>(&I))
1994 rewriteMemOpOfSelect(SelInst, *SI, Spec, DTU);
1995 else
1996 llvm_unreachable_internal("Only for load and store.");
1997}
1998
2000 const RewriteableMemOps &Ops,
2001 IRBuilderTy &IRB, DomTreeUpdater *DTU) {
2002 bool CFGChanged = false;
2003 LLVM_DEBUG(dbgs() << " original select: " << SI << "\n");
2004
2005 for (const RewriteableMemOp &Op : Ops) {
2006 SelectHandSpeculativity Spec;
2007 Instruction *I;
2008 if (auto *const *US = std::get_if<UnspeculatableStore>(&Op)) {
2009 I = *US;
2010 } else {
2011 auto PSL = std::get<PossiblySpeculatableLoad>(Op);
2012 I = PSL.getPointer();
2013 Spec = PSL.getInt();
2014 }
2015 if (Spec.areAllSpeculatable()) {
2017 } else {
2018 assert(DTU && "Should not get here when not allowed to modify the CFG!");
2019 rewriteMemOpOfSelect(SI, *I, Spec, *DTU);
2020 CFGChanged = true;
2021 }
2022 I->eraseFromParent();
2023 }
2024
2025 for (User *U : make_early_inc_range(SI.users()))
2026 cast<BitCastInst>(U)->eraseFromParent();
2027 SI.eraseFromParent();
2028 return CFGChanged;
2029}
2030
2031/// Compute an adjusted pointer from Ptr by Offset bytes where the
2032/// resulting pointer has PointerTy.
2033static Value *getAdjustedPtr(IRBuilderTy &IRB, const DataLayout &DL, Value *Ptr,
2035 const Twine &NamePrefix) {
2036 if (Offset != 0)
2037 Ptr = IRB.CreateInBoundsPtrAdd(Ptr, IRB.getInt(Offset),
2038 NamePrefix + "sroa_idx");
2039 return IRB.CreatePointerBitCastOrAddrSpaceCast(Ptr, PointerTy,
2040 NamePrefix + "sroa_cast");
2041}
2042
2043/// Compute the adjusted alignment for a load or store from an offset.
2047
2048/// Test whether we can convert a value from the old to the new type.
2049///
2050/// This predicate should be used to guard calls to convertValue in order to
2051/// ensure that we only try to convert viable values. The strategy is that we
2052/// will peel off single element struct and array wrappings to get to an
2053/// underlying value, and convert that value.
2054static bool canConvertValue(const DataLayout &DL, Type *OldTy, Type *NewTy,
2055 unsigned VScale = 0) {
2056 if (OldTy == NewTy)
2057 return true;
2058
2059 // For integer types, we can't handle any bit-width differences. This would
2060 // break both vector conversions with extension and introduce endianness
2061 // issues when in conjunction with loads and stores.
2062 if (isa<IntegerType>(OldTy) && isa<IntegerType>(NewTy)) {
2064 cast<IntegerType>(NewTy)->getBitWidth() &&
2065 "We can't have the same bitwidth for different int types");
2066 return false;
2067 }
2068
2069 TypeSize NewSize = DL.getTypeSizeInBits(NewTy);
2070 TypeSize OldSize = DL.getTypeSizeInBits(OldTy);
2071
2072 if ((isa<ScalableVectorType>(NewTy) && isa<FixedVectorType>(OldTy)) ||
2073 (isa<ScalableVectorType>(OldTy) && isa<FixedVectorType>(NewTy))) {
2074 // Conversion is only possible when the size of scalable vectors is known.
2075 if (!VScale)
2076 return false;
2077
2078 // For ptr-to-int and int-to-ptr casts, the pointer side is resolved within
2079 // a single domain (either fixed or scalable). Any additional conversion
2080 // between fixed and scalable types is handled through integer types.
2081 auto OldVTy = OldTy->isPtrOrPtrVectorTy() ? DL.getIntPtrType(OldTy) : OldTy;
2082 auto NewVTy = NewTy->isPtrOrPtrVectorTy() ? DL.getIntPtrType(NewTy) : NewTy;
2083
2084 if (isa<ScalableVectorType>(NewTy)) {
2086 return false;
2087
2088 NewSize = TypeSize::getFixed(NewSize.getKnownMinValue() * VScale);
2089 } else {
2091 return false;
2092
2093 OldSize = TypeSize::getFixed(OldSize.getKnownMinValue() * VScale);
2094 }
2095 }
2096
2097 if (NewSize != OldSize)
2098 return false;
2099 if (!NewTy->isSingleValueType() || !OldTy->isSingleValueType())
2100 return false;
2101
2102 // We can convert pointers to integers and vice-versa. Same for vectors
2103 // of pointers and integers.
2104 OldTy = OldTy->getScalarType();
2105 NewTy = NewTy->getScalarType();
2106 if (NewTy->isPointerTy() || OldTy->isPointerTy()) {
2107 if (NewTy->isPointerTy() && OldTy->isPointerTy()) {
2108 unsigned OldAS = OldTy->getPointerAddressSpace();
2109 unsigned NewAS = NewTy->getPointerAddressSpace();
2110 // Convert pointers if they are pointers from the same address space or
2111 // different integral (not non-integral) address spaces with the same
2112 // pointer size.
2113 return OldAS == NewAS ||
2114 (!DL.isNonIntegralAddressSpace(OldAS) &&
2115 !DL.isNonIntegralAddressSpace(NewAS) &&
2116 DL.getPointerSize(OldAS) == DL.getPointerSize(NewAS));
2117 }
2118
2119 // We can convert integers to integral pointers, but not to non-integral
2120 // pointers.
2121 if (OldTy->isIntegerTy())
2122 return !DL.isNonIntegralPointerType(NewTy);
2123
2124 // We can convert integral pointers to integers, but non-integral pointers
2125 // need to remain pointers.
2126 if (!DL.isNonIntegralPointerType(OldTy))
2127 return NewTy->isIntegerTy();
2128
2129 return false;
2130 }
2131
2132 if (OldTy->isTargetExtTy() || NewTy->isTargetExtTy())
2133 return false;
2134
2135 return true;
2136}
2137
2138/// Test whether the given slice use can be promoted to a vector.
2139///
2140/// This function is called to test each entry in a partition which is slated
2141/// for a single slice.
2142static bool isVectorPromotionViableForSlice(Partition &P, const Slice &S,
2143 VectorType *Ty,
2144 uint64_t ElementSize,
2145 const DataLayout &DL,
2146 unsigned VScale) {
2147 // First validate the slice offsets.
2148 uint64_t BeginOffset =
2149 std::max(S.beginOffset(), P.beginOffset()) - P.beginOffset();
2150 uint64_t BeginIndex = BeginOffset / ElementSize;
2151 if (BeginIndex * ElementSize != BeginOffset ||
2152 BeginIndex >= cast<FixedVectorType>(Ty)->getNumElements())
2153 return false;
2154 uint64_t EndOffset = std::min(S.endOffset(), P.endOffset()) - P.beginOffset();
2155 uint64_t EndIndex = EndOffset / ElementSize;
2156 if (EndIndex * ElementSize != EndOffset ||
2157 EndIndex > cast<FixedVectorType>(Ty)->getNumElements())
2158 return false;
2159
2160 assert(EndIndex > BeginIndex && "Empty vector!");
2161 uint64_t NumElements = EndIndex - BeginIndex;
2162 Type *SliceTy = (NumElements == 1)
2163 ? Ty->getElementType()
2164 : FixedVectorType::get(Ty->getElementType(), NumElements);
2165
2166 Type *SplitIntTy =
2167 Type::getIntNTy(Ty->getContext(), NumElements * ElementSize * 8);
2168
2169 Use *U = S.getUse();
2170
2171 if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(U->getUser())) {
2172 if (MI->isVolatile())
2173 return false;
2174 if (!S.isSplittable())
2175 return false; // Skip any unsplittable intrinsics.
2176 if (isa<MemSetInst>(MI)) {
2177 Type *SplatTy = Type::getIntNTy(Ty->getContext(), ElementSize * 8);
2178 if (!canConvertValue(DL, SplatTy, Ty->getElementType(), VScale))
2179 return false;
2180 }
2181 } else if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U->getUser())) {
2182 if (!II->isLifetimeStartOrEnd() && !II->isDroppable())
2183 return false;
2184 } else if (LoadInst *LI = dyn_cast<LoadInst>(U->getUser())) {
2185 if (LI->isVolatile())
2186 return false;
2187 Type *LTy = LI->getType();
2188 // Disable vector promotion when there are loads or stores of an FCA.
2189 if (LTy->isStructTy())
2190 return false;
2191 if (P.beginOffset() > S.beginOffset() || P.endOffset() < S.endOffset()) {
2192 assert(LTy->isIntegerTy());
2193 LTy = SplitIntTy;
2194 }
2195 if (!canConvertValue(DL, SliceTy, LTy, VScale))
2196 return false;
2197 } else if (StoreInst *SI = dyn_cast<StoreInst>(U->getUser())) {
2198 if (SI->isVolatile())
2199 return false;
2200 Type *STy = SI->getValueOperand()->getType();
2201 // Disable vector promotion when there are loads or stores of an FCA.
2202 if (STy->isStructTy())
2203 return false;
2204 if (P.beginOffset() > S.beginOffset() || P.endOffset() < S.endOffset()) {
2205 assert(STy->isIntegerTy());
2206 STy = SplitIntTy;
2207 }
2208 if (!canConvertValue(DL, STy, SliceTy, VScale))
2209 return false;
2210 } else {
2211 return false;
2212 }
2213
2214 return true;
2215}
2216
2217/// Test whether any vector type in \p CandidateTys is viable for promotion.
2218///
2219/// This implements the necessary checking for \c isVectorPromotionViable over
2220/// all slices of the alloca for the given VectorType.
2221static VectorType *
2223 SmallVectorImpl<VectorType *> &CandidateTys,
2224 bool HaveCommonEltTy, Type *CommonEltTy,
2225 bool HaveVecPtrTy, bool HaveCommonVecPtrTy,
2226 VectorType *CommonVecPtrTy, unsigned VScale) {
2227 // If we didn't find a vector type, nothing to do here.
2228 if (CandidateTys.empty())
2229 return nullptr;
2230
2231 // Pointer-ness is sticky, if we had a vector-of-pointers candidate type,
2232 // then we should choose it, not some other alternative.
2233 // But, we can't perform a no-op pointer address space change via bitcast,
2234 // so if we didn't have a common pointer element type, bail.
2235 if (HaveVecPtrTy && !HaveCommonVecPtrTy)
2236 return nullptr;
2237
2238 // Try to pick the "best" element type out of the choices.
2239 if (!HaveCommonEltTy && HaveVecPtrTy) {
2240 // If there was a pointer element type, there's really only one choice.
2241 CandidateTys.clear();
2242 CandidateTys.push_back(CommonVecPtrTy);
2243 } else if (!HaveCommonEltTy && !HaveVecPtrTy) {
2244 // Integer-ify vector types.
2245 for (VectorType *&VTy : CandidateTys) {
2246 if (!VTy->getElementType()->isIntegerTy())
2247 VTy = cast<VectorType>(VTy->getWithNewType(IntegerType::getIntNTy(
2248 VTy->getContext(), VTy->getScalarSizeInBits())));
2249 }
2250
2251 // Rank the remaining candidate vector types. This is easy because we know
2252 // they're all integer vectors. We sort by ascending number of elements.
2253 auto RankVectorTypesComp = [&DL](VectorType *RHSTy, VectorType *LHSTy) {
2254 (void)DL;
2255 assert(DL.getTypeSizeInBits(RHSTy).getFixedValue() ==
2256 DL.getTypeSizeInBits(LHSTy).getFixedValue() &&
2257 "Cannot have vector types of different sizes!");
2258 assert(RHSTy->getElementType()->isIntegerTy() &&
2259 "All non-integer types eliminated!");
2260 assert(LHSTy->getElementType()->isIntegerTy() &&
2261 "All non-integer types eliminated!");
2262 return cast<FixedVectorType>(RHSTy)->getNumElements() <
2263 cast<FixedVectorType>(LHSTy)->getNumElements();
2264 };
2265 auto RankVectorTypesEq = [&DL](VectorType *RHSTy, VectorType *LHSTy) {
2266 (void)DL;
2267 assert(DL.getTypeSizeInBits(RHSTy).getFixedValue() ==
2268 DL.getTypeSizeInBits(LHSTy).getFixedValue() &&
2269 "Cannot have vector types of different sizes!");
2270 assert(RHSTy->getElementType()->isIntegerTy() &&
2271 "All non-integer types eliminated!");
2272 assert(LHSTy->getElementType()->isIntegerTy() &&
2273 "All non-integer types eliminated!");
2274 return cast<FixedVectorType>(RHSTy)->getNumElements() ==
2275 cast<FixedVectorType>(LHSTy)->getNumElements();
2276 };
2277 llvm::sort(CandidateTys, RankVectorTypesComp);
2278 CandidateTys.erase(llvm::unique(CandidateTys, RankVectorTypesEq),
2279 CandidateTys.end());
2280 } else {
2281// The only way to have the same element type in every vector type is to
2282// have the same vector type. Check that and remove all but one.
2283#ifndef NDEBUG
2284 for (VectorType *VTy : CandidateTys) {
2285 assert(VTy->getElementType() == CommonEltTy &&
2286 "Unaccounted for element type!");
2287 assert(VTy == CandidateTys[0] &&
2288 "Different vector types with the same element type!");
2289 }
2290#endif
2291 CandidateTys.resize(1);
2292 }
2293
2294 // FIXME: hack. Do we have a named constant for this?
2295 // SDAG SDNode can't have more than 65535 operands.
2296 llvm::erase_if(CandidateTys, [](VectorType *VTy) {
2297 return cast<FixedVectorType>(VTy)->getNumElements() >
2298 std::numeric_limits<unsigned short>::max();
2299 });
2300
2301 // Find a vector type viable for promotion by iterating over all slices.
2302 auto *VTy = llvm::find_if(CandidateTys, [&](VectorType *VTy) -> bool {
2303 uint64_t ElementSize =
2304 DL.getTypeSizeInBits(VTy->getElementType()).getFixedValue();
2305
2306 // While the definition of LLVM vectors is bitpacked, we don't support sizes
2307 // that aren't byte sized.
2308 if (ElementSize % 8)
2309 return false;
2310 assert((DL.getTypeSizeInBits(VTy).getFixedValue() % 8) == 0 &&
2311 "vector size not a multiple of element size?");
2312 ElementSize /= 8;
2313
2314 for (const Slice &S : P)
2315 if (!isVectorPromotionViableForSlice(P, S, VTy, ElementSize, DL, VScale))
2316 return false;
2317
2318 for (const Slice *S : P.splitSliceTails())
2319 if (!isVectorPromotionViableForSlice(P, *S, VTy, ElementSize, DL, VScale))
2320 return false;
2321
2322 return true;
2323 });
2324 return VTy != CandidateTys.end() ? *VTy : nullptr;
2325}
2326
2328 SetVector<Type *> &OtherTys, ArrayRef<VectorType *> CandidateTysCopy,
2329 function_ref<void(Type *)> CheckCandidateType, Partition &P,
2330 const DataLayout &DL, SmallVectorImpl<VectorType *> &CandidateTys,
2331 bool &HaveCommonEltTy, Type *&CommonEltTy, bool &HaveVecPtrTy,
2332 bool &HaveCommonVecPtrTy, VectorType *&CommonVecPtrTy, unsigned VScale) {
2333 [[maybe_unused]] VectorType *OriginalElt =
2334 CandidateTysCopy.size() ? CandidateTysCopy[0] : nullptr;
2335 // Consider additional vector types where the element type size is a
2336 // multiple of load/store element size.
2337 for (Type *Ty : OtherTys) {
2339 continue;
2340 unsigned TypeSize = DL.getTypeSizeInBits(Ty).getFixedValue();
2341 // Make a copy of CandidateTys and iterate through it, because we
2342 // might append to CandidateTys in the loop.
2343 for (VectorType *const VTy : CandidateTysCopy) {
2344 // The elements in the copy should remain invariant throughout the loop
2345 assert(CandidateTysCopy[0] == OriginalElt && "Different Element");
2346 unsigned VectorSize = DL.getTypeSizeInBits(VTy).getFixedValue();
2347 unsigned ElementSize =
2348 DL.getTypeSizeInBits(VTy->getElementType()).getFixedValue();
2349 if (TypeSize != VectorSize && TypeSize != ElementSize &&
2350 VectorSize % TypeSize == 0) {
2351 VectorType *NewVTy = VectorType::get(Ty, VectorSize / TypeSize, false);
2352 CheckCandidateType(NewVTy);
2353 }
2354 }
2355 }
2356
2358 P, DL, CandidateTys, HaveCommonEltTy, CommonEltTy, HaveVecPtrTy,
2359 HaveCommonVecPtrTy, CommonVecPtrTy, VScale);
2360}
2361
2362/// Test whether the given alloca partitioning and range of slices can be
2363/// promoted to a vector.
2364///
2365/// This is a quick test to check whether we can rewrite a particular alloca
2366/// partition (and its newly formed alloca) into a vector alloca with only
2367/// whole-vector loads and stores such that it could be promoted to a vector
2368/// SSA value. We only can ensure this for a limited set of operations, and we
2369/// don't want to do the rewrites unless we are confident that the result will
2370/// be promotable, so we have an early test here.
2372 unsigned VScale) {
2373 // Collect the candidate types for vector-based promotion. Also track whether
2374 // we have different element types.
2375 SmallVector<VectorType *, 4> CandidateTys;
2376 SetVector<Type *> LoadStoreTys;
2377 SetVector<Type *> DeferredTys;
2378 Type *CommonEltTy = nullptr;
2379 VectorType *CommonVecPtrTy = nullptr;
2380 bool HaveVecPtrTy = false;
2381 bool HaveCommonEltTy = true;
2382 bool HaveCommonVecPtrTy = true;
2383 auto CheckCandidateType = [&](Type *Ty) {
2384 if (auto *VTy = dyn_cast<FixedVectorType>(Ty)) {
2385 // Return if bitcast to vectors is different for total size in bits.
2386 if (!CandidateTys.empty()) {
2387 VectorType *V = CandidateTys[0];
2388 if (DL.getTypeSizeInBits(VTy).getFixedValue() !=
2389 DL.getTypeSizeInBits(V).getFixedValue()) {
2390 CandidateTys.clear();
2391 return;
2392 }
2393 }
2394 CandidateTys.push_back(VTy);
2395 Type *EltTy = VTy->getElementType();
2396
2397 if (!CommonEltTy)
2398 CommonEltTy = EltTy;
2399 else if (CommonEltTy != EltTy)
2400 HaveCommonEltTy = false;
2401
2402 if (EltTy->isPointerTy()) {
2403 HaveVecPtrTy = true;
2404 if (!CommonVecPtrTy)
2405 CommonVecPtrTy = VTy;
2406 else if (CommonVecPtrTy != VTy)
2407 HaveCommonVecPtrTy = false;
2408 }
2409 }
2410 };
2411
2412 // Put load and store types into a set for de-duplication.
2413 for (const Slice &S : P) {
2414 Type *Ty;
2415 if (auto *LI = dyn_cast<LoadInst>(S.getUse()->getUser()))
2416 Ty = LI->getType();
2417 else if (auto *SI = dyn_cast<StoreInst>(S.getUse()->getUser()))
2418 Ty = SI->getValueOperand()->getType();
2419 else
2420 continue;
2421
2422 auto CandTy = Ty->getScalarType();
2423 if (CandTy->isPointerTy() && (S.beginOffset() != P.beginOffset() ||
2424 S.endOffset() != P.endOffset())) {
2425 DeferredTys.insert(Ty);
2426 continue;
2427 }
2428
2429 LoadStoreTys.insert(Ty);
2430 // Consider any loads or stores that are the exact size of the slice.
2431 if (S.beginOffset() == P.beginOffset() && S.endOffset() == P.endOffset())
2432 CheckCandidateType(Ty);
2433 }
2434
2435 SmallVector<VectorType *, 4> CandidateTysCopy = CandidateTys;
2437 LoadStoreTys, CandidateTysCopy, CheckCandidateType, P, DL,
2438 CandidateTys, HaveCommonEltTy, CommonEltTy, HaveVecPtrTy,
2439 HaveCommonVecPtrTy, CommonVecPtrTy, VScale))
2440 return VTy;
2441
2442 CandidateTys.clear();
2444 DeferredTys, CandidateTysCopy, CheckCandidateType, P, DL, CandidateTys,
2445 HaveCommonEltTy, CommonEltTy, HaveVecPtrTy, HaveCommonVecPtrTy,
2446 CommonVecPtrTy, VScale);
2447}
2448
2449/// Test whether a slice of an alloca is valid for integer widening.
2450///
2451/// This implements the necessary checking for the \c isIntegerWideningViable
2452/// test below on a single slice of the alloca.
2453static bool isIntegerWideningViableForSlice(const Slice &S,
2454 uint64_t AllocBeginOffset,
2455 Type *AllocaTy,
2456 const DataLayout &DL,
2457 bool &WholeAllocaOp) {
2458 uint64_t Size = DL.getTypeStoreSize(AllocaTy).getFixedValue();
2459
2460 uint64_t RelBegin = S.beginOffset() - AllocBeginOffset;
2461 uint64_t RelEnd = S.endOffset() - AllocBeginOffset;
2462
2463 Use *U = S.getUse();
2464
2465 // Lifetime intrinsics operate over the whole alloca whose sizes are usually
2466 // larger than other load/store slices (RelEnd > Size). But lifetime are
2467 // always promotable and should not impact other slices' promotability of the
2468 // partition.
2469 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U->getUser())) {
2470 if (II->isLifetimeStartOrEnd() || II->isDroppable())
2471 return true;
2472 }
2473
2474 // We can't reasonably handle cases where the load or store extends past
2475 // the end of the alloca's type and into its padding.
2476 if (RelEnd > Size)
2477 return false;
2478
2479 if (LoadInst *LI = dyn_cast<LoadInst>(U->getUser())) {
2480 if (LI->isVolatile())
2481 return false;
2482 // We can't handle loads that extend past the allocated memory.
2483 TypeSize LoadSize = DL.getTypeStoreSize(LI->getType());
2484 if (!LoadSize.isFixed() || LoadSize.getFixedValue() > Size)
2485 return false;
2486 // So far, AllocaSliceRewriter does not support widening split slice tails
2487 // in rewriteIntegerLoad.
2488 if (S.beginOffset() < AllocBeginOffset)
2489 return false;
2490 // Note that we don't count vector loads or stores as whole-alloca
2491 // operations which enable integer widening because we would prefer to use
2492 // vector widening instead.
2493 if (!isa<VectorType>(LI->getType()) && RelBegin == 0 && RelEnd == Size)
2494 WholeAllocaOp = true;
2495 if (IntegerType *ITy = dyn_cast<IntegerType>(LI->getType())) {
2496 if (ITy->getBitWidth() < DL.getTypeStoreSizeInBits(ITy).getFixedValue())
2497 return false;
2498 } else if (RelBegin != 0 || RelEnd != Size ||
2499 !canConvertValue(DL, AllocaTy, LI->getType())) {
2500 // Non-integer loads need to be convertible from the alloca type so that
2501 // they are promotable.
2502 return false;
2503 }
2504 } else if (StoreInst *SI = dyn_cast<StoreInst>(U->getUser())) {
2505 Type *ValueTy = SI->getValueOperand()->getType();
2506 if (SI->isVolatile())
2507 return false;
2508 // We can't handle stores that extend past the allocated memory.
2509 TypeSize StoreSize = DL.getTypeStoreSize(ValueTy);
2510 if (!StoreSize.isFixed() || StoreSize.getFixedValue() > Size)
2511 return false;
2512 // So far, AllocaSliceRewriter does not support widening split slice tails
2513 // in rewriteIntegerStore.
2514 if (S.beginOffset() < AllocBeginOffset)
2515 return false;
2516 // Note that we don't count vector loads or stores as whole-alloca
2517 // operations which enable integer widening because we would prefer to use
2518 // vector widening instead.
2519 if (!isa<VectorType>(ValueTy) && RelBegin == 0 && RelEnd == Size)
2520 WholeAllocaOp = true;
2521 if (IntegerType *ITy = dyn_cast<IntegerType>(ValueTy)) {
2522 if (ITy->getBitWidth() < DL.getTypeStoreSizeInBits(ITy).getFixedValue())
2523 return false;
2524 } else if (RelBegin != 0 || RelEnd != Size ||
2525 !canConvertValue(DL, ValueTy, AllocaTy)) {
2526 // Non-integer stores need to be convertible to the alloca type so that
2527 // they are promotable.
2528 return false;
2529 }
2530 } else if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(U->getUser())) {
2531 if (MI->isVolatile() || !isa<Constant>(MI->getLength()))
2532 return false;
2533 if (!S.isSplittable())
2534 return false; // Skip any unsplittable intrinsics.
2535 } else {
2536 return false;
2537 }
2538
2539 return true;
2540}
2541
2542/// Test whether the given alloca partition's integer operations can be
2543/// widened to promotable ones.
2544///
2545/// This is a quick test to check whether we can rewrite the integer loads and
2546/// stores to a particular alloca into wider loads and stores and be able to
2547/// promote the resulting alloca.
2548static bool isIntegerWideningViable(Partition &P, Type *AllocaTy,
2549 const DataLayout &DL) {
2550 uint64_t SizeInBits = DL.getTypeSizeInBits(AllocaTy).getFixedValue();
2551 // Don't create integer types larger than the maximum bitwidth.
2552 if (SizeInBits > IntegerType::MAX_INT_BITS)
2553 return false;
2554
2555 // Don't try to handle allocas with bit-padding.
2556 if (SizeInBits != DL.getTypeStoreSizeInBits(AllocaTy).getFixedValue())
2557 return false;
2558
2559 // We need to ensure that an integer type with the appropriate bitwidth can
2560 // be converted to the alloca type, whatever that is. We don't want to force
2561 // the alloca itself to have an integer type if there is a more suitable one.
2562 Type *IntTy = Type::getIntNTy(AllocaTy->getContext(), SizeInBits);
2563 if (!canConvertValue(DL, AllocaTy, IntTy) ||
2564 !canConvertValue(DL, IntTy, AllocaTy))
2565 return false;
2566
2567 // While examining uses, we ensure that the alloca has a covering load or
2568 // store. We don't want to widen the integer operations only to fail to
2569 // promote due to some other unsplittable entry (which we may make splittable
2570 // later). However, if there are only splittable uses, go ahead and assume
2571 // that we cover the alloca.
2572 // FIXME: We shouldn't consider split slices that happen to start in the
2573 // partition here...
2574 bool WholeAllocaOp = P.empty() && DL.isLegalInteger(SizeInBits);
2575
2576 for (const Slice &S : P)
2577 if (!isIntegerWideningViableForSlice(S, P.beginOffset(), AllocaTy, DL,
2578 WholeAllocaOp))
2579 return false;
2580
2581 for (const Slice *S : P.splitSliceTails())
2582 if (!isIntegerWideningViableForSlice(*S, P.beginOffset(), AllocaTy, DL,
2583 WholeAllocaOp))
2584 return false;
2585
2586 return WholeAllocaOp;
2587}
2588
2589static Value *extractInteger(const DataLayout &DL, IRBuilderTy &IRB, Value *V,
2591 const Twine &Name) {
2592 LLVM_DEBUG(dbgs() << " start: " << *V << "\n");
2593 IntegerType *IntTy = cast<IntegerType>(V->getType());
2594 assert(DL.getTypeStoreSize(Ty).getFixedValue() + Offset <=
2595 DL.getTypeStoreSize(IntTy).getFixedValue() &&
2596 "Element extends past full value");
2597 uint64_t ShAmt = 8 * Offset;
2598 if (DL.isBigEndian())
2599 ShAmt = 8 * (DL.getTypeStoreSize(IntTy).getFixedValue() -
2600 DL.getTypeStoreSize(Ty).getFixedValue() - Offset);
2601 if (ShAmt) {
2602 V = IRB.CreateLShr(V, ShAmt, Name + ".shift");
2603 LLVM_DEBUG(dbgs() << " shifted: " << *V << "\n");
2604 }
2605 assert(Ty->getBitWidth() <= IntTy->getBitWidth() &&
2606 "Cannot extract to a larger integer!");
2607 if (Ty != IntTy) {
2608 V = IRB.CreateTrunc(V, Ty, Name + ".trunc");
2609 LLVM_DEBUG(dbgs() << " trunced: " << *V << "\n");
2610 }
2611 return V;
2612}
2613
2614static Value *insertInteger(const DataLayout &DL, IRBuilderTy &IRB, Value *Old,
2615 Value *V, uint64_t Offset, const Twine &Name) {
2616 IntegerType *IntTy = cast<IntegerType>(Old->getType());
2617 IntegerType *Ty = cast<IntegerType>(V->getType());
2618 assert(Ty->getBitWidth() <= IntTy->getBitWidth() &&
2619 "Cannot insert a larger integer!");
2620 LLVM_DEBUG(dbgs() << " start: " << *V << "\n");
2621 if (Ty != IntTy) {
2622 V = IRB.CreateZExt(V, IntTy, Name + ".ext");
2623 LLVM_DEBUG(dbgs() << " extended: " << *V << "\n");
2624 }
2625 assert(DL.getTypeStoreSize(Ty).getFixedValue() + Offset <=
2626 DL.getTypeStoreSize(IntTy).getFixedValue() &&
2627 "Element store outside of alloca store");
2628 uint64_t ShAmt = 8 * Offset;
2629 if (DL.isBigEndian())
2630 ShAmt = 8 * (DL.getTypeStoreSize(IntTy).getFixedValue() -
2631 DL.getTypeStoreSize(Ty).getFixedValue() - Offset);
2632 if (ShAmt) {
2633 V = IRB.CreateShl(V, ShAmt, Name + ".shift");
2634 LLVM_DEBUG(dbgs() << " shifted: " << *V << "\n");
2635 }
2636
2637 if (ShAmt || Ty->getBitWidth() < IntTy->getBitWidth()) {
2638 APInt Mask = ~Ty->getMask().zext(IntTy->getBitWidth()).shl(ShAmt);
2639 Old = IRB.CreateAnd(Old, Mask, Name + ".mask");
2640 LLVM_DEBUG(dbgs() << " masked: " << *Old << "\n");
2641 V = IRB.CreateOr(Old, V, Name + ".insert");
2642 LLVM_DEBUG(dbgs() << " inserted: " << *V << "\n");
2643 }
2644 return V;
2645}
2646
2647static Value *extractVector(IRBuilderTy &IRB, Value *V, unsigned BeginIndex,
2648 unsigned EndIndex, const Twine &Name) {
2649 auto *VecTy = cast<FixedVectorType>(V->getType());
2650 unsigned NumElements = EndIndex - BeginIndex;
2651 assert(NumElements <= VecTy->getNumElements() && "Too many elements!");
2652
2653 if (NumElements == VecTy->getNumElements())
2654 return V;
2655
2656 if (NumElements == 1) {
2657 V = IRB.CreateExtractElement(V, BeginIndex, Name + ".extract");
2658 LLVM_DEBUG(dbgs() << " extract: " << *V << "\n");
2659 return V;
2660 }
2661
2662 auto Mask = llvm::to_vector<8>(llvm::seq<int>(BeginIndex, EndIndex));
2663 V = IRB.CreateShuffleVector(V, Mask, Name + ".extract");
2664 LLVM_DEBUG(dbgs() << " shuffle: " << *V << "\n");
2665 return V;
2666}
2667
2668static Value *insertVector(IRBuilderTy &IRB, Value *Old, Value *V,
2669 unsigned BeginIndex, const Twine &Name) {
2670 VectorType *VecTy = cast<VectorType>(Old->getType());
2671 assert(VecTy && "Can only insert a vector into a vector");
2672
2673 VectorType *Ty = dyn_cast<VectorType>(V->getType());
2674 if (!Ty) {
2675 // Single element to insert.
2676 V = IRB.CreateInsertElement(Old, V, BeginIndex, Name + ".insert");
2677 LLVM_DEBUG(dbgs() << " insert: " << *V << "\n");
2678 return V;
2679 }
2680
2681 unsigned NumSubElements = cast<FixedVectorType>(Ty)->getNumElements();
2682 unsigned NumElements = cast<FixedVectorType>(VecTy)->getNumElements();
2683
2684 assert(NumSubElements <= NumElements && "Too many elements!");
2685 if (NumSubElements == NumElements) {
2686 assert(V->getType() == VecTy && "Vector type mismatch");
2687 return V;
2688 }
2689 unsigned EndIndex = BeginIndex + NumSubElements;
2690
2691 // When inserting a smaller vector into the larger to store, we first
2692 // use a shuffle vector to widen it with undef elements, and then
2693 // a second shuffle vector to select between the loaded vector and the
2694 // incoming vector.
2696 Mask.reserve(NumElements);
2697 for (unsigned Idx = 0; Idx != NumElements; ++Idx)
2698 if (Idx >= BeginIndex && Idx < EndIndex)
2699 Mask.push_back(Idx - BeginIndex);
2700 else
2701 Mask.push_back(-1);
2702 V = IRB.CreateShuffleVector(V, Mask, Name + ".expand");
2703 LLVM_DEBUG(dbgs() << " shuffle: " << *V << "\n");
2704
2705 Mask.clear();
2706 for (unsigned Idx = 0; Idx != NumElements; ++Idx)
2707 if (Idx >= BeginIndex && Idx < EndIndex)
2708 Mask.push_back(Idx);
2709 else
2710 Mask.push_back(Idx + NumElements);
2711 V = IRB.CreateShuffleVector(V, Old, Mask, Name + "blend");
2712 LLVM_DEBUG(dbgs() << " blend: " << *V << "\n");
2713 return V;
2714}
2715
2716/// This function takes two vector values and combines them into a single vector
2717/// by concatenating their elements. The function handles:
2718///
2719/// 1. Element type mismatch: If either vector's element type differs from
2720/// NewAIEltType, the function bitcasts the vector to use NewAIEltType while
2721/// preserving the total bit width (adjusting the number of elements
2722/// accordingly).
2723///
2724/// 2. Size mismatch: After transforming the vectors to have the desired element
2725/// type, if the two vectors have different numbers of elements, the smaller
2726/// vector is extended with poison values to match the size of the larger
2727/// vector before concatenation.
2728///
2729/// 3. Concatenation: The vectors are merged using a shuffle operation that
2730/// places all elements of V0 first, followed by all elements of V1.
2731///
2732/// \param V0 The first vector to merge (must be a vector type)
2733/// \param V1 The second vector to merge (must be a vector type)
2734/// \param DL The data layout for size calculations
2735/// \param NewAIEltTy The desired element type for the result vector
2736/// \param Builder IRBuilder for creating new instructions
2737/// \return A new vector containing all elements from V0 followed by all
2738/// elements from V1
2740 Type *NewAIEltTy, IRBuilder<> &Builder) {
2741 // V0 and V1 are vectors
2742 // Create a new vector type with combined elements
2743 // Use ShuffleVector to concatenate the vectors
2744 auto *VecType0 = cast<FixedVectorType>(V0->getType());
2745 auto *VecType1 = cast<FixedVectorType>(V1->getType());
2746
2747 // If V0/V1 element types are different from NewAllocaElementType,
2748 // we need to introduce bitcasts before merging them
2749 auto BitcastIfNeeded = [&](Value *&V, FixedVectorType *&VecType,
2750 const char *DebugName) {
2751 Type *EltType = VecType->getElementType();
2752 if (EltType != NewAIEltTy) {
2753 // Calculate new number of elements to maintain same bit width
2754 unsigned TotalBits =
2755 VecType->getNumElements() * DL.getTypeSizeInBits(EltType);
2756 unsigned NewNumElts = TotalBits / DL.getTypeSizeInBits(NewAIEltTy);
2757
2758 auto *NewVecType = FixedVectorType::get(NewAIEltTy, NewNumElts);
2759 V = Builder.CreateBitCast(V, NewVecType);
2760 VecType = NewVecType;
2761 LLVM_DEBUG(dbgs() << " bitcast " << DebugName << ": " << *V << "\n");
2762 }
2763 };
2764
2765 BitcastIfNeeded(V0, VecType0, "V0");
2766 BitcastIfNeeded(V1, VecType1, "V1");
2767
2768 unsigned NumElts0 = VecType0->getNumElements();
2769 unsigned NumElts1 = VecType1->getNumElements();
2770
2771 SmallVector<int, 16> ShuffleMask;
2772
2773 if (NumElts0 == NumElts1) {
2774 for (unsigned i = 0; i < NumElts0 + NumElts1; ++i)
2775 ShuffleMask.push_back(i);
2776 } else {
2777 // If two vectors have different sizes, we need to extend
2778 // the smaller vector to the size of the larger vector.
2779 unsigned SmallSize = std::min(NumElts0, NumElts1);
2780 unsigned LargeSize = std::max(NumElts0, NumElts1);
2781 bool IsV0Smaller = NumElts0 < NumElts1;
2782 Value *&ExtendedVec = IsV0Smaller ? V0 : V1;
2783 SmallVector<int, 16> ExtendMask;
2784 for (unsigned i = 0; i < SmallSize; ++i)
2785 ExtendMask.push_back(i);
2786 for (unsigned i = SmallSize; i < LargeSize; ++i)
2787 ExtendMask.push_back(PoisonMaskElem);
2788 ExtendedVec = Builder.CreateShuffleVector(
2789 ExtendedVec, PoisonValue::get(ExtendedVec->getType()), ExtendMask);
2790 LLVM_DEBUG(dbgs() << " shufflevector: " << *ExtendedVec << "\n");
2791 for (unsigned i = 0; i < NumElts0; ++i)
2792 ShuffleMask.push_back(i);
2793 for (unsigned i = 0; i < NumElts1; ++i)
2794 ShuffleMask.push_back(LargeSize + i);
2795 }
2796
2797 return Builder.CreateShuffleVector(V0, V1, ShuffleMask);
2798}
2799
2800namespace {
2801
2802/// Visitor to rewrite instructions using p particular slice of an alloca
2803/// to use a new alloca.
2804///
2805/// Also implements the rewriting to vector-based accesses when the partition
2806/// passes the isVectorPromotionViable predicate. Most of the rewriting logic
2807/// lives here.
2808class AllocaSliceRewriter : public InstVisitor<AllocaSliceRewriter, bool> {
2809 // Befriend the base class so it can delegate to private visit methods.
2810 friend class InstVisitor<AllocaSliceRewriter, bool>;
2811
2812 using Base = InstVisitor<AllocaSliceRewriter, bool>;
2813
2814 const DataLayout &DL;
2815 AllocaSlices &AS;
2816 SROA &Pass;
2817 AllocaInst &OldAI, &NewAI;
2818 const uint64_t NewAllocaBeginOffset, NewAllocaEndOffset;
2819 Type *NewAllocaTy;
2820
2821 // This is a convenience and flag variable that will be null unless the new
2822 // alloca's integer operations should be widened to this integer type due to
2823 // passing isIntegerWideningViable above. If it is non-null, the desired
2824 // integer type will be stored here for easy access during rewriting.
2825 IntegerType *IntTy;
2826
2827 // If we are rewriting an alloca partition which can be written as pure
2828 // vector operations, we stash extra information here. When VecTy is
2829 // non-null, we have some strict guarantees about the rewritten alloca:
2830 // - The new alloca is exactly the size of the vector type here.
2831 // - The accesses all either map to the entire vector or to a single
2832 // element.
2833 // - The set of accessing instructions is only one of those handled above
2834 // in isVectorPromotionViable. Generally these are the same access kinds
2835 // which are promotable via mem2reg.
2836 VectorType *VecTy;
2837 Type *ElementTy;
2838 uint64_t ElementSize;
2839
2840 // The original offset of the slice currently being rewritten relative to
2841 // the original alloca.
2842 uint64_t BeginOffset = 0;
2843 uint64_t EndOffset = 0;
2844
2845 // The new offsets of the slice currently being rewritten relative to the
2846 // original alloca.
2847 uint64_t NewBeginOffset = 0, NewEndOffset = 0;
2848
2849 uint64_t SliceSize = 0;
2850 bool IsSplittable = false;
2851 bool IsSplit = false;
2852 Use *OldUse = nullptr;
2853 Instruction *OldPtr = nullptr;
2854
2855 // Track post-rewrite users which are PHI nodes and Selects.
2856 SmallSetVector<PHINode *, 8> &PHIUsers;
2857 SmallSetVector<SelectInst *, 8> &SelectUsers;
2858
2859 // Utility IR builder, whose name prefix is setup for each visited use, and
2860 // the insertion point is set to point to the user.
2861 IRBuilderTy IRB;
2862
2863 // Return the new alloca, addrspacecasted if required to avoid changing the
2864 // addrspace of a volatile access.
2865 Value *getPtrToNewAI(unsigned AddrSpace, bool IsVolatile) {
2866 if (!IsVolatile || AddrSpace == NewAI.getType()->getPointerAddressSpace())
2867 return &NewAI;
2868
2869 Type *AccessTy = IRB.getPtrTy(AddrSpace);
2870 return IRB.CreateAddrSpaceCast(&NewAI, AccessTy);
2871 }
2872
2873public:
2874 AllocaSliceRewriter(const DataLayout &DL, AllocaSlices &AS, SROA &Pass,
2875 AllocaInst &OldAI, AllocaInst &NewAI, Type *NewAllocaTy,
2876 uint64_t NewAllocaBeginOffset,
2877 uint64_t NewAllocaEndOffset, bool IsIntegerPromotable,
2878 VectorType *PromotableVecTy,
2879 SmallSetVector<PHINode *, 8> &PHIUsers,
2880 SmallSetVector<SelectInst *, 8> &SelectUsers)
2881 : DL(DL), AS(AS), Pass(Pass), OldAI(OldAI), NewAI(NewAI),
2882 NewAllocaBeginOffset(NewAllocaBeginOffset),
2883 NewAllocaEndOffset(NewAllocaEndOffset), NewAllocaTy(NewAllocaTy),
2884 IntTy(IsIntegerPromotable
2885 ? Type::getIntNTy(
2886 NewAI.getContext(),
2887 DL.getTypeSizeInBits(NewAllocaTy).getFixedValue())
2888 : nullptr),
2889 VecTy(PromotableVecTy),
2890 ElementTy(VecTy ? VecTy->getElementType() : nullptr),
2891 ElementSize(VecTy ? DL.getTypeSizeInBits(ElementTy).getFixedValue() / 8
2892 : 0),
2893 PHIUsers(PHIUsers), SelectUsers(SelectUsers),
2894 IRB(*NewAI.getModule(), ConstantFolder()) {
2895 if (VecTy) {
2896 assert((DL.getTypeSizeInBits(ElementTy).getFixedValue() % 8) == 0 &&
2897 "Only multiple-of-8 sized vector elements are viable");
2898 ++NumVectorized;
2899 }
2900 assert((!IntTy && !VecTy) || (IntTy && !VecTy) || (!IntTy && VecTy));
2901 }
2902
2903 bool visit(AllocaSlices::const_iterator I) {
2904 bool CanSROA = true;
2905 BeginOffset = I->beginOffset();
2906 EndOffset = I->endOffset();
2907 IsSplittable = I->isSplittable();
2908 IsSplit =
2909 BeginOffset < NewAllocaBeginOffset || EndOffset > NewAllocaEndOffset;
2910 LLVM_DEBUG(dbgs() << " rewriting " << (IsSplit ? "split " : ""));
2911 LLVM_DEBUG(AS.printSlice(dbgs(), I, ""));
2912 LLVM_DEBUG(dbgs() << "\n");
2913
2914 // Compute the intersecting offset range.
2915 assert(BeginOffset < NewAllocaEndOffset);
2916 assert(EndOffset > NewAllocaBeginOffset);
2917 NewBeginOffset = std::max(BeginOffset, NewAllocaBeginOffset);
2918 NewEndOffset = std::min(EndOffset, NewAllocaEndOffset);
2919
2920 SliceSize = NewEndOffset - NewBeginOffset;
2921 LLVM_DEBUG(dbgs() << " Begin:(" << BeginOffset << ", " << EndOffset
2922 << ") NewBegin:(" << NewBeginOffset << ", "
2923 << NewEndOffset << ") NewAllocaBegin:("
2924 << NewAllocaBeginOffset << ", " << NewAllocaEndOffset
2925 << ")\n");
2926 assert(IsSplit || NewBeginOffset == BeginOffset);
2927 OldUse = I->getUse();
2928 OldPtr = cast<Instruction>(OldUse->get());
2929
2930 Instruction *OldUserI = cast<Instruction>(OldUse->getUser());
2931 IRB.SetInsertPoint(OldUserI);
2932 IRB.SetCurrentDebugLocation(OldUserI->getDebugLoc());
2933 // Avoid materializing the name prefix when it is discarded anyway.
2934 if (!IRB.getContext().shouldDiscardValueNames())
2935 IRB.getInserter().SetNamePrefix(Twine(NewAI.getName()) + "." +
2936 Twine(BeginOffset) + ".");
2937
2938 CanSROA &= visit(cast<Instruction>(OldUse->getUser()));
2939 if (VecTy || IntTy)
2940 assert(CanSROA);
2941 return CanSROA;
2942 }
2943
2944 /// Attempts to rewrite a partition using tree-structured merge optimization.
2945 ///
2946 /// This function handles two patterns. Both produce an O(log n) tree of
2947 /// shufflevectors in place of the linear expand+blend chain that SROA would
2948 /// otherwise emit for each partial store.
2949 ///
2950 /// Pattern 1 (stores-only):
2951 /// Multiple non-overlapping partial stores completely fill the alloca
2952 /// and there is exactly one full-width load coming after the stores.
2953 /// The stores are tree-merged into a single vector and stored once.
2954 ///
2955 /// Example transformation:
2956 /// Before: (stores do not have to be in order)
2957 /// %alloca = alloca <8 x float>
2958 /// store <2 x float> %val0, ptr %alloca ; offset 0-1
2959 /// store <2 x float> %val2, ptr %alloca+16 ; offset 4-5
2960 /// store <2 x float> %val1, ptr %alloca+8 ; offset 2-3
2961 /// store <2 x float> %val3, ptr %alloca+24 ; offset 6-7
2962 /// %r = load <8 x float>, ptr %alloca
2963 ///
2964 /// After: tree of shufflevectors producing <8 x float> directly.
2965 ///
2966 /// Pattern 2 (init + RMW, possibly multi-round):
2967 /// A single full-width init store, followed by partial loads and
2968 /// partial stores that read-modify-write the alloca one or more
2969 /// times, optionally followed by a full-width load. The only
2970 /// structural requirement is that the distinct [begin, end) ranges
2971 /// touched by the partial loads and stores, taken together, tile
2972 /// the alloca disjointly.
2973 ///
2974 /// We keep a map from each slice range to the SSA value that
2975 /// currently lives there, `SliceValues[r] -> Value*`:
2976 /// - initialize each entry to the corresponding piece of the
2977 /// init store's value (via a shufflevector picking the
2978 /// range's elements out of the init value),
2979 /// - walk partial loads and stores in block order,
2980 /// - for a partial load at range r: RAUW with `SliceValues[r]`,
2981 /// - for a partial store at range r: update `SliceValues[r]` to
2982 /// the stored value and drop the store.
2983 /// At the end, the final `SliceValues[r]` entries are tree-merged
2984 /// (in range order) into a single store to the alloca, and the
2985 /// optional full-width load is replaced by a load of the alloca.
2986 ///
2987 /// Because the ranges are disjoint by construction, a store at one
2988 /// range cannot affect another range's tracked value, so a single
2989 /// block-order walk correctly tracks the memory state at each
2990 /// range. The algorithm handles multi-round RMW, partial loads
2991 /// and stores interleaved in any order, read-only slices (the
2992 /// tracked value stays at the init extract), and write-only
2993 /// slices (the tracked value never flows into a load).
2994 ///
2995 /// \param P The partition to analyze and potentially rewrite
2996 /// \return An optional vector of values that were deleted during the
2997 /// rewrite, or std::nullopt if the partition cannot be optimized.
2998 std::optional<SmallVector<Value *, 4>>
2999 rewriteTreeStructuredMerge(Partition &P) {
3000 // No tail slices that overlap with the partition
3001 if (P.splitSliceTails().size() > 0)
3002 return std::nullopt;
3003
3004 // Structure to hold store information
3005 struct StoreInfo {
3006 StoreInst *Store;
3007 uint64_t BeginOffset;
3008 uint64_t EndOffset;
3009 Value *StoredValue;
3010 StoreInfo(StoreInst *SI, uint64_t Begin, uint64_t End, Value *Val)
3011 : Store(SI), BeginOffset(Begin), EndOffset(End), StoredValue(Val) {}
3012 };
3013 struct LoadInfo {
3014 LoadInst *Load;
3015 uint64_t BeginOffset;
3016 uint64_t EndOffset;
3017 };
3018
3019 SmallVector<StoreInfo, 4> StoreInfos; // partial stores only
3020 SmallVector<LoadInfo, 4> LoadInfos; // partial loads only
3021 LoadInst *FullLoad = nullptr; // optional full-width load
3022 StoreInst *InitStore = nullptr; // optional full-width init store
3023
3024 // If the new alloca is a fixed vector type, we use its element type as the
3025 // allocated element type, otherwise we use i8 as the allocated element
3026 Type *AllocatedEltTy =
3027 isa<FixedVectorType>(NewAllocaTy)
3028 ? cast<FixedVectorType>(NewAllocaTy)->getElementType()
3029 : Type::getInt8Ty(NewAI.getContext());
3030 unsigned AllocatedEltTySize = DL.getTypeSizeInBits(AllocatedEltTy);
3031
3032 // Helper to check if a type is
3033 // 1. A fixed vector type
3034 // 2. The element type is not a pointer
3035 // 3. The element type size is byte-aligned
3036 // We only handle the cases that the ld/st meet these conditions
3037 auto IsTypeValidForTreeStructuredMerge = [&](Type *Ty) -> bool {
3038 auto *FixedVecTy = dyn_cast<FixedVectorType>(Ty);
3039 return FixedVecTy &&
3040 DL.getTypeSizeInBits(FixedVecTy->getElementType()) % 8 == 0 &&
3041 !FixedVecTy->getElementType()->isPointerTy();
3042 };
3043
3044 for (Slice &S : P) {
3045 auto *User = cast<Instruction>(S.getUse()->getUser());
3046 // A "full-width" slice spans the entire alloca; it's either the single
3047 // init store (Pattern 2) or the single final load (both patterns).
3048 bool IsFullWidth = (S.beginOffset() == NewAllocaBeginOffset &&
3049 S.endOffset() == NewAllocaEndOffset);
3050 if (auto *LI = dyn_cast<LoadInst>(User)) {
3051 // Only handle simple (non-volatile, non-atomic) loads.
3052 if (!LI->isSimple() ||
3053 !IsTypeValidForTreeStructuredMerge(LI->getType()))
3054 return std::nullopt;
3055 if (IsFullWidth) {
3056 // We accept at most one full-width load (the "final" load, after
3057 // all the partial stores).
3058 if (FullLoad)
3059 return std::nullopt;
3060 FullLoad = LI;
3061 } else {
3062 // Partial load (RMW pattern only).
3063 LoadInfos.push_back({LI, S.beginOffset(), S.endOffset()});
3064 }
3065 } else if (auto *SI = dyn_cast<StoreInst>(User)) {
3066 // Do not handle the case if
3067 // 1. The store does not meet the conditions in the helper function
3068 // 2. The store is not simple — we drop stores as part of the
3069 // rewrite, so volatile stores (which must be kept) and atomic
3070 // stores (which carry memory-ordering semantics) are unsound
3071 // to replace with SSA bookkeeping.
3072 // 3. The total store size is not a multiple of the allocated
3073 // element type size (required so the tree merge can produce a
3074 // vector whose element type matches the alloca).
3075 if (!SI->isSimple() || !IsTypeValidForTreeStructuredMerge(
3076 SI->getValueOperand()->getType()))
3077 return std::nullopt;
3078 auto *StVecTy = cast<FixedVectorType>(SI->getValueOperand()->getType());
3079 unsigned NumElts = StVecTy->getNumElements();
3080 unsigned EltSize = DL.getTypeSizeInBits(StVecTy->getElementType());
3081 if (NumElts * EltSize % AllocatedEltTySize != 0)
3082 return std::nullopt;
3083 if (IsFullWidth) {
3084 // At most one full-width store is allowed — it's the init store
3085 // for the RMW pattern.
3086 if (InitStore)
3087 return std::nullopt;
3088 InitStore = SI;
3089 } else {
3090 StoreInfos.emplace_back(SI, S.beginOffset(), S.endOffset(),
3091 SI->getValueOperand());
3092 }
3093 } else {
3094 // If we have instructions other than load and store, we cannot do
3095 // the tree structured merge.
3096 return std::nullopt;
3097 }
3098 }
3099
3100 // Need at least two partial stores to benefit from tree-merging; a
3101 // single store is already optimal as-is. This applies to both patterns
3102 // below, so check it before classifying.
3103 if (StoreInfos.size() < 2)
3104 return std::nullopt;
3105
3106 // Classify the pattern by looking at what we collected:
3107 // Pattern 1 (stores-only): only partial stores + exactly one full load.
3108 // Pattern 2 (RMW): one full init store + partial loads + partial stores
3109 // (+ optional full final load). RMW also needs VecTy to be set
3110 // because we use getIndex() to convert byte offsets to element
3111 // indices, which requires a promoted vector alloca.
3112 bool IsRMWPattern = InitStore && VecTy && !LoadInfos.empty();
3113 bool IsStoresOnlyPattern = !InitStore && FullLoad && LoadInfos.empty();
3114 if (!IsRMWPattern && !IsStoresOnlyPattern)
3115 return std::nullopt;
3116
3117 // All partial stores must live in the same basic block — the tree merge
3118 // is built in a single BB using block-order ordering (comesBefore).
3119 BasicBlock *StoreBB = StoreInfos[0].Store->getParent();
3120 for (auto &Info : StoreInfos)
3121 if (Info.Store->getParent() != StoreBB)
3122 return std::nullopt;
3123
3124 SmallVector<Value *, 4> DeletedValues;
3125
3126 // Helper: pairwise tree-merge a list of vectors into a single vector.
3127 // At each iteration we merge each adjacent pair via mergeTwoVectors,
3128 // collect the merged values into Next, and (if Vals had odd length)
3129 // carry the trailing element through unchanged. Loop until one value
3130 // remains — the fully-merged vector.
3131 auto TreeMerge = [&](SmallVectorImpl<Value *> &Vals,
3132 IRBuilder<> &B) -> Value * {
3133 LLVM_DEBUG(dbgs() << " Rewrite stores into shufflevectors:\n");
3134 while (Vals.size() > 1) {
3135 SmallVector<Value *, 8> Next;
3136 for (unsigned I = 0, E = Vals.size(); I + 1 < E; I += 2) {
3137 Value *M =
3138 mergeTwoVectors(Vals[I], Vals[I + 1], DL, AllocatedEltTy, B);
3139 LLVM_DEBUG(dbgs() << " shufflevector: " << *M << "\n");
3140 Next.push_back(M);
3141 }
3142 if (Vals.size() % 2 == 1)
3143 Next.push_back(Vals.back());
3144 Vals = std::move(Next);
3145 }
3146 return Vals[0];
3147 };
3148
3149 // Replace a full-width load with a load of the freshly-merged alloca.
3150 // The merge stored a value of type Merged->getType() into NewAI; we load
3151 // that same type back so every access to NewAI stays consistently typed
3152 // (otherwise the alloca is no longer promotable).
3153 auto ReplaceFullLoad = [&](LoadInst *LoadToReplace, Value *Merged) {
3154 IRBuilder<> LoadBuilder(LoadToReplace);
3155 Value *NewLoad = LoadBuilder.CreateAlignedLoad(
3156 Merged->getType(), &NewAI, getSliceAlign(),
3157 LoadToReplace->isVolatile(),
3158 LoadToReplace->getName() + ".sroa.new.load");
3159 if (NewLoad->getType() != LoadToReplace->getType())
3160 NewLoad = LoadBuilder.CreateBitCast(NewLoad, LoadToReplace->getType());
3161 LoadToReplace->replaceAllUsesWith(NewLoad);
3162 DeletedValues.push_back(LoadToReplace);
3163 };
3164
3165 if (IsStoresOnlyPattern) {
3166 // Stores should not overlap and should cover the whole alloca.
3167 // Sort by begin offset to verify this with a single linear scan.
3168 llvm::sort(StoreInfos, [](const StoreInfo &A, const StoreInfo &B) {
3169 return A.BeginOffset < B.BeginOffset;
3170 });
3171 // Check for gap or overlap: each begin offset must equal the previous
3172 // end offset, i.e. the store ranges must tile [NewAllocaBeginOffset,
3173 // NewAllocaEndOffset) exactly.
3174 uint64_t Expected = NewAllocaBeginOffset;
3175 for (auto &Info : StoreInfos) {
3176 if (Info.BeginOffset != Expected)
3177 return std::nullopt;
3178 Expected = Info.EndOffset;
3179 }
3180 // Stores cover the entire alloca (no trailing gap either).
3181 if (Expected != NewAllocaEndOffset)
3182 return std::nullopt;
3183
3184 // The load should not be in the middle of the stores.
3185 // Note:
3186 // If the load is in a different basic block from the stores, we can
3187 // still do the tree-structured merge. We don't have store->load
3188 // forwarding here — the merged vector is stored back to NewAI and
3189 // the new load loads from NewAI. The forwarding will be handled
3190 // later when NewAI is promoted.
3191 BasicBlock *LoadBB = FullLoad->getParent();
3192 if (LoadBB == StoreBB) {
3193 for (auto &Info : StoreInfos)
3194 if (!Info.Store->comesBefore(FullLoad))
3195 return std::nullopt;
3196 }
3197
3198 LLVM_DEBUG({
3199 dbgs() << "Tree structured merge rewrite (stores-only):\n";
3200 dbgs() << " Load: " << *FullLoad << "\n Ordered stores:\n";
3201 for (auto [I, Info] : enumerate(StoreInfos)) {
3202 dbgs() << " [" << I << "] Range[" << Info.BeginOffset << ", "
3203 << Info.EndOffset << ") \tStore: " << *Info.Store
3204 << "\tValue: " << *Info.StoredValue << "\n";
3205 }
3206 });
3207
3208 // StoreInfos is sorted by offset, not by block order. Anchoring to
3209 // StoreInfos.back().Store (last by offset) can place shuffles before
3210 // operands that appear later in the block (invalid SSA). Insert before
3211 // FullLoad when it shares the store block (after all stores, before
3212 // any later IR in that block). Otherwise insert before the store
3213 // block's terminator so the merge runs after every store and any
3214 // trailing instructions in that block.
3215 IRBuilder<> Builder(LoadBB == StoreBB ? cast<Instruction>(FullLoad)
3216 : StoreBB->getTerminator());
3217 SmallVector<Value *, 8> Vals;
3218 for (const auto &Info : StoreInfos) {
3219 DeletedValues.push_back(Info.Store);
3220 Vals.push_back(Info.StoredValue);
3221 }
3222 // Merge all stored values and store the merged value into the alloca.
3223 Value *Merged = TreeMerge(Vals, Builder);
3224 Builder.CreateAlignedStore(Merged, &NewAI, getSliceAlign());
3225
3226 // Replace the original load with a load of the newly-merged alloca.
3227 ReplaceFullLoad(FullLoad, Merged);
3228 return DeletedValues;
3229 }
3230
3231 // RMW pattern handling starts from here.
3232 // Like StoreBB above: keep the init store, all partial loads and all
3233 // partial stores in one basic block so we can reason about ordering
3234 // with comesBefore and build SSA without PHIs.
3235 if (InitStore->getParent() != StoreBB)
3236 return std::nullopt;
3237 if (any_of(LoadInfos, [&](const LoadInfo &I) {
3238 return I.Load->getParent() != StoreBB;
3239 }))
3240 return std::nullopt;
3241 // FullLoad (if any) is allowed to live in a different basic block. See
3242 // the note on the stores-only path: we don't do store->load forwarding
3243 // directly — the merged vector is stored to NewAI and the new load
3244 // loads from NewAI, so cross-BB ordering is resolved later when NewAI
3245 // is promoted.
3246
3247 // Collect the combined partial-load/partial-store accesses sorted
3248 // by block order. Used both for ordering checks and for the rewrite
3249 // walk below.
3250 struct Access {
3251 Instruction *Inst;
3252 uint64_t BeginOffset, EndOffset;
3253 bool IsStore;
3254 };
3256 Accesses.reserve(LoadInfos.size() + StoreInfos.size());
3257 for (const auto &L : LoadInfos)
3258 Accesses.push_back({L.Load, L.BeginOffset, L.EndOffset, false});
3259 for (const auto &S : StoreInfos)
3260 Accesses.push_back({S.Store, S.BeginOffset, S.EndOffset, true});
3261 llvm::sort(Accesses, [](const Access &A, const Access &B) {
3262 return A.Inst->comesBefore(B.Inst);
3263 });
3264
3265 // Ordering constraint 1: InitStore must come before every partial
3266 // access — they read/write the RMW state initialised by InitStore.
3267 // Accesses is sorted by block order, so the first element is the
3268 // earliest; checking it is enough.
3269 if (!InitStore->comesBefore(Accesses.front().Inst))
3270 return std::nullopt;
3271 // Ordering constraint 2: when FullLoad shares the block with the
3272 // partial accesses, it must come after every one of them — otherwise
3273 // it could read a stale value. Accesses is sorted, so the last
3274 // element is the latest; checking it is enough. If FullLoad is in
3275 // another block, mem2reg forwards the merged store to it.
3276 if (FullLoad && FullLoad->getParent() == StoreBB &&
3277 !Accesses.back().Inst->comesBefore(FullLoad))
3278 return std::nullopt;
3279
3280 // Coverage check: the distinct [begin, end) ranges touched by the
3281 // partial loads and stores must tile the alloca disjointly. That is
3282 // the only precondition the per-range SliceValues tracking below
3283 // needs — a disjoint tile guarantees the entries don't alias each
3284 // other. We don't check per-range load/store counts: a range with
3285 // only loads ends with SliceValues[r] = the init extract
3286 // (contributed to the final tree-merge), and a range with only
3287 // stores ends with SliceValues[r] = its last stored value. Both are
3288 // correct.
3289 using SliceRange = std::pair<uint64_t, uint64_t>;
3290 SmallVector<SliceRange, 8> SortedRanges;
3291 SortedRanges.reserve(Accesses.size());
3292 for (auto &Acc : Accesses)
3293 SortedRanges.emplace_back(Acc.BeginOffset, Acc.EndOffset);
3294 llvm::sort(SortedRanges);
3295 SortedRanges.erase(llvm::unique(SortedRanges), SortedRanges.end());
3296 // Disjoint + contiguous tile of the whole alloca.
3297 uint64_t Expected = NewAllocaBeginOffset;
3298 for (auto &Range : SortedRanges) {
3299 if (Range.first != Expected)
3300 return std::nullopt;
3301 Expected = Range.second;
3302 }
3303 if (Expected != NewAllocaEndOffset)
3304 return std::nullopt;
3305
3306 LLVM_DEBUG({
3307 dbgs() << "Tree structured merge rewrite (RMW):\n";
3308 dbgs() << " Init store: " << *InitStore << "\n";
3309 if (FullLoad)
3310 dbgs() << " Final load: " << *FullLoad << "\n";
3311 dbgs() << " Slice ranges (" << SortedRanges.size() << "):\n";
3312 for (auto &Range : SortedRanges)
3313 dbgs() << " [" << Range.first << ", " << Range.second << ")\n";
3314 });
3315
3316 // Initialize SliceValues: one SSA value per slice range, tracking
3317 // the value the alloca currently holds at that range. Each entry
3318 // starts at the corresponding piece of the init store, obtained by
3319 // bitcasting the init value to the alloca's vector type (if needed)
3320 // and extracting the slice's sub-range.
3321 IRB.SetInsertPoint(InitStore->getNextNode());
3322 Value *InitVec = InitStore->getValueOperand();
3323 if (InitVec->getType() != NewAllocaTy)
3324 InitVec = IRB.CreateBitCast(InitVec, NewAllocaTy, "init.cast");
3325 DenseMap<SliceRange, Value *> SliceValues;
3326 for (auto &Range : SortedRanges) {
3327 unsigned BeginIdx = getIndex(Range.first);
3328 unsigned EndIdx = getIndex(Range.second);
3329 SliceValues[Range] = IRB.CreateShuffleVector(
3330 InitVec, createSequentialMask(BeginIdx, EndIdx - BeginIdx, 0),
3331 "init.extract");
3332 }
3333 // The init store itself becomes dead — its value is consumed via the
3334 // extracts above.
3335 DeletedValues.push_back(InitStore);
3336
3337 // Walk accesses in block order:
3338 // - partial load at range r: replace with SliceValues[r] (bitcast
3339 // if the load's type differs from the current tracked value's
3340 // type, e.g. because a previous store wrote a vector with a
3341 // different element type);
3342 // - partial store at range r: update SliceValues[r] to the stored
3343 // value and drop the store.
3344 for (auto &Acc : Accesses) {
3345 SliceRange Range{Acc.BeginOffset, Acc.EndOffset};
3346 if (!Acc.IsStore) {
3347 Value *V = SliceValues[Range];
3348 if (V->getType() != Acc.Inst->getType()) {
3349 IRB.SetInsertPoint(cast<LoadInst>(Acc.Inst));
3350 V = IRB.CreateBitCast(V, Acc.Inst->getType());
3351 }
3352 Acc.Inst->replaceAllUsesWith(V);
3353 } else {
3354 SliceValues[Range] = cast<StoreInst>(Acc.Inst)->getValueOperand();
3355 }
3356 DeletedValues.push_back(Acc.Inst);
3357 }
3358
3359 // Tree-merge the final per-range values (in range order) into the
3360 // alloca's final vector value. Anchor the IRBuilder to FullLoad (when it
3361 // shares the partial-access block) or otherwise to the block's
3362 // terminator — never to a partial access, since those are queued for
3363 // deletion. Both anchors are guaranteed to dominate every SliceValues
3364 // entry: each one is either an init extract (before any access) or a
3365 // stored value defined before its (now-deleted) store.
3366 IRBuilder<> Builder(FullLoad && FullLoad->getParent() == StoreBB
3367 ? cast<Instruction>(FullLoad)
3368 : StoreBB->getTerminator());
3369 SmallVector<Value *, 8> Vals;
3370 for (auto &Range : SortedRanges)
3371 Vals.push_back(SliceValues[Range]);
3372 Value *Merged = TreeMerge(Vals, Builder);
3373 Builder.CreateAlignedStore(Merged, &NewAI, getSliceAlign());
3374
3375 // Replace the optional final full-width load with a load of the newly
3376 // merged alloca. Later promotion will forward the store above to it.
3377 if (FullLoad)
3378 ReplaceFullLoad(FullLoad, Merged);
3379
3380 return DeletedValues;
3381 }
3382
3383private:
3384 // Make sure the other visit overloads are visible.
3385 using Base::visit;
3386
3387 // Every instruction which can end up as a user must have a rewrite rule.
3388 bool visitInstruction(Instruction &I) {
3389 LLVM_DEBUG(dbgs() << " !!!! Cannot rewrite: " << I << "\n");
3390 llvm_unreachable("No rewrite rule for this instruction!");
3391 }
3392
3393 Value *getNewAllocaSlicePtr(IRBuilderTy &IRB, Type *PointerTy) {
3394 // Note that the offset computation can use BeginOffset or NewBeginOffset
3395 // interchangeably for unsplit slices.
3396 assert(IsSplit || BeginOffset == NewBeginOffset);
3397 uint64_t Offset = NewBeginOffset - NewAllocaBeginOffset;
3398
3399 StringRef OldName = OldPtr->getName();
3400 // Skip through the last '.sroa.' component of the name.
3401 size_t LastSROAPrefix = OldName.rfind(".sroa.");
3402 if (LastSROAPrefix != StringRef::npos) {
3403 OldName = OldName.substr(LastSROAPrefix + strlen(".sroa."));
3404 // Look for an SROA slice index.
3405 size_t IndexEnd = OldName.find_first_not_of("0123456789");
3406 if (IndexEnd != StringRef::npos && OldName[IndexEnd] == '.') {
3407 // Strip the index and look for the offset.
3408 OldName = OldName.substr(IndexEnd + 1);
3409 size_t OffsetEnd = OldName.find_first_not_of("0123456789");
3410 if (OffsetEnd != StringRef::npos && OldName[OffsetEnd] == '.')
3411 // Strip the offset.
3412 OldName = OldName.substr(OffsetEnd + 1);
3413 }
3414 }
3415 // Strip any SROA suffixes as well.
3416 OldName = OldName.substr(0, OldName.find(".sroa_"));
3417
3418 return getAdjustedPtr(IRB, DL, &NewAI,
3419 APInt(DL.getIndexTypeSizeInBits(PointerTy), Offset),
3420 PointerTy, Twine(OldName) + ".");
3421 }
3422
3423 /// Compute suitable alignment to access this slice of the *new*
3424 /// alloca.
3425 ///
3426 /// You can optionally pass a type to this routine and if that type's ABI
3427 /// alignment is itself suitable, this will return zero.
3428 Align getSliceAlign() {
3429 return commonAlignment(NewAI.getAlign(),
3430 NewBeginOffset - NewAllocaBeginOffset);
3431 }
3432
3433 unsigned getIndex(uint64_t Offset) {
3434 assert(VecTy && "Can only call getIndex when rewriting a vector");
3435 uint64_t RelOffset = Offset - NewAllocaBeginOffset;
3436 assert(RelOffset / ElementSize < UINT32_MAX && "Index out of bounds");
3437 uint32_t Index = RelOffset / ElementSize;
3438 assert(Index * ElementSize == RelOffset);
3439 return Index;
3440 }
3441
3442 void deleteIfTriviallyDead(Value *V) {
3445 Pass.DeadInsts.push_back(I);
3446 }
3447
3448 Value *rewriteVectorizedLoadInst(LoadInst &LI) {
3449 unsigned BeginIndex = getIndex(NewBeginOffset);
3450 unsigned EndIndex = getIndex(NewEndOffset);
3451 assert(EndIndex > BeginIndex && "Empty vector!");
3452
3453 LoadInst *Load =
3454 IRB.CreateAlignedLoad(NewAllocaTy, &NewAI, NewAI.getAlign(), "load");
3455
3456 Load->copyMetadata(LI, {LLVMContext::MD_mem_parallel_loop_access,
3457 LLVMContext::MD_access_group});
3458 return extractVector(IRB, Load, BeginIndex, EndIndex, "vec");
3459 }
3460
3461 Value *rewriteIntegerLoad(LoadInst &LI) {
3462 assert(IntTy && "We cannot insert an integer to the alloca");
3463 assert(!LI.isVolatile());
3464 Value *V =
3465 IRB.CreateAlignedLoad(NewAllocaTy, &NewAI, NewAI.getAlign(), "load");
3466 V = IRB.CreateBitPreservingCastChain(DL, V, IntTy);
3467 assert(NewBeginOffset >= NewAllocaBeginOffset && "Out of bounds offset");
3468 uint64_t Offset = NewBeginOffset - NewAllocaBeginOffset;
3469 if (Offset > 0 || NewEndOffset < NewAllocaEndOffset) {
3470 IntegerType *ExtractTy = Type::getIntNTy(LI.getContext(), SliceSize * 8);
3471 V = extractInteger(DL, IRB, V, ExtractTy, Offset, "extract");
3472 }
3473 // It is possible that the extracted type is not the load type. This
3474 // happens if there is a load past the end of the alloca, and as
3475 // a consequence the slice is narrower but still a candidate for integer
3476 // lowering. To handle this case, we just zero extend the extracted
3477 // integer.
3478 assert(cast<IntegerType>(LI.getType())->getBitWidth() >= SliceSize * 8 &&
3479 "Can only handle an extract for an overly wide load");
3480 if (cast<IntegerType>(LI.getType())->getBitWidth() > SliceSize * 8)
3481 V = IRB.CreateZExt(V, LI.getType());
3482 return V;
3483 }
3484
3485 bool visitLoadInst(LoadInst &LI) {
3486 LLVM_DEBUG(dbgs() << " original: " << LI << "\n");
3487 Value *OldOp = LI.getOperand(0);
3488 assert(OldOp == OldPtr);
3489
3490 AAMDNodes AATags = LI.getAAMetadata();
3491
3492 unsigned AS = LI.getPointerAddressSpace();
3493
3494 Type *TargetTy = IsSplit ? Type::getIntNTy(LI.getContext(), SliceSize * 8)
3495 : LI.getType();
3496 bool IsPtrAdjusted = false;
3497 Value *V;
3498 if (VecTy) {
3499 V = rewriteVectorizedLoadInst(LI);
3500 } else if (IntTy && LI.getType()->isIntegerTy()) {
3501 V = rewriteIntegerLoad(LI);
3502 } else if (NewBeginOffset == NewAllocaBeginOffset &&
3503 NewEndOffset == NewAllocaEndOffset &&
3504 (canConvertValue(DL, NewAllocaTy, TargetTy) ||
3505 (NewAllocaTy->isIntegerTy() && TargetTy->isIntegerTy() &&
3506 DL.getTypeStoreSize(TargetTy).getFixedValue() > SliceSize &&
3507 !LI.isVolatile()))) {
3508 Value *NewPtr =
3509 getPtrToNewAI(LI.getPointerAddressSpace(), LI.isVolatile());
3510 LoadInst *NewLI = IRB.CreateAlignedLoad(
3511 NewAllocaTy, NewPtr, NewAI.getAlign(), LI.isVolatile(), LI.getName());
3512 if (LI.isVolatile())
3513 NewLI->setAtomic(LI.getOrdering(), LI.getSyncScopeID());
3514 if (NewLI->isAtomic())
3515 NewLI->setAlignment(LI.getAlign());
3516
3517 // Copy any metadata that is valid for the new load. This may require
3518 // conversion to a different kind of metadata, e.g. !nonnull might change
3519 // to !range or vice versa.
3520 copyMetadataForLoad(*NewLI, LI);
3521
3522 // Do this after copyMetadataForLoad() to preserve the TBAA shift.
3523 if (AATags)
3524 NewLI->setAAMetadata(AATags.adjustForAccess(
3525 NewBeginOffset - BeginOffset, NewLI->getType(), DL));
3526
3527 // Try to preserve nonnull metadata
3528 V = NewLI;
3529
3530 // If this is an integer load past the end of the slice (which means the
3531 // bytes outside the slice are undef or this load is dead) just forcibly
3532 // fix the integer size with correct handling of endianness.
3533 if (auto *AITy = dyn_cast<IntegerType>(NewAllocaTy))
3534 if (auto *TITy = dyn_cast<IntegerType>(TargetTy))
3535 if (AITy->getBitWidth() < TITy->getBitWidth()) {
3536 V = IRB.CreateZExt(V, TITy, "load.ext");
3537 if (DL.isBigEndian())
3538 V = IRB.CreateShl(V, TITy->getBitWidth() - AITy->getBitWidth(),
3539 "endian_shift");
3540 }
3541 } else {
3542 Type *LTy = IRB.getPtrTy(AS);
3543 LoadInst *NewLI =
3544 IRB.CreateAlignedLoad(TargetTy, getNewAllocaSlicePtr(IRB, LTy),
3545 getSliceAlign(), LI.isVolatile(), LI.getName());
3546
3547 if (AATags)
3548 NewLI->setAAMetadata(AATags.adjustForAccess(
3549 NewBeginOffset - BeginOffset, NewLI->getType(), DL));
3550
3551 if (LI.isVolatile())
3552 NewLI->setAtomic(LI.getOrdering(), LI.getSyncScopeID());
3553 NewLI->copyMetadata(LI, {LLVMContext::MD_mem_parallel_loop_access,
3554 LLVMContext::MD_access_group});
3555
3556 V = NewLI;
3557 IsPtrAdjusted = true;
3558 }
3559 V = IRB.CreateBitPreservingCastChain(DL, V, TargetTy);
3560
3561 if (IsSplit) {
3562 assert(!LI.isVolatile());
3563 assert(LI.getType()->isIntegerTy() &&
3564 "Only integer type loads and stores are split");
3565 assert(SliceSize < DL.getTypeStoreSize(LI.getType()).getFixedValue() &&
3566 "Split load isn't smaller than original load");
3567 assert(DL.typeSizeEqualsStoreSize(LI.getType()) &&
3568 "Non-byte-multiple bit width");
3569 // Move the insertion point just past the load so that we can refer to it.
3570 BasicBlock::iterator LIIt = std::next(LI.getIterator());
3571 // Ensure the insertion point comes before any debug-info immediately
3572 // after the load, so that variable values referring to the load are
3573 // dominated by it.
3574 LIIt.setHeadBit(true);
3575 IRB.SetInsertPoint(LIIt);
3576 // Create a placeholder value with the same type as LI to use as the
3577 // basis for the new value. This allows us to replace the uses of LI with
3578 // the computed value, and then replace the placeholder with LI, leaving
3579 // LI only used for this computation.
3580 Value *Placeholder =
3581 new LoadInst(LI.getType(), PoisonValue::get(IRB.getPtrTy(AS)), "",
3582 false, Align(1));
3583 V = insertInteger(DL, IRB, Placeholder, V, NewBeginOffset - BeginOffset,
3584 "insert");
3585 LI.replaceAllUsesWith(V);
3586 Placeholder->replaceAllUsesWith(&LI);
3587 Placeholder->deleteValue();
3588 } else {
3589 LI.replaceAllUsesWith(V);
3590 }
3591
3592 Pass.DeadInsts.push_back(&LI);
3593 deleteIfTriviallyDead(OldOp);
3594 LLVM_DEBUG(dbgs() << " to: " << *V << "\n");
3595 return !LI.isVolatile() && !IsPtrAdjusted;
3596 }
3597
3598 bool rewriteVectorizedStoreInst(Value *V, StoreInst &SI, Value *OldOp,
3599 AAMDNodes AATags) {
3600 // Capture V for the purpose of debug-info accounting once it's converted
3601 // to a vector store.
3602 Value *OrigV = V;
3603 if (V->getType() != VecTy) {
3604 unsigned BeginIndex = getIndex(NewBeginOffset);
3605 unsigned EndIndex = getIndex(NewEndOffset);
3606 assert(EndIndex > BeginIndex && "Empty vector!");
3607 unsigned NumElements = EndIndex - BeginIndex;
3608 assert(NumElements <= cast<FixedVectorType>(VecTy)->getNumElements() &&
3609 "Too many elements!");
3610 Type *SliceTy = (NumElements == 1)
3611 ? ElementTy
3612 : FixedVectorType::get(ElementTy, NumElements);
3613 if (V->getType() != SliceTy)
3614 V = IRB.CreateBitPreservingCastChain(DL, V, SliceTy);
3615
3616 // Mix in the existing elements.
3617 Value *Old =
3618 IRB.CreateAlignedLoad(NewAllocaTy, &NewAI, NewAI.getAlign(), "load");
3619 V = insertVector(IRB, Old, V, BeginIndex, "vec");
3620 }
3621 StoreInst *Store = IRB.CreateAlignedStore(V, &NewAI, NewAI.getAlign());
3622 Store->copyMetadata(SI, {LLVMContext::MD_mem_parallel_loop_access,
3623 LLVMContext::MD_access_group});
3624 if (AATags)
3625 Store->setAAMetadata(AATags.adjustForAccess(NewBeginOffset - BeginOffset,
3626 V->getType(), DL));
3627 Pass.DeadInsts.push_back(&SI);
3628
3629 // NOTE: Careful to use OrigV rather than V.
3630 migrateDebugInfo(&OldAI, IsSplit, NewBeginOffset * 8, SliceSize * 8, &SI,
3631 Store, Store->getPointerOperand(), OrigV, DL);
3632 LLVM_DEBUG(dbgs() << " to: " << *Store << "\n");
3633 return true;
3634 }
3635
3636 bool rewriteIntegerStore(Value *V, StoreInst &SI, AAMDNodes AATags) {
3637 assert(IntTy && "We cannot extract an integer from the alloca");
3638 assert(!SI.isVolatile());
3639 if (DL.getTypeSizeInBits(V->getType()).getFixedValue() !=
3640 IntTy->getBitWidth()) {
3641 Value *Old = IRB.CreateAlignedLoad(NewAllocaTy, &NewAI, NewAI.getAlign(),
3642 "oldload");
3643 Old = IRB.CreateBitPreservingCastChain(DL, Old, IntTy);
3644 assert(BeginOffset >= NewAllocaBeginOffset && "Out of bounds offset");
3645 uint64_t Offset = BeginOffset - NewAllocaBeginOffset;
3646 V = insertInteger(DL, IRB, Old, SI.getValueOperand(), Offset, "insert");
3647 }
3648 V = IRB.CreateBitPreservingCastChain(DL, V, NewAllocaTy);
3649 StoreInst *Store = IRB.CreateAlignedStore(V, &NewAI, NewAI.getAlign());
3650 Store->copyMetadata(SI, {LLVMContext::MD_mem_parallel_loop_access,
3651 LLVMContext::MD_access_group});
3652 if (AATags)
3653 Store->setAAMetadata(AATags.adjustForAccess(NewBeginOffset - BeginOffset,
3654 V->getType(), DL));
3655
3656 migrateDebugInfo(&OldAI, IsSplit, NewBeginOffset * 8, SliceSize * 8, &SI,
3657 Store, Store->getPointerOperand(),
3658 Store->getValueOperand(), DL);
3659
3660 Pass.DeadInsts.push_back(&SI);
3661 LLVM_DEBUG(dbgs() << " to: " << *Store << "\n");
3662 return true;
3663 }
3664
3665 bool visitStoreInst(StoreInst &SI) {
3666 LLVM_DEBUG(dbgs() << " original: " << SI << "\n");
3667 Value *OldOp = SI.getOperand(1);
3668 assert(OldOp == OldPtr);
3669
3670 AAMDNodes AATags = SI.getAAMetadata();
3671 Value *V = SI.getValueOperand();
3672
3673 // Strip all inbounds GEPs and pointer casts to try to dig out any root
3674 // alloca that should be re-examined after promoting this alloca.
3675 if (V->getType()->isPointerTy())
3676 if (AllocaInst *AI = dyn_cast<AllocaInst>(V->stripInBoundsOffsets()))
3677 Pass.PostPromotionWorklist.insert(AI);
3678
3679 TypeSize StoreSize = DL.getTypeStoreSize(V->getType());
3680 if (StoreSize.isFixed() && SliceSize < StoreSize.getFixedValue()) {
3681 assert(!SI.isVolatile());
3682 assert(V->getType()->isIntegerTy() &&
3683 "Only integer type loads and stores are split");
3684 assert(DL.typeSizeEqualsStoreSize(V->getType()) &&
3685 "Non-byte-multiple bit width");
3686 IntegerType *NarrowTy = Type::getIntNTy(SI.getContext(), SliceSize * 8);
3687 V = extractInteger(DL, IRB, V, NarrowTy, NewBeginOffset - BeginOffset,
3688 "extract");
3689 }
3690
3691 if (VecTy)
3692 return rewriteVectorizedStoreInst(V, SI, OldOp, AATags);
3693 if (IntTy && V->getType()->isIntegerTy())
3694 return rewriteIntegerStore(V, SI, AATags);
3695
3696 StoreInst *NewSI;
3697 if (NewBeginOffset == NewAllocaBeginOffset &&
3698 NewEndOffset == NewAllocaEndOffset &&
3699 canConvertValue(DL, V->getType(), NewAllocaTy)) {
3700 V = IRB.CreateBitPreservingCastChain(DL, V, NewAllocaTy);
3701 Value *NewPtr =
3702 getPtrToNewAI(SI.getPointerAddressSpace(), SI.isVolatile());
3703
3704 NewSI =
3705 IRB.CreateAlignedStore(V, NewPtr, NewAI.getAlign(), SI.isVolatile());
3706 } else {
3707 unsigned AS = SI.getPointerAddressSpace();
3708 Value *NewPtr = getNewAllocaSlicePtr(IRB, IRB.getPtrTy(AS));
3709 NewSI =
3710 IRB.CreateAlignedStore(V, NewPtr, getSliceAlign(), SI.isVolatile());
3711 }
3712 NewSI->copyMetadata(SI, {LLVMContext::MD_mem_parallel_loop_access,
3713 LLVMContext::MD_access_group});
3714 if (AATags)
3715 NewSI->setAAMetadata(AATags.adjustForAccess(NewBeginOffset - BeginOffset,
3716 V->getType(), DL));
3717 if (SI.isVolatile())
3718 NewSI->setAtomic(SI.getOrdering(), SI.getSyncScopeID());
3719 if (NewSI->isAtomic())
3720 NewSI->setAlignment(SI.getAlign());
3721
3722 migrateDebugInfo(&OldAI, IsSplit, NewBeginOffset * 8, SliceSize * 8, &SI,
3723 NewSI, NewSI->getPointerOperand(),
3724 NewSI->getValueOperand(), DL);
3725
3726 Pass.DeadInsts.push_back(&SI);
3727 deleteIfTriviallyDead(OldOp);
3728
3729 LLVM_DEBUG(dbgs() << " to: " << *NewSI << "\n");
3730 return NewSI->getPointerOperand() == &NewAI &&
3731 NewSI->getValueOperand()->getType() == NewAllocaTy &&
3732 !SI.isVolatile();
3733 }
3734
3735 /// Compute an integer value from splatting an i8 across the given
3736 /// number of bytes.
3737 ///
3738 /// Note that this routine assumes an i8 is a byte. If that isn't true, don't
3739 /// call this routine.
3740 /// FIXME: Heed the advice above.
3741 ///
3742 /// \param V The i8 value to splat.
3743 /// \param Size The number of bytes in the output (assuming i8 is one byte)
3744 Value *getIntegerSplat(Value *V, unsigned Size) {
3745 assert(Size > 0 && "Expected a positive number of bytes.");
3746 IntegerType *VTy = cast<IntegerType>(V->getType());
3747 assert(VTy->getBitWidth() == 8 && "Expected an i8 value for the byte");
3748 if (Size == 1)
3749 return V;
3750
3751 Type *SplatIntTy = Type::getIntNTy(VTy->getContext(), Size * 8);
3752 V = IRB.CreateMul(
3753 IRB.CreateZExt(V, SplatIntTy, "zext"),
3754 IRB.CreateUDiv(Constant::getAllOnesValue(SplatIntTy),
3755 IRB.CreateZExt(Constant::getAllOnesValue(V->getType()),
3756 SplatIntTy)),
3757 "isplat");
3758 return V;
3759 }
3760
3761 /// Compute a vector splat for a given element value.
3762 Value *getVectorSplat(Value *V, unsigned NumElements) {
3763 V = IRB.CreateVectorSplat(NumElements, V, "vsplat");
3764 LLVM_DEBUG(dbgs() << " splat: " << *V << "\n");
3765 return V;
3766 }
3767
3768 bool visitMemSetInst(MemSetInst &II) {
3769 LLVM_DEBUG(dbgs() << " original: " << II << "\n");
3770 assert(II.getRawDest() == OldPtr);
3771
3772 AAMDNodes AATags = II.getAAMetadata();
3773
3774 // If the memset has a variable size, it cannot be split, just adjust the
3775 // pointer to the new alloca.
3776 if (!isa<ConstantInt>(II.getLength())) {
3777 assert(!IsSplit);
3778 assert(NewBeginOffset == BeginOffset);
3779 II.setDest(getNewAllocaSlicePtr(IRB, OldPtr->getType()));
3780 II.setDestAlignment(getSliceAlign());
3781 // In theory we should call migrateDebugInfo here. However, we do not
3782 // emit dbg.assign intrinsics for mem intrinsics storing through non-
3783 // constant geps, or storing a variable number of bytes.
3785 "AT: Unexpected link to non-const GEP");
3786 deleteIfTriviallyDead(OldPtr);
3787 return false;
3788 }
3789
3790 // Record this instruction for deletion.
3791 Pass.DeadInsts.push_back(&II);
3792
3793 Type *ScalarTy = NewAllocaTy->getScalarType();
3794
3795 const bool CanContinue = [&]() {
3796 if (VecTy || IntTy)
3797 return true;
3798 if (BeginOffset > NewAllocaBeginOffset || EndOffset < NewAllocaEndOffset)
3799 return false;
3800 // Length must be in range for FixedVectorType.
3801 auto *C = cast<ConstantInt>(II.getLength());
3802 const uint64_t Len = C->getLimitedValue();
3803 if (Len > std::numeric_limits<unsigned>::max())
3804 return false;
3805 auto *Int8Ty = IntegerType::getInt8Ty(NewAI.getContext());
3806 auto *SrcTy = FixedVectorType::get(Int8Ty, Len);
3807 return canConvertValue(DL, SrcTy, NewAllocaTy) &&
3808 DL.isLegalInteger(DL.getTypeSizeInBits(ScalarTy).getFixedValue());
3809 }();
3810
3811 // If this doesn't map cleanly onto the alloca type, and that type isn't
3812 // a single value type, just emit a memset.
3813 if (!CanContinue) {
3814 Type *SizeTy = II.getLength()->getType();
3815 unsigned Sz = NewEndOffset - NewBeginOffset;
3816 Constant *Size = ConstantInt::get(SizeTy, Sz);
3817 MemIntrinsic *New = cast<MemIntrinsic>(IRB.CreateMemSet(
3818 getNewAllocaSlicePtr(IRB, OldPtr->getType()), II.getValue(), Size,
3819 MaybeAlign(getSliceAlign()), II.isVolatile()));
3820 if (AATags)
3821 New->setAAMetadata(
3822 AATags.adjustForAccess(NewBeginOffset - BeginOffset, Sz));
3823
3824 migrateDebugInfo(&OldAI, IsSplit, NewBeginOffset * 8, SliceSize * 8, &II,
3825 New, New->getRawDest(), nullptr, DL);
3826
3827 LLVM_DEBUG(dbgs() << " to: " << *New << "\n");
3828 return false;
3829 }
3830
3831 // If we can represent this as a simple value, we have to build the actual
3832 // value to store, which requires expanding the byte present in memset to
3833 // a sensible representation for the alloca type. This is essentially
3834 // splatting the byte to a sufficiently wide integer, splatting it across
3835 // any desired vector width, and bitcasting to the final type.
3836 Value *V;
3837
3838 if (VecTy) {
3839 // If this is a memset of a vectorized alloca, insert it.
3840 assert(ElementTy == ScalarTy);
3841
3842 unsigned BeginIndex = getIndex(NewBeginOffset);
3843 unsigned EndIndex = getIndex(NewEndOffset);
3844 assert(EndIndex > BeginIndex && "Empty vector!");
3845 unsigned NumElements = EndIndex - BeginIndex;
3846 assert(NumElements <= cast<FixedVectorType>(VecTy)->getNumElements() &&
3847 "Too many elements!");
3848
3849 Value *Splat = getIntegerSplat(
3850 II.getValue(), DL.getTypeSizeInBits(ElementTy).getFixedValue() / 8);
3851 Splat = IRB.CreateBitPreservingCastChain(DL, Splat, ElementTy);
3852 if (NumElements > 1)
3853 Splat = getVectorSplat(Splat, NumElements);
3854
3855 Value *Old = IRB.CreateAlignedLoad(NewAllocaTy, &NewAI, NewAI.getAlign(),
3856 "oldload");
3857 V = insertVector(IRB, Old, Splat, BeginIndex, "vec");
3858 } else if (IntTy) {
3859 // If this is a memset on an alloca where we can widen stores, insert the
3860 // set integer.
3861 assert(!II.isVolatile());
3862
3863 uint64_t Size = NewEndOffset - NewBeginOffset;
3864 V = getIntegerSplat(II.getValue(), Size);
3865
3866 if (IntTy && (NewBeginOffset != NewAllocaBeginOffset ||
3867 NewEndOffset != NewAllocaEndOffset)) {
3868 Value *Old = IRB.CreateAlignedLoad(NewAllocaTy, &NewAI,
3869 NewAI.getAlign(), "oldload");
3870 Old = IRB.CreateBitPreservingCastChain(DL, Old, IntTy);
3871 uint64_t Offset = NewBeginOffset - NewAllocaBeginOffset;
3872 V = insertInteger(DL, IRB, Old, V, Offset, "insert");
3873 } else {
3874 assert(V->getType() == IntTy &&
3875 "Wrong type for an alloca wide integer!");
3876 }
3877 V = IRB.CreateBitPreservingCastChain(DL, V, NewAllocaTy);
3878 } else {
3879 // Established these invariants above.
3880 assert(NewBeginOffset == NewAllocaBeginOffset);
3881 assert(NewEndOffset == NewAllocaEndOffset);
3882
3883 V = getIntegerSplat(II.getValue(),
3884 DL.getTypeSizeInBits(ScalarTy).getFixedValue() / 8);
3885 if (VectorType *AllocaVecTy = dyn_cast<VectorType>(NewAllocaTy))
3886 V = getVectorSplat(
3887 V, cast<FixedVectorType>(AllocaVecTy)->getNumElements());
3888
3889 V = IRB.CreateBitPreservingCastChain(DL, V, NewAllocaTy);
3890 }
3891
3892 Value *NewPtr = getPtrToNewAI(II.getDestAddressSpace(), II.isVolatile());
3893 StoreInst *New =
3894 IRB.CreateAlignedStore(V, NewPtr, NewAI.getAlign(), II.isVolatile());
3895 New->copyMetadata(II, {LLVMContext::MD_mem_parallel_loop_access,
3896 LLVMContext::MD_access_group});
3897 if (AATags)
3898 New->setAAMetadata(AATags.adjustForAccess(NewBeginOffset - BeginOffset,
3899 V->getType(), DL));
3900
3901 migrateDebugInfo(&OldAI, IsSplit, NewBeginOffset * 8, SliceSize * 8, &II,
3902 New, New->getPointerOperand(), V, DL);
3903
3904 LLVM_DEBUG(dbgs() << " to: " << *New << "\n");
3905 return !II.isVolatile();
3906 }
3907
3908 bool visitMemTransferInst(MemTransferInst &II) {
3909 // Rewriting of memory transfer instructions can be a bit tricky. We break
3910 // them into two categories: split intrinsics and unsplit intrinsics.
3911
3912 LLVM_DEBUG(dbgs() << " original: " << II << "\n");
3913
3914 AAMDNodes AATags = II.getAAMetadata();
3915
3916 bool IsDest = &II.getRawDestUse() == OldUse;
3917 assert((IsDest && II.getRawDest() == OldPtr) ||
3918 (!IsDest && II.getRawSource() == OldPtr));
3919
3920 Align SliceAlign = getSliceAlign();
3921 // For unsplit intrinsics, we simply modify the source and destination
3922 // pointers in place. This isn't just an optimization, it is a matter of
3923 // correctness. With unsplit intrinsics we may be dealing with transfers
3924 // within a single alloca before SROA ran, or with transfers that have
3925 // a variable length. We may also be dealing with memmove instead of
3926 // memcpy, and so simply updating the pointers is the necessary for us to
3927 // update both source and dest of a single call.
3928 if (!IsSplittable) {
3929 Value *AdjustedPtr = getNewAllocaSlicePtr(IRB, OldPtr->getType());
3930 if (IsDest) {
3931 // Update the address component of linked dbg.assigns.
3932 for (DbgVariableRecord *DbgAssign : at::getDVRAssignmentMarkers(&II)) {
3933 if (llvm::is_contained(DbgAssign->location_ops(), II.getDest()) ||
3934 DbgAssign->getAddress() == II.getDest())
3935 DbgAssign->replaceVariableLocationOp(II.getDest(), AdjustedPtr);
3936 }
3937 II.setDest(AdjustedPtr);
3938 II.setDestAlignment(SliceAlign);
3939 } else {
3940 II.setSource(AdjustedPtr);
3941 II.setSourceAlignment(SliceAlign);
3942 }
3943
3944 LLVM_DEBUG(dbgs() << " to: " << II << "\n");
3945 deleteIfTriviallyDead(OldPtr);
3946 return false;
3947 }
3948 // For split transfer intrinsics we have an incredibly useful assurance:
3949 // the source and destination do not reside within the same alloca, and at
3950 // least one of them does not escape. This means that we can replace
3951 // memmove with memcpy, and we don't need to worry about all manner of
3952 // downsides to splitting and transforming the operations.
3953
3954 // If this doesn't map cleanly onto the alloca type, and that type isn't
3955 // a single value type, just emit a memcpy.
3956 bool EmitMemCpy =
3957 !VecTy && !IntTy &&
3958 (BeginOffset > NewAllocaBeginOffset || EndOffset < NewAllocaEndOffset ||
3959 SliceSize != DL.getTypeStoreSize(NewAllocaTy).getFixedValue() ||
3960 !DL.typeSizeEqualsStoreSize(NewAllocaTy) ||
3961 !NewAllocaTy->isSingleValueType());
3962
3963 // If we're just going to emit a memcpy, the alloca hasn't changed, and the
3964 // size hasn't been shrunk based on analysis of the viable range, this is
3965 // a no-op.
3966 if (EmitMemCpy && &OldAI == &NewAI) {
3967 // Ensure the start lines up.
3968 assert(NewBeginOffset == BeginOffset);
3969
3970 // Rewrite the size as needed.
3971 if (NewEndOffset != EndOffset)
3972 II.setLength(NewEndOffset - NewBeginOffset);
3973 return false;
3974 }
3975 // Record this instruction for deletion.
3976 Pass.DeadInsts.push_back(&II);
3977
3978 // Strip all inbounds GEPs and pointer casts to try to dig out any root
3979 // alloca that should be re-examined after rewriting this instruction.
3980 Value *OtherPtr = IsDest ? II.getRawSource() : II.getRawDest();
3981 if (AllocaInst *AI =
3983 assert(AI != &OldAI && AI != &NewAI &&
3984 "Splittable transfers cannot reach the same alloca on both ends.");
3985 Pass.Worklist.insert(AI);
3986 }
3987
3988 Type *OtherPtrTy = OtherPtr->getType();
3989 unsigned OtherAS = OtherPtrTy->getPointerAddressSpace();
3990
3991 // Compute the relative offset for the other pointer within the transfer.
3992 unsigned OffsetWidth = DL.getIndexSizeInBits(OtherAS);
3993 APInt OtherOffset(OffsetWidth, NewBeginOffset - BeginOffset);
3994 Align OtherAlign =
3995 (IsDest ? II.getSourceAlign() : II.getDestAlign()).valueOrOne();
3996 OtherAlign =
3997 commonAlignment(OtherAlign, OtherOffset.zextOrTrunc(64).getZExtValue());
3998
3999 if (EmitMemCpy) {
4000 // Compute the other pointer, folding as much as possible to produce
4001 // a single, simple GEP in most cases.
4002 OtherPtr = getAdjustedPtr(IRB, DL, OtherPtr, OtherOffset, OtherPtrTy,
4003 OtherPtr->getName() + ".");
4004
4005 Value *OurPtr = getNewAllocaSlicePtr(IRB, OldPtr->getType());
4006 Type *SizeTy = II.getLength()->getType();
4007 Constant *Size = ConstantInt::get(SizeTy, NewEndOffset - NewBeginOffset);
4008
4009 Value *DestPtr, *SrcPtr;
4010 MaybeAlign DestAlign, SrcAlign;
4011 // Note: IsDest is true iff we're copying into the new alloca slice
4012 if (IsDest) {
4013 DestPtr = OurPtr;
4014 DestAlign = SliceAlign;
4015 SrcPtr = OtherPtr;
4016 SrcAlign = OtherAlign;
4017 } else {
4018 DestPtr = OtherPtr;
4019 DestAlign = OtherAlign;
4020 SrcPtr = OurPtr;
4021 SrcAlign = SliceAlign;
4022 }
4023 CallInst *New = IRB.CreateMemCpy(DestPtr, DestAlign, SrcPtr, SrcAlign,
4024 Size, II.isVolatile());
4025 if (AATags)
4026 New->setAAMetadata(AATags.shift(NewBeginOffset - BeginOffset));
4027
4028 APInt Offset(DL.getIndexTypeSizeInBits(DestPtr->getType()), 0);
4029 if (IsDest) {
4030 migrateDebugInfo(&OldAI, IsSplit, NewBeginOffset * 8, SliceSize * 8,
4031 &II, New, DestPtr, nullptr, DL);
4032 } else if (AllocaInst *Base = dyn_cast<AllocaInst>(
4034 DL, Offset, /*AllowNonInbounds*/ true))) {
4035 migrateDebugInfo(Base, IsSplit, Offset.getZExtValue() * 8,
4036 SliceSize * 8, &II, New, DestPtr, nullptr, DL);
4037 }
4038 LLVM_DEBUG(dbgs() << " to: " << *New << "\n");
4039 return false;
4040 }
4041
4042 bool IsWholeAlloca = NewBeginOffset == NewAllocaBeginOffset &&
4043 NewEndOffset == NewAllocaEndOffset;
4044 uint64_t Size = NewEndOffset - NewBeginOffset;
4045 unsigned BeginIndex = VecTy ? getIndex(NewBeginOffset) : 0;
4046 unsigned EndIndex = VecTy ? getIndex(NewEndOffset) : 0;
4047 unsigned NumElements = EndIndex - BeginIndex;
4048 IntegerType *SubIntTy =
4049 IntTy ? Type::getIntNTy(IntTy->getContext(), Size * 8) : nullptr;
4050
4051 // Reset the other pointer type to match the register type we're going to
4052 // use, but using the address space of the original other pointer.
4053 Type *OtherTy;
4054 if (VecTy && !IsWholeAlloca) {
4055 if (NumElements == 1)
4056 OtherTy = VecTy->getElementType();
4057 else
4058 OtherTy = FixedVectorType::get(VecTy->getElementType(), NumElements);
4059 } else if (IntTy && !IsWholeAlloca) {
4060 OtherTy = SubIntTy;
4061 } else {
4062 OtherTy = NewAllocaTy;
4063 }
4064
4065 Value *AdjPtr = getAdjustedPtr(IRB, DL, OtherPtr, OtherOffset, OtherPtrTy,
4066 OtherPtr->getName() + ".");
4067 MaybeAlign SrcAlign = OtherAlign;
4068 MaybeAlign DstAlign = SliceAlign;
4069 if (!IsDest)
4070 std::swap(SrcAlign, DstAlign);
4071
4072 Value *SrcPtr;
4073 Value *DstPtr;
4074
4075 if (IsDest) {
4076 DstPtr = getPtrToNewAI(II.getDestAddressSpace(), II.isVolatile());
4077 SrcPtr = AdjPtr;
4078 } else {
4079 DstPtr = AdjPtr;
4080 SrcPtr = getPtrToNewAI(II.getSourceAddressSpace(), II.isVolatile());
4081 }
4082
4083 Value *Src;
4084 if (VecTy && !IsWholeAlloca && !IsDest) {
4085 Src =
4086 IRB.CreateAlignedLoad(NewAllocaTy, &NewAI, NewAI.getAlign(), "load");
4087 Src = extractVector(IRB, Src, BeginIndex, EndIndex, "vec");
4088 } else if (IntTy && !IsWholeAlloca && !IsDest) {
4089 Src =
4090 IRB.CreateAlignedLoad(NewAllocaTy, &NewAI, NewAI.getAlign(), "load");
4091 Src = IRB.CreateBitPreservingCastChain(DL, Src, IntTy);
4092 uint64_t Offset = NewBeginOffset - NewAllocaBeginOffset;
4093 Src = extractInteger(DL, IRB, Src, SubIntTy, Offset, "extract");
4094 } else {
4095 LoadInst *Load = IRB.CreateAlignedLoad(OtherTy, SrcPtr, SrcAlign,
4096 II.isVolatile(), "copyload");
4097 Load->copyMetadata(II, {LLVMContext::MD_mem_parallel_loop_access,
4098 LLVMContext::MD_access_group});
4099 if (AATags)
4100 Load->setAAMetadata(AATags.adjustForAccess(NewBeginOffset - BeginOffset,
4101 Load->getType(), DL));
4102 Src = Load;
4103 }
4104
4105 if (VecTy && !IsWholeAlloca && IsDest) {
4106 Value *Old = IRB.CreateAlignedLoad(NewAllocaTy, &NewAI, NewAI.getAlign(),
4107 "oldload");
4108 Src = insertVector(IRB, Old, Src, BeginIndex, "vec");
4109 } else if (IntTy && !IsWholeAlloca && IsDest) {
4110 Value *Old = IRB.CreateAlignedLoad(NewAllocaTy, &NewAI, NewAI.getAlign(),
4111 "oldload");
4112 Old = IRB.CreateBitPreservingCastChain(DL, Old, IntTy);
4113 uint64_t Offset = NewBeginOffset - NewAllocaBeginOffset;
4114 Src = insertInteger(DL, IRB, Old, Src, Offset, "insert");
4115 Src = IRB.CreateBitPreservingCastChain(DL, Src, NewAllocaTy);
4116 }
4117
4118 StoreInst *Store = cast<StoreInst>(
4119 IRB.CreateAlignedStore(Src, DstPtr, DstAlign, II.isVolatile()));
4120 Store->copyMetadata(II, {LLVMContext::MD_mem_parallel_loop_access,
4121 LLVMContext::MD_access_group});
4122 if (AATags)
4123 Store->setAAMetadata(AATags.adjustForAccess(NewBeginOffset - BeginOffset,
4124 Src->getType(), DL));
4125
4126 APInt Offset(DL.getIndexTypeSizeInBits(DstPtr->getType()), 0);
4127 if (IsDest) {
4128
4129 migrateDebugInfo(&OldAI, IsSplit, NewBeginOffset * 8, SliceSize * 8, &II,
4130 Store, DstPtr, Src, DL);
4131 } else if (AllocaInst *Base = dyn_cast<AllocaInst>(
4133 DL, Offset, /*AllowNonInbounds*/ true))) {
4134 migrateDebugInfo(Base, IsSplit, Offset.getZExtValue() * 8, SliceSize * 8,
4135 &II, Store, DstPtr, Src, DL);
4136 }
4137
4138 LLVM_DEBUG(dbgs() << " to: " << *Store << "\n");
4139 return !II.isVolatile();
4140 }
4141
4142 bool visitIntrinsicInst(IntrinsicInst &II) {
4143 assert((II.isLifetimeStartOrEnd() || II.isDroppable()) &&
4144 "Unexpected intrinsic!");
4145 LLVM_DEBUG(dbgs() << " original: " << II << "\n");
4146
4147 // Record this instruction for deletion.
4148 Pass.DeadInsts.push_back(&II);
4149
4150 if (II.isDroppable()) {
4151 assert(II.getIntrinsicID() == Intrinsic::assume && "Expected assume");
4152 // TODO For now we forget assumed information, this can be improved.
4153 OldPtr->dropDroppableUsesIn(II);
4154 return true;
4155 }
4156
4157 assert(II.getArgOperand(0) == OldPtr);
4158 Type *PointerTy = IRB.getPtrTy(OldPtr->getType()->getPointerAddressSpace());
4159 Value *Ptr = getNewAllocaSlicePtr(IRB, PointerTy);
4160 Value *New;
4161 if (II.getIntrinsicID() == Intrinsic::lifetime_start)
4162 New = IRB.CreateLifetimeStart(Ptr);
4163 else
4164 New = IRB.CreateLifetimeEnd(Ptr);
4165
4166 (void)New;
4167 LLVM_DEBUG(dbgs() << " to: " << *New << "\n");
4168
4169 return true;
4170 }
4171
4172 void fixLoadStoreAlign(Instruction &Root) {
4173 // This algorithm implements the same visitor loop as
4174 // hasUnsafePHIOrSelectUse, and fixes the alignment of each load
4175 // or store found.
4176 SmallPtrSet<Instruction *, 4> Visited;
4177 SmallVector<Instruction *, 4> Uses;
4178 Visited.insert(&Root);
4179 Uses.push_back(&Root);
4180 do {
4181 Instruction *I = Uses.pop_back_val();
4182
4183 if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
4184 LI->setAlignment(std::min(LI->getAlign(), getSliceAlign()));
4185 continue;
4186 }
4187 if (StoreInst *SI = dyn_cast<StoreInst>(I)) {
4188 SI->setAlignment(std::min(SI->getAlign(), getSliceAlign()));
4189 continue;
4190 }
4191
4195 for (User *U : I->users())
4196 if (Visited.insert(cast<Instruction>(U)).second)
4197 Uses.push_back(cast<Instruction>(U));
4198 } while (!Uses.empty());
4199 }
4200
4201 bool visitPHINode(PHINode &PN) {
4202 LLVM_DEBUG(dbgs() << " original: " << PN << "\n");
4203 assert(BeginOffset >= NewAllocaBeginOffset && "PHIs are unsplittable");
4204 assert(EndOffset <= NewAllocaEndOffset && "PHIs are unsplittable");
4205
4206 // We would like to compute a new pointer in only one place, but have it be
4207 // as local as possible to the PHI. To do that, we re-use the location of
4208 // the old pointer, which necessarily must be in the right position to
4209 // dominate the PHI.
4210 IRBuilderBase::InsertPointGuard Guard(IRB);
4211 if (isa<PHINode>(OldPtr))
4212 IRB.SetInsertPoint(OldPtr->getParent()->getFirstInsertionPt());
4213 else
4214 IRB.SetInsertPoint(OldPtr);
4215 IRB.SetCurrentDebugLocation(OldPtr->getDebugLoc());
4216
4217 Value *NewPtr = getNewAllocaSlicePtr(IRB, OldPtr->getType());
4218 // Replace the operands which were using the old pointer.
4219 std::replace(PN.op_begin(), PN.op_end(), cast<Value>(OldPtr), NewPtr);
4220
4221 LLVM_DEBUG(dbgs() << " to: " << PN << "\n");
4222 deleteIfTriviallyDead(OldPtr);
4223
4224 // Fix the alignment of any loads or stores using this PHI node.
4225 fixLoadStoreAlign(PN);
4226
4227 // PHIs can't be promoted on their own, but often can be speculated. We
4228 // check the speculation outside of the rewriter so that we see the
4229 // fully-rewritten alloca.
4230 PHIUsers.insert(&PN);
4231 return true;
4232 }
4233
4234 bool visitSelectInst(SelectInst &SI) {
4235 LLVM_DEBUG(dbgs() << " original: " << SI << "\n");
4236 assert((SI.getTrueValue() == OldPtr || SI.getFalseValue() == OldPtr) &&
4237 "Pointer isn't an operand!");
4238 assert(BeginOffset >= NewAllocaBeginOffset && "Selects are unsplittable");
4239 assert(EndOffset <= NewAllocaEndOffset && "Selects are unsplittable");
4240
4241 Value *NewPtr = getNewAllocaSlicePtr(IRB, OldPtr->getType());
4242 // Replace the operands which were using the old pointer.
4243 if (SI.getOperand(1) == OldPtr)
4244 SI.setOperand(1, NewPtr);
4245 if (SI.getOperand(2) == OldPtr)
4246 SI.setOperand(2, NewPtr);
4247
4248 LLVM_DEBUG(dbgs() << " to: " << SI << "\n");
4249 deleteIfTriviallyDead(OldPtr);
4250
4251 // Fix the alignment of any loads or stores using this select.
4252 fixLoadStoreAlign(SI);
4253
4254 // Selects can't be promoted on their own, but often can be speculated. We
4255 // check the speculation outside of the rewriter so that we see the
4256 // fully-rewritten alloca.
4257 SelectUsers.insert(&SI);
4258 return true;
4259 }
4260};
4261
4262/// Visitor to rewrite aggregate loads and stores as scalar.
4263///
4264/// This pass aggressively rewrites all aggregate loads and stores on
4265/// a particular pointer (or any pointer derived from it which we can identify)
4266/// with scalar loads and stores.
4267class AggLoadStoreRewriter : public InstVisitor<AggLoadStoreRewriter, bool> {
4268 // Befriend the base class so it can delegate to private visit methods.
4269 friend class InstVisitor<AggLoadStoreRewriter, bool>;
4270
4271 /// Queue of pointer uses to analyze and potentially rewrite.
4273
4274 /// Set to prevent us from cycling with phi nodes and loops.
4275 SmallPtrSet<User *, 8> Visited;
4276
4277 /// The current pointer use being rewritten. This is used to dig up the used
4278 /// value (as opposed to the user).
4279 Use *U = nullptr;
4280
4281 /// Used to calculate offsets, and hence alignment, of subobjects.
4282 const DataLayout &DL;
4283
4284 IRBuilderTy &IRB;
4285
4286public:
4287 AggLoadStoreRewriter(const DataLayout &DL, IRBuilderTy &IRB)
4288 : DL(DL), IRB(IRB) {}
4289
4290 /// Rewrite loads and stores through a pointer and all pointers derived from
4291 /// it.
4292 bool rewrite(Instruction &I) {
4293 LLVM_DEBUG(dbgs() << " Rewriting FCA loads and stores...\n");
4294 enqueueUsers(I);
4295 bool Changed = false;
4296 while (!Queue.empty()) {
4297 U = Queue.pop_back_val();
4298 Changed |= visit(cast<Instruction>(U->getUser()));
4299 }
4300 return Changed;
4301 }
4302
4303private:
4304 /// Enqueue all the users of the given instruction for further processing.
4305 /// This uses a set to de-duplicate users.
4306 void enqueueUsers(Instruction &I) {
4307 for (Use &U : I.uses())
4308 if (Visited.insert(U.getUser()).second)
4309 Queue.push_back(&U);
4310 }
4311
4312 // Conservative default is to not rewrite anything.
4313 bool visitInstruction(Instruction &I) { return false; }
4314
4315 /// Generic recursive split emission class.
4316 template <typename Derived> class OpSplitter {
4317 protected:
4318 /// The builder used to form new instructions.
4319 IRBuilderTy &IRB;
4320
4321 /// The indices which to be used with insert- or extractvalue to select the
4322 /// appropriate value within the aggregate.
4323 SmallVector<unsigned, 4> Indices;
4324
4325 /// The indices to a GEP instruction which will move Ptr to the correct slot
4326 /// within the aggregate.
4327 SmallVector<Value *, 4> GEPIndices;
4328
4329 /// The base pointer of the original op, used as a base for GEPing the
4330 /// split operations.
4331 Value *Ptr;
4332
4333 /// The base pointee type being GEPed into.
4334 Type *BaseTy;
4335
4336 /// Known alignment of the base pointer.
4337 Align BaseAlign;
4338
4339 /// To calculate offset of each component so we can correctly deduce
4340 /// alignments.
4341 const DataLayout &DL;
4342
4343 /// Initialize the splitter with an insertion point, Ptr and start with a
4344 /// single zero GEP index.
4345 OpSplitter(Instruction *InsertionPoint, Value *Ptr, Type *BaseTy,
4346 Align BaseAlign, const DataLayout &DL, IRBuilderTy &IRB)
4347 : IRB(IRB), GEPIndices(1, IRB.getInt32(0)), Ptr(Ptr), BaseTy(BaseTy),
4348 BaseAlign(BaseAlign), DL(DL) {
4349 IRB.SetInsertPoint(InsertionPoint);
4350 }
4351
4352 public:
4353 /// Generic recursive split emission routine.
4354 ///
4355 /// This method recursively splits an aggregate op (load or store) into
4356 /// scalar or vector ops. It splits recursively until it hits a single value
4357 /// and emits that single value operation via the template argument.
4358 ///
4359 /// The logic of this routine relies on GEPs and insertvalue and
4360 /// extractvalue all operating with the same fundamental index list, merely
4361 /// formatted differently (GEPs need actual values).
4362 ///
4363 /// \param Ty The type being split recursively into smaller ops.
4364 /// \param Agg The aggregate value being built up or stored, depending on
4365 /// whether this is splitting a load or a store respectively.
4366 void emitSplitOps(Type *Ty, Value *&Agg, const Twine &Name) {
4367 if (Ty->isSingleValueType()) {
4368 unsigned Offset = DL.getIndexedOffsetInType(BaseTy, GEPIndices);
4369 return static_cast<Derived *>(this)->emitFunc(
4370 Ty, Agg, commonAlignment(BaseAlign, Offset), Name);
4371 }
4372
4373 if (ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
4374 unsigned OldSize = Indices.size();
4375 (void)OldSize;
4376 for (unsigned Idx = 0, Size = ATy->getNumElements(); Idx != Size;
4377 ++Idx) {
4378 assert(Indices.size() == OldSize && "Did not return to the old size");
4379 Indices.push_back(Idx);
4380 GEPIndices.push_back(IRB.getInt32(Idx));
4381 emitSplitOps(ATy->getElementType(), Agg, Name + "." + Twine(Idx));
4382 GEPIndices.pop_back();
4383 Indices.pop_back();
4384 }
4385 return;
4386 }
4387
4388 if (StructType *STy = dyn_cast<StructType>(Ty)) {
4389 unsigned OldSize = Indices.size();
4390 (void)OldSize;
4391 for (unsigned Idx = 0, Size = STy->getNumElements(); Idx != Size;
4392 ++Idx) {
4393 assert(Indices.size() == OldSize && "Did not return to the old size");
4394 Indices.push_back(Idx);
4395 GEPIndices.push_back(IRB.getInt32(Idx));
4396 emitSplitOps(STy->getElementType(Idx), Agg, Name + "." + Twine(Idx));
4397 GEPIndices.pop_back();
4398 Indices.pop_back();
4399 }
4400 return;
4401 }
4402
4403 llvm_unreachable("Only arrays and structs are aggregate loadable types");
4404 }
4405 };
4406
4407 struct LoadOpSplitter : public OpSplitter<LoadOpSplitter> {
4408 AAMDNodes AATags;
4409 // A vector to hold the split components that we want to emit
4410 // separate fake uses for.
4411 SmallVector<Value *, 4> Components;
4412 // A vector to hold all the fake uses of the struct that we are splitting.
4413 // Usually there should only be one, but we are handling the general case.
4415
4416 LoadOpSplitter(Instruction *InsertionPoint, Value *Ptr, Type *BaseTy,
4417 AAMDNodes AATags, Align BaseAlign, const DataLayout &DL,
4418 IRBuilderTy &IRB)
4419 : OpSplitter<LoadOpSplitter>(InsertionPoint, Ptr, BaseTy, BaseAlign, DL,
4420 IRB),
4421 AATags(AATags) {}
4422
4423 /// Emit a leaf load of a single value. This is called at the leaves of the
4424 /// recursive emission to actually load values.
4425 void emitFunc(Type *Ty, Value *&Agg, Align Alignment, const Twine &Name) {
4427 // Load the single value and insert it using the indices.
4428 Value *GEP =
4429 IRB.CreateInBoundsGEP(BaseTy, Ptr, GEPIndices, Name + ".gep");
4430 LoadInst *Load =
4431 IRB.CreateAlignedLoad(Ty, GEP, Alignment, Name + ".load");
4432
4433 APInt Offset(
4434 DL.getIndexSizeInBits(Ptr->getType()->getPointerAddressSpace()), 0);
4435 if (AATags &&
4436 GEPOperator::accumulateConstantOffset(BaseTy, GEPIndices, DL, Offset))
4437 Load->setAAMetadata(
4438 AATags.adjustForAccess(Offset.getZExtValue(), Load->getType(), DL));
4439 // Record the load so we can generate a fake use for this aggregate
4440 // component.
4441 Components.push_back(Load);
4442
4443 Agg = IRB.CreateInsertValue(Agg, Load, Indices, Name + ".insert");
4444 LLVM_DEBUG(dbgs() << " to: " << *Load << "\n");
4445 }
4446
4447 // Stash the fake uses that use the value generated by this instruction.
4448 void recordFakeUses(LoadInst &LI) {
4449 for (Use &U : LI.uses())
4450 if (auto *II = dyn_cast<IntrinsicInst>(U.getUser()))
4451 if (II->getIntrinsicID() == Intrinsic::fake_use)
4452 FakeUses.push_back(II);
4453 }
4454
4455 // Replace all fake uses of the aggregate with a series of fake uses, one
4456 // for each split component.
4457 void emitFakeUses() {
4458 for (Instruction *I : FakeUses) {
4459 IRB.SetInsertPoint(I);
4460 for (auto *V : Components)
4461 IRB.CreateIntrinsic(Intrinsic::fake_use, {V});
4462 I->eraseFromParent();
4463 }
4464 }
4465 };
4466
4467 bool visitLoadInst(LoadInst &LI) {
4468 assert(LI.getPointerOperand() == *U);
4469 if (!LI.isSimple() || LI.getType()->isSingleValueType())
4470 return false;
4471
4472 // We have an aggregate being loaded, split it apart.
4473 LLVM_DEBUG(dbgs() << " original: " << LI << "\n");
4474 LoadOpSplitter Splitter(&LI, *U, LI.getType(), LI.getAAMetadata(),
4475 getAdjustedAlignment(&LI, 0), DL, IRB);
4476 Splitter.recordFakeUses(LI);
4478 Splitter.emitSplitOps(LI.getType(), V, LI.getName() + ".fca");
4479 Splitter.emitFakeUses();
4480 Visited.erase(&LI);
4481 LI.replaceAllUsesWith(V);
4482 LI.eraseFromParent();
4483 return true;
4484 }
4485
4486 struct StoreOpSplitter : public OpSplitter<StoreOpSplitter> {
4487 StoreOpSplitter(Instruction *InsertionPoint, Value *Ptr, Type *BaseTy,
4488 AAMDNodes AATags, StoreInst *AggStore, Align BaseAlign,
4489 const DataLayout &DL, IRBuilderTy &IRB)
4490 : OpSplitter<StoreOpSplitter>(InsertionPoint, Ptr, BaseTy, BaseAlign,
4491 DL, IRB),
4492 AATags(AATags), AggStore(AggStore) {}
4493 AAMDNodes AATags;
4494 StoreInst *AggStore;
4495 /// Emit a leaf store of a single value. This is called at the leaves of the
4496 /// recursive emission to actually produce stores.
4497 void emitFunc(Type *Ty, Value *&Agg, Align Alignment, const Twine &Name) {
4499 // Extract the single value and store it using the indices.
4500 //
4501 // The gep and extractvalue values are factored out of the CreateStore
4502 // call to make the output independent of the argument evaluation order.
4503 Value *ExtractValue =
4504 IRB.CreateExtractValue(Agg, Indices, Name + ".extract");
4505 Value *InBoundsGEP =
4506 IRB.CreateInBoundsGEP(BaseTy, Ptr, GEPIndices, Name + ".gep");
4507 StoreInst *Store =
4508 IRB.CreateAlignedStore(ExtractValue, InBoundsGEP, Alignment);
4509
4510 APInt Offset(
4511 DL.getIndexSizeInBits(Ptr->getType()->getPointerAddressSpace()), 0);
4512 GEPOperator::accumulateConstantOffset(BaseTy, GEPIndices, DL, Offset);
4513 if (AATags) {
4514 Store->setAAMetadata(AATags.adjustForAccess(
4515 Offset.getZExtValue(), ExtractValue->getType(), DL));
4516 }
4517
4518 // migrateDebugInfo requires the base Alloca. Walk to it from this gep.
4519 // If we cannot (because there's an intervening non-const or unbounded
4520 // gep) then we wouldn't expect to see dbg.assign intrinsics linked to
4521 // this instruction.
4523 if (auto *OldAI = dyn_cast<AllocaInst>(Base)) {
4524 uint64_t SizeInBits =
4525 DL.getTypeSizeInBits(Store->getValueOperand()->getType());
4526 migrateDebugInfo(OldAI, /*IsSplit*/ true, Offset.getZExtValue() * 8,
4527 SizeInBits, AggStore, Store,
4528 Store->getPointerOperand(), Store->getValueOperand(),
4529 DL);
4530 } else {
4532 "AT: unexpected debug.assign linked to store through "
4533 "unbounded GEP");
4534 }
4535 LLVM_DEBUG(dbgs() << " to: " << *Store << "\n");
4536 }
4537 };
4538
4539 bool visitStoreInst(StoreInst &SI) {
4540 if (!SI.isSimple() || SI.getPointerOperand() != *U)
4541 return false;
4542 Value *V = SI.getValueOperand();
4543 if (V->getType()->isSingleValueType())
4544 return false;
4545
4546 // We have an aggregate being stored, split it apart.
4547 LLVM_DEBUG(dbgs() << " original: " << SI << "\n");
4548 StoreOpSplitter Splitter(&SI, *U, V->getType(), SI.getAAMetadata(), &SI,
4549 getAdjustedAlignment(&SI, 0), DL, IRB);
4550 Splitter.emitSplitOps(V->getType(), V, V->getName() + ".fca");
4551 Visited.erase(&SI);
4552 // The stores replacing SI each have markers describing fragments of the
4553 // assignment so delete the assignment markers linked to SI.
4555 SI.eraseFromParent();
4556 return true;
4557 }
4558
4559 bool visitBitCastInst(BitCastInst &BC) {
4560 enqueueUsers(BC);
4561 return false;
4562 }
4563
4564 bool visitAddrSpaceCastInst(AddrSpaceCastInst &ASC) {
4565 enqueueUsers(ASC);
4566 return false;
4567 }
4568
4569 // Unfold gep (select cond, ptr1, ptr2), idx
4570 // => select cond, gep(ptr1, idx), gep(ptr2, idx)
4571 // and gep ptr, (select cond, idx1, idx2)
4572 // => select cond, gep(ptr, idx1), gep(ptr, idx2)
4573 // We also allow for i1 zext indices, which are equivalent to selects.
4574 bool unfoldGEPSelect(GetElementPtrInst &GEPI) {
4575 // Check whether the GEP has exactly one select operand and all indices
4576 // will become constant after the transform.
4578 for (Value *Op : GEPI.indices()) {
4579 if (auto *SI = dyn_cast<SelectInst>(Op)) {
4580 if (Sel)
4581 return false;
4582
4583 Sel = SI;
4584 if (!isa<ConstantInt>(SI->getTrueValue()) ||
4585 !isa<ConstantInt>(SI->getFalseValue()))
4586 return false;
4587 continue;
4588 }
4589 if (auto *ZI = dyn_cast<ZExtInst>(Op)) {
4590 if (Sel)
4591 return false;
4592 Sel = ZI;
4593 if (!ZI->getSrcTy()->isIntegerTy(1))
4594 return false;
4595 continue;
4596 }
4597
4598 if (!isa<ConstantInt>(Op))
4599 return false;
4600 }
4601
4602 if (!Sel)
4603 return false;
4604
4605 LLVM_DEBUG(dbgs() << " Rewriting gep(select) -> select(gep):\n";
4606 dbgs() << " original: " << *Sel << "\n";
4607 dbgs() << " " << GEPI << "\n";);
4608
4609 auto GetNewOps = [&](Value *SelOp) {
4610 SmallVector<Value *> NewOps;
4611 for (Value *Op : GEPI.operands())
4612 if (Op == Sel)
4613 NewOps.push_back(SelOp);
4614 else
4615 NewOps.push_back(Op);
4616 return NewOps;
4617 };
4618
4619 Value *Cond, *True, *False;
4620 Instruction *MDFrom = nullptr;
4621 if (auto *SI = dyn_cast<SelectInst>(Sel)) {
4622 Cond = SI->getCondition();
4623 True = SI->getTrueValue();
4624 False = SI->getFalseValue();
4625 MDFrom = SI;
4626 } else {
4627 Cond = Sel->getOperand(0);
4628 True = ConstantInt::get(Sel->getType(), 1);
4629 False = ConstantInt::get(Sel->getType(), 0);
4630 }
4631 SmallVector<Value *> TrueOps = GetNewOps(True);
4632 SmallVector<Value *> FalseOps = GetNewOps(False);
4633
4634 IRB.SetInsertPoint(&GEPI);
4635 GEPNoWrapFlags NW = GEPI.getNoWrapFlags();
4636
4637 Type *Ty = GEPI.getSourceElementType();
4638 Value *NTrue = IRB.CreateGEP(Ty, TrueOps[0], ArrayRef(TrueOps).drop_front(),
4639 True->getName() + ".sroa.gep", NW);
4640
4641 Value *NFalse =
4642 IRB.CreateGEP(Ty, FalseOps[0], ArrayRef(FalseOps).drop_front(),
4643 False->getName() + ".sroa.gep", NW);
4644
4645 Value *NSel = MDFrom
4646 ? IRB.CreateSelect(Cond, NTrue, NFalse,
4647 Sel->getName() + ".sroa.sel", MDFrom)
4648 : IRB.CreateSelectWithUnknownProfile(
4649 Cond, NTrue, NFalse, DEBUG_TYPE,
4650 Sel->getName() + ".sroa.sel");
4651 Visited.erase(&GEPI);
4652 GEPI.replaceAllUsesWith(NSel);
4653 GEPI.eraseFromParent();
4654 Instruction *NSelI = cast<Instruction>(NSel);
4655 Visited.insert(NSelI);
4656 enqueueUsers(*NSelI);
4657
4658 LLVM_DEBUG(dbgs() << " to: " << *NTrue << "\n";
4659 dbgs() << " " << *NFalse << "\n";
4660 dbgs() << " " << *NSel << "\n";);
4661
4662 return true;
4663 }
4664
4665 // Unfold gep (phi ptr1, ptr2), idx
4666 // => phi ((gep ptr1, idx), (gep ptr2, idx))
4667 // and gep ptr, (phi idx1, idx2)
4668 // => phi ((gep ptr, idx1), (gep ptr, idx2))
4669 bool unfoldGEPPhi(GetElementPtrInst &GEPI) {
4670 // To prevent infinitely expanding recursive phis, bail if the GEP pointer
4671 // operand (looking through the phi if it is the phi we want to unfold) is
4672 // an instruction besides a static alloca.
4673 PHINode *Phi = dyn_cast<PHINode>(GEPI.getPointerOperand());
4674 auto IsInvalidPointerOperand = [](Value *V) {
4675 if (!isa<Instruction>(V))
4676 return false;
4677 if (auto *AI = dyn_cast<AllocaInst>(V))
4678 return !AI->isStaticAlloca();
4679 return true;
4680 };
4681 if (Phi) {
4682 if (any_of(Phi->operands(), IsInvalidPointerOperand))
4683 return false;
4684 } else {
4685 if (IsInvalidPointerOperand(GEPI.getPointerOperand()))
4686 return false;
4687 }
4688 // Check whether the GEP has exactly one phi operand (including the pointer
4689 // operand) and all indices will become constant after the transform.
4690 for (Value *Op : GEPI.indices()) {
4691 if (auto *SI = dyn_cast<PHINode>(Op)) {
4692 if (Phi)
4693 return false;
4694
4695 Phi = SI;
4696 if (!all_of(Phi->incoming_values(),
4697 [](Value *V) { return isa<ConstantInt>(V); }))
4698 return false;
4699 continue;
4700 }
4701
4702 if (!isa<ConstantInt>(Op))
4703 return false;
4704 }
4705
4706 if (!Phi)
4707 return false;
4708
4709 LLVM_DEBUG(dbgs() << " Rewriting gep(phi) -> phi(gep):\n";
4710 dbgs() << " original: " << *Phi << "\n";
4711 dbgs() << " " << GEPI << "\n";);
4712
4713 auto GetNewOps = [&](Value *PhiOp) {
4714 SmallVector<Value *> NewOps;
4715 for (Value *Op : GEPI.operands())
4716 if (Op == Phi)
4717 NewOps.push_back(PhiOp);
4718 else
4719 NewOps.push_back(Op);
4720 return NewOps;
4721 };
4722
4723 IRB.SetInsertPoint(Phi);
4724 PHINode *NewPhi = IRB.CreatePHI(GEPI.getType(), Phi->getNumIncomingValues(),
4725 Phi->getName() + ".sroa.phi");
4726
4727 Type *SourceTy = GEPI.getSourceElementType();
4728 // We only handle arguments, constants, and static allocas here, so we can
4729 // insert GEPs at the end of the entry block.
4730 IRB.SetInsertPoint(GEPI.getFunction()->getEntryBlock().getTerminator());
4731 for (unsigned I = 0, E = Phi->getNumIncomingValues(); I != E; ++I) {
4732 Value *Op = Phi->getIncomingValue(I);
4733 BasicBlock *BB = Phi->getIncomingBlock(I);
4734 Value *NewGEP;
4735 if (int NI = NewPhi->getBasicBlockIndex(BB); NI >= 0) {
4736 NewGEP = NewPhi->getIncomingValue(NI);
4737 } else {
4738 SmallVector<Value *> NewOps = GetNewOps(Op);
4739 NewGEP =
4740 IRB.CreateGEP(SourceTy, NewOps[0], ArrayRef(NewOps).drop_front(),
4741 Phi->getName() + ".sroa.gep", GEPI.getNoWrapFlags());
4742 }
4743 NewPhi->addIncoming(NewGEP, BB);
4744 }
4745
4746 Visited.erase(&GEPI);
4747 GEPI.replaceAllUsesWith(NewPhi);
4748 GEPI.eraseFromParent();
4749 Visited.insert(NewPhi);
4750 enqueueUsers(*NewPhi);
4751
4752 LLVM_DEBUG(dbgs() << " to: ";
4753 for (Value *In
4754 : NewPhi->incoming_values()) dbgs()
4755 << "\n " << *In;
4756 dbgs() << "\n " << *NewPhi << '\n');
4757
4758 return true;
4759 }
4760
4761 bool visitGetElementPtrInst(GetElementPtrInst &GEPI) {
4762 if (unfoldGEPSelect(GEPI))
4763 return true;
4764
4765 if (unfoldGEPPhi(GEPI))
4766 return true;
4767
4768 enqueueUsers(GEPI);
4769 return false;
4770 }
4771
4772 bool visitPHINode(PHINode &PN) {
4773 enqueueUsers(PN);
4774 return false;
4775 }
4776
4777 bool visitSelectInst(SelectInst &SI) {
4778 enqueueUsers(SI);
4779 return false;
4780 }
4781};
4782
4783} // end anonymous namespace
4784
4785/// Strip aggregate type wrapping.
4786///
4787/// This removes no-op aggregate types wrapping an underlying type. It will
4788/// strip as many layers of types as it can without changing either the type
4789/// size or the allocated size.
4791 if (Ty->isSingleValueType())
4792 return Ty;
4793
4794 uint64_t AllocSize = DL.getTypeAllocSize(Ty).getFixedValue();
4795 uint64_t TypeSize = DL.getTypeSizeInBits(Ty).getFixedValue();
4796
4797 Type *InnerTy;
4798 if (ArrayType *ArrTy = dyn_cast<ArrayType>(Ty)) {
4799 InnerTy = ArrTy->getElementType();
4800 } else if (StructType *STy = dyn_cast<StructType>(Ty)) {
4801 const StructLayout *SL = DL.getStructLayout(STy);
4802 unsigned Index = SL->getElementContainingOffset(0);
4803 InnerTy = STy->getElementType(Index);
4804 } else {
4805 return Ty;
4806 }
4807
4808 if (AllocSize > DL.getTypeAllocSize(InnerTy).getFixedValue() ||
4809 TypeSize > DL.getTypeSizeInBits(InnerTy).getFixedValue())
4810 return Ty;
4811
4812 return stripAggregateTypeWrapping(DL, InnerTy);
4813}
4814
4815/// Try to find a partition of the aggregate type passed in for a given
4816/// offset and size.
4817///
4818/// This recurses through the aggregate type and tries to compute a subtype
4819/// based on the offset and size. When the offset and size span a sub-section
4820/// of an array, it will even compute a new array type for that sub-section,
4821/// and the same for structs.
4822///
4823/// Note that this routine is very strict and tries to find a partition of the
4824/// type which produces the *exact* right offset and size. It is not forgiving
4825/// when the size or offset cause either end of type-based partition to be off.
4826/// Also, this is a best-effort routine. It is reasonable to give up and not
4827/// return a type if necessary.
4829 uint64_t Size) {
4830 if (Offset == 0 && DL.getTypeAllocSize(Ty).getFixedValue() == Size)
4831 return stripAggregateTypeWrapping(DL, Ty);
4832 if (Offset > DL.getTypeAllocSize(Ty).getFixedValue() ||
4833 (DL.getTypeAllocSize(Ty).getFixedValue() - Offset) < Size)
4834 return nullptr;
4835
4836 if (isa<ArrayType>(Ty) || isa<VectorType>(Ty)) {
4837 Type *ElementTy;
4838 uint64_t TyNumElements;
4839 if (auto *AT = dyn_cast<ArrayType>(Ty)) {
4840 ElementTy = AT->getElementType();
4841 TyNumElements = AT->getNumElements();
4842 } else {
4843 // FIXME: This isn't right for vectors with non-byte-sized or
4844 // non-power-of-two sized elements.
4845 auto *VT = cast<FixedVectorType>(Ty);
4846 ElementTy = VT->getElementType();
4847 TyNumElements = VT->getNumElements();
4848 }
4849 uint64_t ElementSize = DL.getTypeAllocSize(ElementTy).getFixedValue();
4850 uint64_t NumSkippedElements = Offset / ElementSize;
4851 if (NumSkippedElements >= TyNumElements)
4852 return nullptr;
4853 Offset -= NumSkippedElements * ElementSize;
4854
4855 // First check if we need to recurse.
4856 if (Offset > 0 || Size < ElementSize) {
4857 // Bail if the partition ends in a different array element.
4858 if ((Offset + Size) > ElementSize)
4859 return nullptr;
4860 // Recurse through the element type trying to peel off offset bytes.
4861 return getTypePartition(DL, ElementTy, Offset, Size);
4862 }
4863 assert(Offset == 0);
4864
4865 if (Size == ElementSize)
4866 return stripAggregateTypeWrapping(DL, ElementTy);
4867 assert(Size > ElementSize);
4868 uint64_t NumElements = Size / ElementSize;
4869 if (NumElements * ElementSize != Size)
4870 return nullptr;
4871 return ArrayType::get(ElementTy, NumElements);
4872 }
4873
4875 if (!STy)
4876 return nullptr;
4877
4878 const StructLayout *SL = DL.getStructLayout(STy);
4879
4880 if (SL->getSizeInBits().isScalable())
4881 return nullptr;
4882
4883 if (Offset >= SL->getSizeInBytes())
4884 return nullptr;
4885 uint64_t EndOffset = Offset + Size;
4886 if (EndOffset > SL->getSizeInBytes())
4887 return nullptr;
4888
4889 unsigned Index = SL->getElementContainingOffset(Offset);
4890 Offset -= SL->getElementOffset(Index);
4891
4892 Type *ElementTy = STy->getElementType(Index);
4893 uint64_t ElementSize = DL.getTypeAllocSize(ElementTy).getFixedValue();
4894 if (Offset >= ElementSize)
4895 return nullptr; // The offset points into alignment padding.
4896
4897 // See if any partition must be contained by the element.
4898 if (Offset > 0 || Size < ElementSize) {
4899 if ((Offset + Size) > ElementSize)
4900 return nullptr;
4901 return getTypePartition(DL, ElementTy, Offset, Size);
4902 }
4903 assert(Offset == 0);
4904
4905 if (Size == ElementSize)
4906 return stripAggregateTypeWrapping(DL, ElementTy);
4907
4908 StructType::element_iterator EI = STy->element_begin() + Index,
4909 EE = STy->element_end();
4910 if (EndOffset < SL->getSizeInBytes()) {
4911 unsigned EndIndex = SL->getElementContainingOffset(EndOffset);
4912 if (Index == EndIndex)
4913 return nullptr; // Within a single element and its padding.
4914
4915 // Don't try to form "natural" types if the elements don't line up with the
4916 // expected size.
4917 // FIXME: We could potentially recurse down through the last element in the
4918 // sub-struct to find a natural end point.
4919 if (SL->getElementOffset(EndIndex) != EndOffset)
4920 return nullptr;
4921
4922 assert(Index < EndIndex);
4923 EE = STy->element_begin() + EndIndex;
4924 }
4925
4926 // Try to build up a sub-structure.
4927 StructType *SubTy =
4928 StructType::get(STy->getContext(), ArrayRef(EI, EE), STy->isPacked());
4929 const StructLayout *SubSL = DL.getStructLayout(SubTy);
4930 if (Size != SubSL->getSizeInBytes())
4931 return nullptr; // The sub-struct doesn't have quite the size needed.
4932
4933 return SubTy;
4934}
4935
4936/// Try to find a slice in the map that partially overlaps with S, i.e. some but
4937/// not all of its range is contained within the range of S, and which forms a
4938/// load/store pair with S (i.e. the two slices are used to perform a
4939/// memmove-like copy). SliceMap is expected to contain the slices for a single
4940/// Partition.
4941static Slice *findOverlappingCopySlice(Slice &S,
4942 InstructionSliceMap &SliceMap) {
4943 // Single byte slices can't partially overlap anything
4944 if (S.endOffset() - S.beginOffset() == 1)
4945 return nullptr;
4946 // The source/destination of this slice needs to be a memory instruction
4947 // whose slice overlaps this one.
4948 Instruction *I = cast<Instruction>(S.getUse()->getUser());
4949 Instruction *J = nullptr;
4950 if (auto *LI = dyn_cast<LoadInst>(I)) {
4951 if (!LI->hasOneUser())
4952 return nullptr;
4953 J = cast<Instruction>(*LI->user_begin());
4954 } else if (auto *SI = dyn_cast<StoreInst>(I)) {
4955 J = dyn_cast<Instruction>(SI->getValueOperand());
4956 if (!J || !J->hasOneUser())
4957 return nullptr;
4958 } else {
4959 return nullptr;
4960 }
4961 // Check if there's a slice that corresponds to J that overlaps this slice
4962 for (Slice *JS : SliceMap[J]) {
4963 if (S.beginOffset() > JS->beginOffset() &&
4964 S.beginOffset() < JS->endOffset())
4965 return JS;
4966 if (JS->beginOffset() > S.beginOffset() &&
4967 JS->beginOffset() < S.endOffset())
4968 return JS;
4969 }
4970 return nullptr;
4971}
4972
4973/// Pre-split loads and stores to simplify rewriting.
4974///
4975/// We want to break up the splittable load+store pairs as much as
4976/// possible. This is important to do as a preprocessing step, as once we
4977/// start rewriting the accesses to partitions of the alloca we lose the
4978/// necessary information to correctly split apart paired loads and stores
4979/// which both point into this alloca. The case to consider is something like
4980/// the following:
4981///
4982/// %a = alloca [12 x i8]
4983/// %gep1 = getelementptr i8, ptr %a, i32 0
4984/// %gep2 = getelementptr i8, ptr %a, i32 4
4985/// %gep3 = getelementptr i8, ptr %a, i32 8
4986/// store float 0.0, ptr %gep1
4987/// store float 1.0, ptr %gep2
4988/// %v = load i64, ptr %gep1
4989/// store i64 %v, ptr %gep2
4990/// %f1 = load float, ptr %gep2
4991/// %f2 = load float, ptr %gep3
4992///
4993/// Here we want to form 3 partitions of the alloca, each 4 bytes large, and
4994/// promote everything so we recover the 2 SSA values that should have been
4995/// there all along.
4996///
4997/// \returns true if any changes are made.
4998bool SROA::presplitLoadsAndStores(AllocaInst &AI, AllocaSlices &AS) {
4999 LLVM_DEBUG(dbgs() << "Pre-splitting loads and stores\n");
5000
5001 // Track the loads and stores which are candidates for pre-splitting here, in
5002 // the order they first appear during the partition scan. These give stable
5003 // iteration order and a basis for tracking which loads and stores we
5004 // actually split.
5007
5008 // We need to accumulate the splits required of each load or store where we
5009 // can find them via a direct lookup. This is important to cross-check loads
5010 // and stores against each other. We also track the slice so that we can kill
5011 // all the slices that end up split.
5012 struct SplitOffsets {
5013 Slice *S;
5014 std::vector<uint64_t> Splits;
5015 };
5016 SmallDenseMap<Instruction *, SplitOffsets, 8> SplitOffsetsMap;
5017
5018 // Track loads out of this alloca which cannot, for any reason, be pre-split.
5019 // This is important as we also cannot pre-split stores of those loads!
5020 // FIXME: This is all pretty gross. It means that we can be more aggressive
5021 // in pre-splitting when the load feeding the store happens to come from
5022 // a separate alloca. Put another way, the effectiveness of SROA would be
5023 // decreased by a frontend which just concatenated all of its local allocas
5024 // into one big flat alloca. But defeating such patterns is exactly the job
5025 // SROA is tasked with! Sadly, to not have this discrepancy we would have
5026 // change store pre-splitting to actually force pre-splitting of the load
5027 // that feeds it *and all stores*. That makes pre-splitting much harder, but
5028 // maybe it would make it more principled?
5029 SmallPtrSet<LoadInst *, 8> UnsplittableLoads;
5030
5031 LLVM_DEBUG(dbgs() << " Searching for candidate loads and stores\n");
5032 for (auto &P : AS.partitions()) {
5033 InstructionSliceMap SliceMap;
5034 for (Slice &S : P) {
5035 SliceMap[cast<Instruction>(S.getUse()->getUser())].insert(&S);
5036 }
5037 for (Slice &S : P) {
5038 Instruction *I = cast<Instruction>(S.getUse()->getUser());
5039 bool ExtendsPastPartitionEnd = S.endOffset() > P.endOffset();
5040 Slice *CopyOverlap = findOverlappingCopySlice(S, SliceMap);
5041 if (!S.isSplittable() || (!ExtendsPastPartitionEnd && !CopyOverlap)) {
5042 // If this is a load we have to track that it can't participate in any
5043 // pre-splitting. If this is a store of a load we have to track that
5044 // that load also can't participate in any pre-splitting.
5045 if (auto *LI = dyn_cast<LoadInst>(I))
5046 UnsplittableLoads.insert(LI);
5047 else if (auto *SI = dyn_cast<StoreInst>(I))
5048 if (auto *LI = dyn_cast<LoadInst>(SI->getValueOperand()))
5049 UnsplittableLoads.insert(LI);
5050 continue;
5051 }
5052 assert(P.endOffset() > S.beginOffset() &&
5053 "Empty or backwards partition!");
5054
5055 // Determine if this is a pre-splittable slice.
5056 if (auto *LI = dyn_cast<LoadInst>(I)) {
5057 assert(!LI->isVolatile() && "Cannot split volatile loads!");
5058
5059 // The load must be used exclusively to store into other pointers for
5060 // us to be able to arbitrarily pre-split it. The stores must also be
5061 // simple to avoid changing semantics.
5062 auto IsLoadSimplyStored = [](LoadInst *LI) {
5063 for (User *LU : LI->users()) {
5064 auto *SI = dyn_cast<StoreInst>(LU);
5065 if (!SI || !SI->isSimple())
5066 return false;
5067 }
5068 return true;
5069 };
5070 if (!IsLoadSimplyStored(LI)) {
5071 UnsplittableLoads.insert(LI);
5072 continue;
5073 }
5074
5075 Loads.push_back(LI);
5076 } else if (auto *SI = dyn_cast<StoreInst>(I)) {
5077 if (S.getUse() != &SI->getOperandUse(SI->getPointerOperandIndex()))
5078 // Skip stores *of* pointers. FIXME: This shouldn't even be possible!
5079 continue;
5080 auto *StoredLoad = dyn_cast<LoadInst>(SI->getValueOperand());
5081 if (!StoredLoad || !StoredLoad->isSimple())
5082 continue;
5083 assert(!SI->isVolatile() && "Cannot split volatile stores!");
5084
5085 Stores.push_back(SI);
5086 } else {
5087 // Other uses cannot be pre-split.
5088 continue;
5089 }
5090
5091 // Record the initial split.
5092 LLVM_DEBUG(dbgs() << " Candidate: " << *I << "\n");
5093 auto &Offsets = SplitOffsetsMap[I];
5094 assert(Offsets.Splits.empty() &&
5095 "Should not have splits the first time we see an instruction!");
5096 Offsets.S = &S;
5097 if (CopyOverlap) {
5098 // S is being moved to CopyOverlap, which overlaps with S, so we split S
5099 // into three parts:
5100 // * Initially outside the overlap and copied into the overlap.
5101 // * Either initially inside the overlap and remains inside it after
5102 // the copy, or initially outside and remains outside, depending on
5103 // if the overlap or non-overlap area is larger, and which will be
5104 // empty if they are equal.
5105 // * Initially inside the overlap and copied outside the overlap.
5106 // This should result in the first and last parts being promoted to
5107 // scalars. If the middle part is an overlapping copy then we repeat
5108 // this process until it isn't.
5109 uint64_t OverlapStart =
5110 std::max(S.beginOffset(), CopyOverlap->beginOffset());
5111 uint64_t OverlapEnd = std::min(S.endOffset(), CopyOverlap->endOffset());
5112 uint64_t OverlapSize = OverlapEnd - OverlapStart;
5113 uint64_t SliceSize = S.endOffset() - S.beginOffset();
5114 uint64_t NonOverlapSize = SliceSize - OverlapSize;
5115 if (OverlapSize < NonOverlapSize) {
5116 // When the overlap area is smaller the middle part is initially and
5117 // remains outside the overlap, so splitting once is enough. The size
5118 // of the first and last part both equal the overlap size, so the
5119 // split points are that amount from the start and end of the slice.
5120 Offsets.Splits.push_back(OverlapSize);
5121 Offsets.Splits.push_back(SliceSize - OverlapSize);
5122 } else if (OverlapSize > NonOverlapSize) {
5123 // When the overlap area is larger the middle part is initially and
5124 // remains inside the overlap, so we repeatedly split it.
5125 for (uint64_t Split = NonOverlapSize; Split <= SliceSize / 2;
5126 Split += NonOverlapSize) {
5127 Offsets.Splits.push_back(Split);
5128 if (Split != SliceSize - Split) {
5129 Offsets.Splits.push_back(SliceSize - Split);
5130 }
5131 }
5132 // Sort the splits as they need to be in ascending order.
5133 llvm::sort(Offsets.Splits);
5134 } else {
5135 // Here the overlap and non-overlap size are the same, so the middle
5136 // part is empty and the slice is split exactly in the center.
5137 Offsets.Splits.push_back(OverlapSize);
5138 }
5139 } else {
5140 Offsets.Splits.push_back(P.endOffset() - S.beginOffset());
5141 }
5142 }
5143 }
5144
5145 // We may have split loads where some of their stores are split stores. For
5146 // such loads and stores, we can only pre-split them if their splits exactly
5147 // match relative to their starting offset. We have to verify this prior to
5148 // any rewriting.
5149 llvm::erase_if(Stores, [&UnsplittableLoads, &SplitOffsetsMap](StoreInst *SI) {
5150 // Lookup the load we are storing in our map of split
5151 // offsets.
5152 auto *LI = cast<LoadInst>(SI->getValueOperand());
5153 // If it was completely unsplittable, then we're done,
5154 // and this store can't be pre-split.
5155 if (UnsplittableLoads.count(LI))
5156 return true;
5157
5158 auto LoadOffsetsI = SplitOffsetsMap.find(LI);
5159 if (LoadOffsetsI == SplitOffsetsMap.end())
5160 return false; // Unrelated loads are definitely safe.
5161 auto &LoadOffsets = LoadOffsetsI->second;
5162
5163 // Now lookup the store's offsets.
5164 auto &StoreOffsets = SplitOffsetsMap[SI];
5165
5166 // If the relative offsets of each split in the load and
5167 // store match exactly, then we can split them and we
5168 // don't need to remove them here.
5169 if (LoadOffsets.Splits == StoreOffsets.Splits)
5170 return false;
5171
5172 LLVM_DEBUG(dbgs() << " Mismatched splits for load and store:\n"
5173 << " " << *LI << "\n"
5174 << " " << *SI << "\n");
5175
5176 // We've found a store and load that we need to split
5177 // with mismatched relative splits. Just give up on them
5178 // and remove both instructions from our list of
5179 // candidates.
5180 UnsplittableLoads.insert(LI);
5181 return true;
5182 });
5183 // Now we have to go *back* through all the stores, because a later store may
5184 // have caused an earlier store's load to become unsplittable and if it is
5185 // unsplittable for the later store, then we can't rely on it being split in
5186 // the earlier store either.
5187 llvm::erase_if(Stores, [&UnsplittableLoads](StoreInst *SI) {
5188 auto *LI = cast<LoadInst>(SI->getValueOperand());
5189 return UnsplittableLoads.count(LI);
5190 });
5191 // Once we've established all the loads that can't be split for some reason,
5192 // filter any that made it into our list out.
5193 llvm::erase_if(Loads, [&UnsplittableLoads](LoadInst *LI) {
5194 return UnsplittableLoads.count(LI);
5195 });
5196
5197 // If no loads or stores are left, there is no pre-splitting to be done for
5198 // this alloca.
5199 if (Loads.empty() && Stores.empty())
5200 return false;
5201
5202 // From here on, we can't fail and will be building new accesses, so rig up
5203 // an IR builder.
5204 IRBuilderTy IRB(&AI);
5205
5206 // Collect the new slices which we will merge into the alloca slices.
5207 SmallVector<Slice, 4> NewSlices;
5208
5209 // Track any allocas we end up splitting loads and stores for so we iterate
5210 // on them.
5211 SmallPtrSet<AllocaInst *, 4> ResplitPromotableAllocas;
5212
5213 // At this point, we have collected all of the loads and stores we can
5214 // pre-split, and the specific splits needed for them. We actually do the
5215 // splitting in a specific order in order to handle when one of the loads in
5216 // the value operand to one of the stores.
5217 //
5218 // First, we rewrite all of the split loads, and just accumulate each split
5219 // load in a parallel structure. We also build the slices for them and append
5220 // them to the alloca slices.
5221 SmallDenseMap<LoadInst *, std::vector<LoadInst *>, 1> SplitLoadsMap;
5222 std::vector<LoadInst *> SplitLoads;
5223 const DataLayout &DL = AI.getDataLayout();
5224 for (LoadInst *LI : Loads) {
5225 SplitLoads.clear();
5226
5227 auto &Offsets = SplitOffsetsMap[LI];
5228 unsigned SliceSize = Offsets.S->endOffset() - Offsets.S->beginOffset();
5229 assert(LI->getType()->getIntegerBitWidth() % 8 == 0 &&
5230 "Load must have type size equal to store size");
5231 assert(LI->getType()->getIntegerBitWidth() / 8 >= SliceSize &&
5232 "Load must be >= slice size");
5233
5234 uint64_t BaseOffset = Offsets.S->beginOffset();
5235 assert(BaseOffset + SliceSize > BaseOffset &&
5236 "Cannot represent alloca access size using 64-bit integers!");
5237
5239 IRB.SetInsertPoint(LI);
5240
5241 LLVM_DEBUG(dbgs() << " Splitting load: " << *LI << "\n");
5242
5243 uint64_t PartOffset = 0, PartSize = Offsets.Splits.front();
5244 int Idx = 0, Size = Offsets.Splits.size();
5245 for (;;) {
5246 auto *PartTy = Type::getIntNTy(LI->getContext(), PartSize * 8);
5247 auto AS = LI->getPointerAddressSpace();
5248 auto *PartPtrTy = LI->getPointerOperandType();
5249 LoadInst *PLoad = IRB.CreateAlignedLoad(
5250 PartTy,
5251 getAdjustedPtr(IRB, DL, BasePtr,
5252 APInt(DL.getIndexSizeInBits(AS), PartOffset),
5253 PartPtrTy, BasePtr->getName() + "."),
5254 getAdjustedAlignment(LI, PartOffset),
5255 /*IsVolatile*/ false, LI->getName());
5256 PLoad->copyMetadata(*LI, {LLVMContext::MD_mem_parallel_loop_access,
5257 LLVMContext::MD_access_group});
5258
5259 // Append this load onto the list of split loads so we can find it later
5260 // to rewrite the stores.
5261 SplitLoads.push_back(PLoad);
5262
5263 // Now build a new slice for the alloca.
5264 NewSlices.push_back(
5265 Slice(BaseOffset + PartOffset, BaseOffset + PartOffset + PartSize,
5266 &PLoad->getOperandUse(PLoad->getPointerOperandIndex()),
5267 /*IsSplittable*/ false));
5268 LLVM_DEBUG(dbgs() << " new slice [" << NewSlices.back().beginOffset()
5269 << ", " << NewSlices.back().endOffset()
5270 << "): " << *PLoad << "\n");
5271
5272 // See if we've handled all the splits.
5273 if (Idx >= Size)
5274 break;
5275
5276 // Setup the next partition.
5277 PartOffset = Offsets.Splits[Idx];
5278 ++Idx;
5279 PartSize = (Idx < Size ? Offsets.Splits[Idx] : SliceSize) - PartOffset;
5280 }
5281
5282 // Now that we have the split loads, do the slow walk over all uses of the
5283 // load and rewrite them as split stores, or save the split loads to use
5284 // below if the store is going to be split there anyways.
5285 bool DeferredStores = false;
5286 for (User *LU : LI->users()) {
5287 StoreInst *SI = cast<StoreInst>(LU);
5288 if (!Stores.empty() && SplitOffsetsMap.count(SI)) {
5289 DeferredStores = true;
5290 LLVM_DEBUG(dbgs() << " Deferred splitting of store: " << *SI
5291 << "\n");
5292 continue;
5293 }
5294
5295 Value *StoreBasePtr = SI->getPointerOperand();
5296 IRB.SetInsertPoint(SI);
5297 AAMDNodes AATags = SI->getAAMetadata();
5298
5299 LLVM_DEBUG(dbgs() << " Splitting store of load: " << *SI << "\n");
5300
5301 for (int Idx = 0, Size = SplitLoads.size(); Idx < Size; ++Idx) {
5302 LoadInst *PLoad = SplitLoads[Idx];
5303 uint64_t PartOffset = Idx == 0 ? 0 : Offsets.Splits[Idx - 1];
5304 auto *PartPtrTy = SI->getPointerOperandType();
5305
5306 auto AS = SI->getPointerAddressSpace();
5307 StoreInst *PStore = IRB.CreateAlignedStore(
5308 PLoad,
5309 getAdjustedPtr(IRB, DL, StoreBasePtr,
5310 APInt(DL.getIndexSizeInBits(AS), PartOffset),
5311 PartPtrTy, StoreBasePtr->getName() + "."),
5312 getAdjustedAlignment(SI, PartOffset),
5313 /*IsVolatile*/ false);
5314 PStore->copyMetadata(*SI, {LLVMContext::MD_mem_parallel_loop_access,
5315 LLVMContext::MD_access_group,
5316 LLVMContext::MD_DIAssignID});
5317
5318 if (AATags)
5319 PStore->setAAMetadata(
5320 AATags.adjustForAccess(PartOffset, PLoad->getType(), DL));
5321 LLVM_DEBUG(dbgs() << " +" << PartOffset << ":" << *PStore << "\n");
5322 }
5323
5324 // We want to immediately iterate on any allocas impacted by splitting
5325 // this store, and we have to track any promotable alloca (indicated by
5326 // a direct store) as needing to be resplit because it is no longer
5327 // promotable.
5328 if (AllocaInst *OtherAI = dyn_cast<AllocaInst>(StoreBasePtr)) {
5329 ResplitPromotableAllocas.insert(OtherAI);
5330 Worklist.insert(OtherAI);
5331 } else if (AllocaInst *OtherAI = dyn_cast<AllocaInst>(
5332 StoreBasePtr->stripInBoundsOffsets())) {
5333 Worklist.insert(OtherAI);
5334 }
5335
5336 // Mark the original store as dead.
5337 DeadInsts.push_back(SI);
5338 }
5339
5340 // Save the split loads if there are deferred stores among the users.
5341 if (DeferredStores)
5342 SplitLoadsMap.insert(std::make_pair(LI, std::move(SplitLoads)));
5343
5344 // Mark the original load as dead and kill the original slice.
5345 DeadInsts.push_back(LI);
5346 Offsets.S->kill();
5347 }
5348
5349 // Second, we rewrite all of the split stores. At this point, we know that
5350 // all loads from this alloca have been split already. For stores of such
5351 // loads, we can simply look up the pre-existing split loads. For stores of
5352 // other loads, we split those loads first and then write split stores of
5353 // them.
5354 for (StoreInst *SI : Stores) {
5355 auto *LI = cast<LoadInst>(SI->getValueOperand());
5356 IntegerType *Ty = cast<IntegerType>(LI->getType());
5357 assert(Ty->getBitWidth() % 8 == 0);
5358 uint64_t StoreSize = Ty->getBitWidth() / 8;
5359 assert(StoreSize > 0 && "Cannot have a zero-sized integer store!");
5360
5361 auto &Offsets = SplitOffsetsMap[SI];
5362 assert(StoreSize == Offsets.S->endOffset() - Offsets.S->beginOffset() &&
5363 "Slice size should always match load size exactly!");
5364 uint64_t BaseOffset = Offsets.S->beginOffset();
5365 assert(BaseOffset + StoreSize > BaseOffset &&
5366 "Cannot represent alloca access size using 64-bit integers!");
5367
5368 Value *LoadBasePtr = LI->getPointerOperand();
5369 Instruction *StoreBasePtr = cast<Instruction>(SI->getPointerOperand());
5370
5371 LLVM_DEBUG(dbgs() << " Splitting store: " << *SI << "\n");
5372
5373 // Check whether we have an already split load.
5374 auto SplitLoadsMapI = SplitLoadsMap.find(LI);
5375 std::vector<LoadInst *> *SplitLoads = nullptr;
5376 if (SplitLoadsMapI != SplitLoadsMap.end()) {
5377 SplitLoads = &SplitLoadsMapI->second;
5378 assert(SplitLoads->size() == Offsets.Splits.size() + 1 &&
5379 "Too few split loads for the number of splits in the store!");
5380 } else {
5381 LLVM_DEBUG(dbgs() << " of load: " << *LI << "\n");
5382 }
5383
5384 uint64_t PartOffset = 0, PartSize = Offsets.Splits.front();
5385 int Idx = 0, Size = Offsets.Splits.size();
5386 for (;;) {
5387 auto *PartTy = Type::getIntNTy(Ty->getContext(), PartSize * 8);
5388 auto *LoadPartPtrTy = LI->getPointerOperandType();
5389 auto *StorePartPtrTy = SI->getPointerOperandType();
5390
5391 // Either lookup a split load or create one.
5392 LoadInst *PLoad;
5393 if (SplitLoads) {
5394 PLoad = (*SplitLoads)[Idx];
5395 } else {
5396 IRB.SetInsertPoint(LI);
5397 auto AS = LI->getPointerAddressSpace();
5398 PLoad = IRB.CreateAlignedLoad(
5399 PartTy,
5400 getAdjustedPtr(IRB, DL, LoadBasePtr,
5401 APInt(DL.getIndexSizeInBits(AS), PartOffset),
5402 LoadPartPtrTy, LoadBasePtr->getName() + "."),
5403 getAdjustedAlignment(LI, PartOffset),
5404 /*IsVolatile*/ false, LI->getName());
5405 PLoad->copyMetadata(*LI, {LLVMContext::MD_mem_parallel_loop_access,
5406 LLVMContext::MD_access_group});
5407 }
5408
5409 // And store this partition.
5410 IRB.SetInsertPoint(SI);
5411 auto AS = SI->getPointerAddressSpace();
5412 StoreInst *PStore = IRB.CreateAlignedStore(
5413 PLoad,
5414 getAdjustedPtr(IRB, DL, StoreBasePtr,
5415 APInt(DL.getIndexSizeInBits(AS), PartOffset),
5416 StorePartPtrTy, StoreBasePtr->getName() + "."),
5417 getAdjustedAlignment(SI, PartOffset),
5418 /*IsVolatile*/ false);
5419 PStore->copyMetadata(*SI, {LLVMContext::MD_mem_parallel_loop_access,
5420 LLVMContext::MD_access_group});
5421
5422 // Now build a new slice for the alloca.
5423 NewSlices.push_back(
5424 Slice(BaseOffset + PartOffset, BaseOffset + PartOffset + PartSize,
5425 &PStore->getOperandUse(PStore->getPointerOperandIndex()),
5426 /*IsSplittable*/ false));
5427 LLVM_DEBUG(dbgs() << " new slice [" << NewSlices.back().beginOffset()
5428 << ", " << NewSlices.back().endOffset()
5429 << "): " << *PStore << "\n");
5430 if (!SplitLoads) {
5431 LLVM_DEBUG(dbgs() << " of split load: " << *PLoad << "\n");
5432 }
5433
5434 // See if we've finished all the splits.
5435 if (Idx >= Size)
5436 break;
5437
5438 // Setup the next partition.
5439 PartOffset = Offsets.Splits[Idx];
5440 ++Idx;
5441 PartSize = (Idx < Size ? Offsets.Splits[Idx] : StoreSize) - PartOffset;
5442 }
5443
5444 // We want to immediately iterate on any allocas impacted by splitting
5445 // this load, which is only relevant if it isn't a load of this alloca and
5446 // thus we didn't already split the loads above. We also have to keep track
5447 // of any promotable allocas we split loads on as they can no longer be
5448 // promoted.
5449 if (!SplitLoads) {
5450 if (AllocaInst *OtherAI = dyn_cast<AllocaInst>(LoadBasePtr)) {
5451 assert(OtherAI != &AI && "We can't re-split our own alloca!");
5452 ResplitPromotableAllocas.insert(OtherAI);
5453 Worklist.insert(OtherAI);
5454 } else if (AllocaInst *OtherAI = dyn_cast<AllocaInst>(
5455 LoadBasePtr->stripInBoundsOffsets())) {
5456 assert(OtherAI != &AI && "We can't re-split our own alloca!");
5457 Worklist.insert(OtherAI);
5458 }
5459 }
5460
5461 // Mark the original store as dead now that we've split it up and kill its
5462 // slice. Note that we leave the original load in place unless this store
5463 // was its only use. It may in turn be split up if it is an alloca load
5464 // for some other alloca, but it may be a normal load. This may introduce
5465 // redundant loads, but where those can be merged the rest of the optimizer
5466 // should handle the merging, and this uncovers SSA splits which is more
5467 // important. In practice, the original loads will almost always be fully
5468 // split and removed eventually, and the splits will be merged by any
5469 // trivial CSE, including instcombine.
5470 if (LI->hasOneUse()) {
5471 assert(*LI->user_begin() == SI && "Single use isn't this store!");
5472 DeadInsts.push_back(LI);
5473 }
5474 DeadInsts.push_back(SI);
5475 Offsets.S->kill();
5476 }
5477
5478 // Remove the killed slices that have ben pre-split.
5479 llvm::erase_if(AS, [](const Slice &S) { return S.isDead(); });
5480
5481 // Insert our new slices. This will sort and merge them into the sorted
5482 // sequence.
5483 AS.insert(NewSlices);
5484
5485 LLVM_DEBUG(dbgs() << " Pre-split slices:\n");
5486#ifndef NDEBUG
5487 for (auto I = AS.begin(), E = AS.end(); I != E; ++I)
5488 LLVM_DEBUG(AS.print(dbgs(), I, " "));
5489#endif
5490
5491 // Finally, don't try to promote any allocas that new require re-splitting.
5492 // They have already been added to the worklist above.
5493 PromotableAllocas.set_subtract(ResplitPromotableAllocas);
5494
5495 return true;
5496}
5497
5498/// Try to canonicalize a homogeneous struct partition to a vector type.
5499///
5500/// We can do this if all the elements of the struct are the same and the
5501/// corresponding vector has the same byte-level layout. This can sometimes
5502/// eliminate allocas because structs cannot get promoted to LLVM values, but
5503/// vectors can.
5504///
5505/// We only apply this transformation when all users of the partition are memory
5506/// intrinsics. Otherwise, if there is a load or store of some other type to the
5507/// partition, SROA would select that type.
5508///
5509/// Applying this transformation too early may hinder memcpyopt, which may
5510/// generate better code when eliminating allocas. For example, see
5511/// `struct-to-vector-fp-store-only-tail.ll`, which demonstrates that applying
5512/// this before memcpyopt can initialize previously uninitialized memory when
5513/// the alloca gets promoted to an SSA value. For another example, see
5514/// `struct-to-vector-before-memcpyopt.ll`, which demonstrates that applying
5515/// this before memcpyopt can result in promoting an alloca so that we load a
5516/// temporary value instead of copying the temporary value into memory, whereas
5517/// memcpyopt eliminates the temporary altogether.
5518///
5519/// As such, we only apply this transformation after memcpyopt has run. We gate
5520/// this transformation by the "AggregateToVector" pass option.
5522 Partition &P,
5523 const DataLayout &DL) {
5524 unsigned NumElts = STy->getNumElements();
5525
5526 Type *EltTy = STy->getElementType(0);
5527 if (!llvm::all_equal(STy->elements()))
5528 return nullptr;
5529
5530 bool IsIntegralPointerTy =
5531 EltTy->isPointerTy() && !DL.isNonIntegralPointerType(EltTy);
5532 if (!EltTy->isIntegerTy() && !EltTy->isFloatingPointTy() &&
5533 !IsIntegralPointerTy)
5534 return nullptr;
5535
5536 // Ensure the struct is tightly packed so that the bit-layout is the same as
5537 // the corresponding vector. For example, this prevents a miscompile for
5538 // { i5, i5 }, which has padding after each i5 field, whereas <i5, i5> has
5539 // tightly packed elements and trailing padding.
5540 if (DL.getTypeSizeInBits(EltTy) != DL.getTypeAllocSizeInBits(EltTy))
5541 return nullptr;
5542
5543 auto *VTy = FixedVectorType::get(EltTy, NumElts);
5544 TypeSize StructSize = DL.getStructLayout(STy)->getSizeInBytes();
5545 TypeSize VectorSize = DL.getTypeStoreSize(VTy);
5546 // After ruling out per-element padding, make sure a vector load/store
5547 // covers the same number of bytes as the struct layout.
5548 if (StructSize != VectorSize)
5549 return nullptr;
5550
5551 auto IsIgnorableOrMemIntrinsicSlice = [](const Slice &S) {
5552 if (S.isDead())
5553 return true;
5554 auto *U = S.getUse();
5555 if (!U)
5556 return true;
5557
5558 User *Usr = U->getUser();
5560 return true;
5561
5562 return isa<MemIntrinsic>(Usr);
5563 };
5564
5565 for (const Slice &S : P)
5566 if (!IsIgnorableOrMemIntrinsicSlice(S))
5567 return nullptr;
5568
5569 for (const Slice *S : P.splitSliceTails())
5570 if (!IsIgnorableOrMemIntrinsicSlice(*S))
5571 return nullptr;
5572
5573 return VTy;
5574}
5575
5576/// Select a partition type for an alloca partition.
5577///
5578/// Try to compute a friendly type for this partition of the alloca. This
5579/// won't always succeed, in which case we fall back to a legal integer type
5580/// or an i8 array of an appropriate size.
5581///
5582/// \returns A tuple with the following elements:
5583/// - PartitionType: The computed type for this partition.
5584/// - IsIntegerWideningViable: True if integer widening promotion is used.
5585/// - VectorType: The vector type if vector promotion is used, otherwise
5586/// nullptr.
5587static std::tuple<Type *, bool, VectorType *>
5589 LLVMContext &C, bool AggregateToVector) {
5590 auto LogSelection = [&](StringRef Path, Type *SelectedTy,
5591 VectorType *SelectedVecTy, bool SelectedIntWidening) {
5592 LLVM_DEBUG({
5593 dbgs() << "selectPartitionType path=" << Path
5594 << " func=" << AI.getFunction()->getName() << " alloca=";
5595 if (AI.hasName())
5596 dbgs() << AI.getName();
5597 else
5598 dbgs() << "<unnamed>";
5599 dbgs() << " partition=[" << P.beginOffset() << "," << P.endOffset()
5600 << ") size=" << P.size();
5601 if (std::optional<TypeSize> AllocSize = AI.getAllocationSize(DL))
5602 dbgs() << " alloc-size=" << AllocSize->getKnownMinValue();
5603 if (SelectedTy)
5604 dbgs() << " chosen=" << *SelectedTy;
5605 if (SelectedVecTy)
5606 dbgs() << " vec=" << *SelectedVecTy;
5607 dbgs() << " intwiden=" << SelectedIntWidening << "\n";
5608 });
5609 };
5610 // First check if the partition is viable for vector promotion.
5611 //
5612 // We prefer vector promotion over integer widening promotion when:
5613 // - The vector element type is a floating-point type.
5614 // - All the loads/stores to the alloca are vector loads/stores to the
5615 // entire alloca or load/store a single element of the vector.
5616 //
5617 // Otherwise when there is an integer vector with mixed type loads/stores we
5618 // prefer integer widening promotion because it's more likely the user is
5619 // doing bitwise arithmetic and we generate better code.
5620 VectorType *VecTy =
5622 // If the vector element type is a floating-point type, we prefer vector
5623 // promotion. If the vector has one element, let the below code select
5624 // whether we promote with the vector or scalar.
5625 if (VecTy && VecTy->getElementType()->isFloatingPointTy() &&
5626 VecTy->getElementCount().getFixedValue() > 1) {
5627 LogSelection("direct-fp-vecty", VecTy, VecTy, false);
5628 return {VecTy, false, VecTy};
5629 }
5630
5631 // Check if there is a common type that all slices of the partition use that
5632 // spans the partition.
5633 auto [CommonUseTy, LargestIntTy] =
5634 findCommonType(P.begin(), P.end(), P.endOffset());
5635 if (CommonUseTy) {
5636 TypeSize CommonUseSize = DL.getTypeAllocSize(CommonUseTy);
5637 if (CommonUseSize.isFixed() && CommonUseSize.getFixedValue() >= P.size()) {
5638 // We prefer vector promotion here because if vector promotion is viable
5639 // and there is a common type used, then it implies the second listed
5640 // condition for preferring vector promotion is true.
5641 if (VecTy) {
5642 LogSelection("common-type-vecty", VecTy, VecTy, false);
5643 return {VecTy, false, VecTy};
5644 }
5645 bool IntWiden = isIntegerWideningViable(P, CommonUseTy, DL);
5646 LogSelection("common-type", CommonUseTy, nullptr, IntWiden);
5647 return {CommonUseTy, IntWiden, nullptr};
5648 }
5649 }
5650
5651 // Can we find an appropriate subtype in the original allocated
5652 // type?
5653 if (Type *TypePartitionTy = getTypePartition(DL, AI.getAllocatedType(),
5654 P.beginOffset(), P.size())) {
5655 // If the partition is an integer array that can be spanned by a legal
5656 // integer type, prefer to represent it as a legal integer type because
5657 // it's more likely to be promotable.
5658 if (TypePartitionTy->isArrayTy() &&
5659 TypePartitionTy->getArrayElementType()->isIntegerTy() &&
5660 DL.isLegalInteger(P.size() * 8))
5661 TypePartitionTy = Type::getIntNTy(C, P.size() * 8);
5662 // There was no common type used, so we prefer integer widening promotion.
5663 if (isIntegerWideningViable(P, TypePartitionTy, DL)) {
5664 LogSelection("type-partition-int-widen", TypePartitionTy, nullptr, true);
5665 return {TypePartitionTy, true, nullptr};
5666 }
5667 if (VecTy) {
5668 LogSelection("type-partition-vecty", VecTy, VecTy, false);
5669 return {VecTy, false, VecTy};
5670 }
5671 // If we couldn't promote with TypePartitionTy, try with the largest
5672 // integer type used.
5673 if (LargestIntTy &&
5674 DL.getTypeAllocSize(LargestIntTy).getFixedValue() >= P.size() &&
5675 isIntegerWideningViable(P, LargestIntTy, DL)) {
5676 LogSelection("largest-int-int-widen", LargestIntTy, nullptr, true);
5677 return {LargestIntTy, true, nullptr};
5678 }
5679
5680 // Try homogeneous struct to vector canonicalization when requested. Running
5681 // this too early can hide memcpy chains from MemCpyOpt.
5682 if (AggregateToVector) {
5683 if (auto *STy = dyn_cast<StructType>(TypePartitionTy)) {
5684 if (auto *VTy = tryCanonicalizeStructToVector(STy, P, DL)) {
5685 LogSelection("struct-fallback-vecty", VTy, nullptr, false);
5686 return {VTy, false, nullptr};
5687 }
5688 }
5689 }
5690
5691 // Fallback to TypePartitionTy and we probably won't promote.
5692 LogSelection("type-partition-fallback", TypePartitionTy, nullptr, false);
5693 return {TypePartitionTy, false, nullptr};
5694 }
5695
5696 // Select the largest integer type used if it spans the partition.
5697 if (LargestIntTy &&
5698 DL.getTypeAllocSize(LargestIntTy).getFixedValue() >= P.size()) {
5699 LogSelection("largest-int-fallback", LargestIntTy, nullptr, false);
5700 return {LargestIntTy, false, nullptr};
5701 }
5702
5703 // Select a legal integer type if it spans the partition.
5704 if (DL.isLegalInteger(P.size() * 8)) {
5705 Type *IntTy = Type::getIntNTy(C, P.size() * 8);
5706 LogSelection("legal-int-fallback", IntTy, nullptr, false);
5707 return {IntTy, false, nullptr};
5708 }
5709
5710 // Fallback to an i8 array.
5711 Type *ArrayTy = ArrayType::get(Type::getInt8Ty(C), P.size());
5712 LogSelection("byte-array-fallback", ArrayTy, nullptr, false);
5713 return {ArrayTy, false, nullptr};
5714}
5715
5716/// Rewrite an alloca partition's users.
5717///
5718/// This routine drives both of the rewriting goals of the SROA pass. It tries
5719/// to rewrite uses of an alloca partition to be conducive for SSA value
5720/// promotion. If the partition needs a new, more refined alloca, this will
5721/// build that new alloca, preserving as much type information as possible, and
5722/// rewrite the uses of the old alloca to point at the new one and have the
5723/// appropriate new offsets. It also evaluates how successful the rewrite was
5724/// at enabling promotion and if it was successful queues the alloca to be
5725/// promoted.
5726std::pair<AllocaInst *, uint64_t>
5727SROA::rewritePartition(AllocaInst &AI, AllocaSlices &AS, Partition &P) {
5728 const DataLayout &DL = AI.getDataLayout();
5729 // Select the type for the new alloca that spans the partition.
5730 auto [PartitionTy, IsIntegerWideningViable, VecTy] =
5731 selectPartitionType(P, DL, AI, *C, AggregateToVector);
5732
5733 // Check for the case where we're going to rewrite to a new alloca of the
5734 // exact same type as the original, and with the same access offsets. In that
5735 // case, re-use the existing alloca, but still run through the rewriter to
5736 // perform phi and select speculation.
5737 // P.beginOffset() can be non-zero even with the same type in a case with
5738 // out-of-bounds access (e.g. @PR35657 function in SROA/basictest.ll).
5739 AllocaInst *NewAI;
5740 if (PartitionTy == AI.getAllocatedType() && P.beginOffset() == 0) {
5741 NewAI = &AI;
5742 // FIXME: We should be able to bail at this point with "nothing changed".
5743 // FIXME: We might want to defer PHI speculation until after here.
5744 // FIXME: return nullptr;
5745 } else {
5746 // Make sure the alignment is compatible with P.beginOffset().
5747 const Align Alignment = commonAlignment(AI.getAlign(), P.beginOffset());
5748 NewAI =
5749 new AllocaInst(PartitionTy, AI.getAddressSpace(), nullptr, Alignment,
5750 AI.getName() + ".sroa." + Twine(P.begin() - AS.begin()),
5751 AI.getIterator());
5752 tryEnforceAlignment(NewAI, DL.getPrefTypeAlign(PartitionTy), DL);
5753 // Copy the old AI debug location over to the new one.
5754 NewAI->setDebugLoc(AI.getDebugLoc());
5755 ++NumNewAllocas;
5756 }
5757
5758 LLVM_DEBUG(dbgs() << "Rewriting alloca partition " << "[" << P.beginOffset()
5759 << "," << P.endOffset() << ") to: " << *NewAI << "\n");
5760
5761 // Track the high watermark on the worklist as it is only relevant for
5762 // promoted allocas. We will reset it to this point if the alloca is not in
5763 // fact scheduled for promotion.
5764 unsigned PPWOldSize = PostPromotionWorklist.size();
5765 unsigned NumUses = 0;
5766 SmallSetVector<PHINode *, 8> PHIUsers;
5767 SmallSetVector<SelectInst *, 8> SelectUsers;
5768
5769 AllocaSliceRewriter Rewriter(
5770 DL, AS, *this, AI, *NewAI, PartitionTy, P.beginOffset(), P.endOffset(),
5771 IsIntegerWideningViable, VecTy, PHIUsers, SelectUsers);
5772 bool Promotable = true;
5773 // Check whether we can have tree-structured merge.
5774 if (auto DeletedValues = Rewriter.rewriteTreeStructuredMerge(P)) {
5775 NumUses += DeletedValues->size() + 1;
5776 for (Value *V : *DeletedValues)
5777 DeadInsts.push_back(V);
5778 } else {
5779 for (Slice *S : P.splitSliceTails()) {
5780 Promotable &= Rewriter.visit(S);
5781 ++NumUses;
5782 }
5783 for (Slice &S : P) {
5784 Promotable &= Rewriter.visit(&S);
5785 ++NumUses;
5786 }
5787 }
5788
5789 NumAllocaPartitionUses += NumUses;
5790 MaxUsesPerAllocaPartition.updateMax(NumUses);
5791
5792 // Now that we've processed all the slices in the new partition, check if any
5793 // PHIs or Selects would block promotion.
5794 SmallVector<PHINode *, 8> NewSpeculatablePHIs;
5795 SmallVector<PHINode *, 2> NewPHIsWithStoreToRewrite;
5796 for (PHINode *PHI : PHIUsers) {
5797 if (isSafePHIToSpeculate(*PHI)) {
5798 NewSpeculatablePHIs.push_back(PHI);
5799 continue;
5800 }
5801 if (getPHIStoreToRewrite(*PHI, PreserveCFG, DTU->getDomTree())) {
5802 NewPHIsWithStoreToRewrite.push_back(PHI);
5803 continue;
5804 }
5805
5806 Promotable = false;
5807 SelectUsers.clear();
5808 break;
5809 }
5810
5812 NewSelectsToRewrite;
5813 NewSelectsToRewrite.reserve(SelectUsers.size());
5814 for (SelectInst *Sel : SelectUsers) {
5815 std::optional<RewriteableMemOps> Ops =
5816 isSafeSelectToSpeculate(*Sel, PreserveCFG);
5817 if (!Ops) {
5818 Promotable = false;
5819 break;
5820 }
5821 NewSelectsToRewrite.emplace_back(std::make_pair(Sel, *Ops));
5822 }
5823
5824 if (Promotable) {
5825 for (Use *U : AS.getDeadUsesIfPromotable()) {
5826 auto *OldInst = dyn_cast<Instruction>(U->get());
5827 Value::dropDroppableUse(*U);
5828 if (OldInst)
5829 if (isInstructionTriviallyDead(OldInst))
5830 DeadInsts.push_back(OldInst);
5831 }
5832 if (NewSpeculatablePHIs.empty() && NewPHIsWithStoreToRewrite.empty() &&
5833 SelectUsers.empty()) {
5834 // Promote the alloca.
5835 PromotableAllocas.insert(NewAI);
5836 } else {
5837 // If we have either PHIs or Selects to rewrite, add them to those
5838 // worklists and re-queue the new alloca so that we promote it on the next
5839 // iteration.
5840 SpeculatablePHIs.insert_range(NewSpeculatablePHIs);
5841 PHIsWithStoreToRewrite.insert_range(NewPHIsWithStoreToRewrite);
5842 SelectsToRewrite.reserve(SelectsToRewrite.size() +
5843 NewSelectsToRewrite.size());
5844 for (auto &&KV : llvm::make_range(
5845 std::make_move_iterator(NewSelectsToRewrite.begin()),
5846 std::make_move_iterator(NewSelectsToRewrite.end())))
5847 SelectsToRewrite.insert(std::move(KV));
5848 Worklist.insert(NewAI);
5849 }
5850 } else {
5851 // Drop any post-promotion work items if promotion didn't happen.
5852 while (PostPromotionWorklist.size() > PPWOldSize)
5853 PostPromotionWorklist.pop_back();
5854
5855 // We couldn't promote and we didn't create a new partition, nothing
5856 // happened.
5857 if (NewAI == &AI)
5858 return {nullptr, 0};
5859
5860 // If we can't promote the alloca, iterate on it to check for new
5861 // refinements exposed by splitting the current alloca. Don't iterate on an
5862 // alloca which didn't actually change and didn't get promoted.
5863 Worklist.insert(NewAI);
5864 }
5865
5866 return {NewAI, DL.getTypeSizeInBits(PartitionTy).getFixedValue()};
5867}
5868
5869// There isn't a shared interface to get the "address" parts out of a
5870// dbg.declare and dbg.assign, so provide some wrappers.
5873 return DVR->isKillAddress();
5874 return DVR->isKillLocation();
5875}
5876
5879 return DVR->getAddressExpression();
5880 return DVR->getExpression();
5881}
5882
5883/// Create or replace an existing fragment in a DIExpression with \p Frag.
5884/// If the expression already contains a DW_OP_LLVM_extract_bits_[sz]ext
5885/// operation, add \p BitExtractOffset to the offset part.
5886///
5887/// Returns the new expression, or nullptr if this fails (see details below).
5888///
5889/// This function is similar to DIExpression::createFragmentExpression except
5890/// for 3 important distinctions:
5891/// 1. The new fragment isn't relative to an existing fragment.
5892/// 2. It assumes the computed location is a memory location. This means we
5893/// don't need to perform checks that creating the fragment preserves the
5894/// expression semantics.
5895/// 3. Existing extract_bits are modified independently of fragment changes
5896/// using \p BitExtractOffset. A change to the fragment offset or size
5897/// may affect a bit extract. But a bit extract offset can change
5898/// independently of the fragment dimensions.
5899///
5900/// Returns the new expression, or nullptr if one couldn't be created.
5901/// Ideally this is only used to signal that a bit-extract has become
5902/// zero-sized (and thus the new debug record has no size and can be
5903/// dropped), however, it fails for other reasons too - see the FIXME below.
5904///
5905/// FIXME: To keep the change that introduces this function NFC it bails
5906/// in some situations unecessarily, e.g. when fragment and bit extract
5907/// sizes differ.
5910 int64_t BitExtractOffset) {
5912 bool HasFragment = false;
5913 bool HasBitExtract = false;
5914
5915 for (auto &Op : Expr->expr_ops()) {
5916 if (Op.getOp() == dwarf::DW_OP_LLVM_fragment) {
5917 HasFragment = true;
5918 continue;
5919 }
5920 if (auto Extract = dyn_cast<DIExpression::ExtractBitsOp>(Op)) {
5921 HasBitExtract = true;
5922 int64_t ExtractOffsetInBits = Extract.getOffsetInBits();
5923 int64_t ExtractSizeInBits = Extract.getSizeInBits();
5924
5925 // DIExpression::createFragmentExpression doesn't know how to handle
5926 // a fragment that is smaller than the extract. Copy the behaviour
5927 // (bail) to avoid non-NFC changes.
5928 // FIXME: Don't do this.
5929 if (Frag.SizeInBits < uint64_t(ExtractSizeInBits))
5930 return nullptr;
5931
5932 assert(BitExtractOffset <= 0);
5933 int64_t AdjustedOffset = ExtractOffsetInBits + BitExtractOffset;
5934
5935 // DIExpression::createFragmentExpression doesn't know what to do
5936 // if the new extract starts "outside" the existing one. Copy the
5937 // behaviour (bail) to avoid non-NFC changes.
5938 // FIXME: Don't do this.
5939 if (AdjustedOffset < 0)
5940 return nullptr;
5941
5942 Ops.push_back(Op.getOp());
5943 Ops.push_back(std::max<int64_t>(0, AdjustedOffset));
5944 Ops.push_back(ExtractSizeInBits);
5945 continue;
5946 }
5947 Op.appendToVector(Ops);
5948 }
5949
5950 // Unsupported by createFragmentExpression, so don't support it here yet to
5951 // preserve NFC-ness.
5952 if (HasFragment && HasBitExtract)
5953 return nullptr;
5954
5955 if (!HasBitExtract) {
5957 Ops.push_back(Frag.OffsetInBits);
5958 Ops.push_back(Frag.SizeInBits);
5959 }
5960 return DIExpression::get(Expr->getContext(), Ops);
5961}
5962
5963/// Insert a new DbgRecord.
5964/// \p Orig Original to copy record type, debug loc and variable from, and
5965/// additionally value and value expression for dbg_assign records.
5966/// \p NewAddr Location's new base address.
5967/// \p NewAddrExpr New expression to apply to address.
5968/// \p BeforeInst Insert position.
5969/// \p NewFragment New fragment (absolute, non-relative).
5970/// \p BitExtractAdjustment Offset to apply to any extract_bits op.
5971static void
5973 DIExpression *NewAddrExpr, Instruction *BeforeInst,
5974 std::optional<DIExpression::FragmentInfo> NewFragment,
5975 int64_t BitExtractAdjustment) {
5976 (void)DIB;
5977
5978 // A dbg_assign puts fragment info in the value expression only. The address
5979 // expression has already been built: NewAddrExpr. A dbg_declare puts the
5980 // new fragment info into NewAddrExpr (as it only has one expression).
5981 DIExpression *NewFragmentExpr =
5982 Orig->isDbgAssign() ? Orig->getExpression() : NewAddrExpr;
5983 if (NewFragment)
5984 NewFragmentExpr = createOrReplaceFragment(NewFragmentExpr, *NewFragment,
5985 BitExtractAdjustment);
5986 if (!NewFragmentExpr)
5987 return;
5988
5989 if (Orig->isDbgDeclare()) {
5991 NewAddr, Orig->getVariable(), NewFragmentExpr, Orig->getDebugLoc());
5992 BeforeInst->getParent()->insertDbgRecordBefore(DVR,
5993 BeforeInst->getIterator());
5994 return;
5995 }
5996
5997 if (Orig->isDbgValue()) {
5999 NewAddr, Orig->getVariable(), NewFragmentExpr, Orig->getDebugLoc());
6000 // Drop debug information if the expression doesn't start with a
6001 // DW_OP_deref. This is because without a DW_OP_deref, the #dbg_value
6002 // describes the address of alloca rather than the value inside the alloca.
6003 if (!NewFragmentExpr->startsWithDeref())
6004 DVR->setKillAddress();
6005 BeforeInst->getParent()->insertDbgRecordBefore(DVR,
6006 BeforeInst->getIterator());
6007 return;
6008 }
6009
6010 // Apply a DIAssignID to the store if it doesn't already have it.
6011 if (!NewAddr->hasMetadata(LLVMContext::MD_DIAssignID)) {
6012 NewAddr->setMetadata(LLVMContext::MD_DIAssignID,
6014 }
6015
6017 NewAddr, Orig->getValue(), Orig->getVariable(), NewFragmentExpr, NewAddr,
6018 NewAddrExpr, Orig->getDebugLoc());
6019 LLVM_DEBUG(dbgs() << "Created new DVRAssign: " << *NewAssign << "\n");
6020 (void)NewAssign;
6021}
6022
6023/// Walks the slices of an alloca and form partitions based on them,
6024/// rewriting each of their uses.
6025bool SROA::splitAlloca(AllocaInst &AI, AllocaSlices &AS) {
6026 if (AS.begin() == AS.end())
6027 return false;
6028
6029 unsigned NumPartitions = 0;
6030 bool Changed = false;
6031 const DataLayout &DL = AI.getDataLayout();
6032
6033 // First try to pre-split loads and stores.
6034 Changed |= presplitLoadsAndStores(AI, AS);
6035
6036 // Now that we have identified any pre-splitting opportunities,
6037 // mark loads and stores unsplittable except for the following case.
6038 // We leave a slice splittable if all other slices are disjoint or fully
6039 // included in the slice, such as whole-alloca loads and stores.
6040 // If we fail to split these during pre-splitting, we want to force them
6041 // to be rewritten into a partition.
6042 bool IsSorted = true;
6043
6044 uint64_t AllocaSize = AI.getAllocationSize(DL)->getFixedValue();
6045 // We can split at the begin and end offsets of each slice, but only if those
6046 // offsets don't lie inside another slice. Because slices are ordered by
6047 // increasing begin offset, and then decreasing end offset, we can consider
6048 // the slices as being split up into sets with the same begin offset where we
6049 // can ignore every slice except the first (the begin offset will already be
6050 // handled as the begin offset of the set, and the end offset we know is not a
6051 // splittable offset as it's inside the first slice of the set).
6052 SparseBitVector<> SplittableOffset;
6053 uint64_t CurBegin = 0, CurEnd = 0;
6054 for (Slice &S : AS) {
6055 // Check if we have a new set of slices
6056 if (S.beginOffset() > CurBegin || S.endOffset() > CurEnd) {
6057 // If the start isn't inside the previous set it's splittable
6058 if (S.beginOffset() >= CurEnd) {
6059 SplittableOffset.set(S.beginOffset());
6060 }
6061 // If the previous end is inside this slice then remove it
6062 if (CurEnd > S.beginOffset() && CurEnd < S.endOffset()) {
6063 SplittableOffset.reset(CurEnd);
6064 }
6065 CurBegin = S.beginOffset();
6066 // If the end offset isn't inside the previous set it's splittable. We
6067 // also don't update the end offset in that case, as the next set may also
6068 // be inside the previous set.
6069 if (S.endOffset() > CurEnd) {
6070 CurEnd = S.endOffset();
6071 SplittableOffset.set(CurEnd);
6072 }
6073 }
6074 }
6075
6076 for (Slice &S : AS) {
6077 if (!S.isSplittable())
6078 continue;
6079
6080 if ((S.beginOffset() > AllocaSize ||
6081 SplittableOffset.test(S.beginOffset())) &&
6082 (S.endOffset() > AllocaSize || SplittableOffset.test(S.endOffset())))
6083 continue;
6084
6085 if (isa<LoadInst>(S.getUse()->getUser()) ||
6086 isa<StoreInst>(S.getUse()->getUser())) {
6087 S.makeUnsplittable();
6088 IsSorted = false;
6089 }
6090 }
6091
6092 if (!IsSorted)
6094
6095 /// Describes the allocas introduced by rewritePartition in order to migrate
6096 /// the debug info.
6097 struct Fragment {
6098 AllocaInst *Alloca;
6100 uint64_t Size;
6101 Fragment(AllocaInst *AI, uint64_t O, uint64_t S)
6102 : Alloca(AI), Offset(O), Size(S) {}
6103 };
6104 SmallVector<Fragment, 4> Fragments;
6105
6106 // Rewrite each partition.
6107 for (auto &P : AS.partitions()) {
6108 auto [NewAI, ActiveBits] = rewritePartition(AI, AS, P);
6109 if (NewAI) {
6110 Changed = true;
6111 if (NewAI != &AI) {
6112 uint64_t SizeOfByte = 8;
6113 // Don't include any padding.
6114 uint64_t Size = std::min(ActiveBits, P.size() * SizeOfByte);
6115 Fragments.push_back(
6116 Fragment(NewAI, P.beginOffset() * SizeOfByte, Size));
6117 }
6118 }
6119 ++NumPartitions;
6120 }
6121
6122 NumAllocaPartitions += NumPartitions;
6123 MaxPartitionsPerAlloca.updateMax(NumPartitions);
6124
6125 // Migrate debug information from the old alloca to the new alloca(s)
6126 // and the individual partitions.
6127 auto MigrateOne = [&](DbgVariableRecord *DbgVariable) {
6128 // Can't overlap with undef memory.
6129 if (isKillAddress(DbgVariable))
6130 return;
6131
6132 const Value *DbgPtr = DbgVariable->getAddress();
6134 DbgVariable->getFragmentOrEntireVariable();
6135 // Get the address expression constant offset if one exists and the ops
6136 // that come after it.
6137 int64_t CurrentExprOffsetInBytes = 0;
6138 SmallVector<uint64_t> PostOffsetOps;
6139 if (!getAddressExpression(DbgVariable)
6140 ->extractLeadingOffset(CurrentExprOffsetInBytes, PostOffsetOps))
6141 return; // Couldn't interpret this DIExpression - drop the var.
6142
6143 // Offset defined by a DW_OP_LLVM_extract_bits_[sz]ext.
6144 int64_t ExtractOffsetInBits = 0;
6145 for (auto Op : getAddressExpression(DbgVariable)->expr_ops()) {
6146 if (auto Extract = dyn_cast<DIExpression::ExtractBitsOp>(Op)) {
6147 ExtractOffsetInBits = Extract.getOffsetInBits();
6148 break;
6149 }
6150 }
6151
6152 DIBuilder DIB(*AI.getModule(), /*AllowUnresolved*/ false);
6153 for (auto Fragment : Fragments) {
6154 int64_t OffsetFromLocationInBits;
6155 std::optional<DIExpression::FragmentInfo> NewDbgFragment;
6156 // Find the variable fragment that the new alloca slice covers.
6157 // Drop debug info for this variable fragment if we can't compute an
6158 // intersect between it and the alloca slice.
6160 DL, &AI, Fragment.Offset, Fragment.Size, DbgPtr,
6161 CurrentExprOffsetInBytes * 8, ExtractOffsetInBits, VarFrag,
6162 NewDbgFragment, OffsetFromLocationInBits))
6163 continue; // Do not migrate this fragment to this slice.
6164
6165 // Zero sized fragment indicates there's no intersect between the variable
6166 // fragment and the alloca slice. Skip this slice for this variable
6167 // fragment.
6168 if (NewDbgFragment && !NewDbgFragment->SizeInBits)
6169 continue; // Do not migrate this fragment to this slice.
6170
6171 // No fragment indicates DbgVariable's variable or fragment exactly
6172 // overlaps the slice; copy its fragment (or nullopt if there isn't one).
6173 if (!NewDbgFragment)
6174 NewDbgFragment = DbgVariable->getFragment();
6175
6176 // Reduce the new expression offset by the bit-extract offset since
6177 // we'll be keeping that.
6178 int64_t OffestFromNewAllocaInBits =
6179 OffsetFromLocationInBits - ExtractOffsetInBits;
6180 // We need to adjust an existing bit extract if the offset expression
6181 // can't eat the slack (i.e., if the new offset would be negative).
6182 int64_t BitExtractOffset =
6183 std::min<int64_t>(0, OffestFromNewAllocaInBits);
6184 // The magnitude of a negative value indicates the number of bits into
6185 // the existing variable fragment that the memory region begins. The new
6186 // variable fragment already excludes those bits - the new DbgPtr offset
6187 // only needs to be applied if it's positive.
6188 OffestFromNewAllocaInBits =
6189 std::max(int64_t(0), OffestFromNewAllocaInBits);
6190
6191 // Rebuild the expression:
6192 // {Offset(OffestFromNewAllocaInBits), PostOffsetOps, NewDbgFragment}
6193 // Add NewDbgFragment later, because dbg.assigns don't want it in the
6194 // address expression but the value expression instead.
6195 DIExpression *NewExpr = DIExpression::get(AI.getContext(), PostOffsetOps);
6196 if (OffestFromNewAllocaInBits > 0) {
6197 int64_t OffsetInBytes = (OffestFromNewAllocaInBits + 7) / 8;
6198 NewExpr = DIExpression::prepend(NewExpr, /*flags=*/0, OffsetInBytes);
6199 }
6200
6201 // Remove any existing intrinsics on the new alloca describing
6202 // the variable fragment.
6203 auto RemoveOne = [DbgVariable](auto *OldDII) {
6204 auto SameVariableFragment = [](const auto *LHS, const auto *RHS) {
6205 return LHS->getVariable() == RHS->getVariable() &&
6206 LHS->getDebugLoc()->getInlinedAt() ==
6207 RHS->getDebugLoc()->getInlinedAt();
6208 };
6209 if (SameVariableFragment(OldDII, DbgVariable))
6210 OldDII->eraseFromParent();
6211 };
6212 for_each(findDVRDeclares(Fragment.Alloca), RemoveOne);
6213 for_each(findDVRValues(Fragment.Alloca), RemoveOne);
6214 insertNewDbgInst(DIB, DbgVariable, Fragment.Alloca, NewExpr, &AI,
6215 NewDbgFragment, BitExtractOffset);
6216 }
6217 };
6218
6219 // Migrate debug information from the old alloca to the new alloca(s)
6220 // and the individual partitions.
6221 for_each(findDVRDeclares(&AI), MigrateOne);
6222 for_each(findDVRValues(&AI), MigrateOne);
6223 for_each(at::getDVRAssignmentMarkers(&AI), MigrateOne);
6224
6225 return Changed;
6226}
6227
6228/// Clobber a use with poison, deleting the used value if it becomes dead.
6229void SROA::clobberUse(Use &U) {
6230 Value *OldV = U;
6231 // Replace the use with an poison value.
6232 U = PoisonValue::get(OldV->getType());
6233
6234 // Check for this making an instruction dead. We have to garbage collect
6235 // all the dead instructions to ensure the uses of any alloca end up being
6236 // minimal.
6237 if (Instruction *OldI = dyn_cast<Instruction>(OldV))
6238 if (isInstructionTriviallyDead(OldI)) {
6239 DeadInsts.push_back(OldI);
6240 }
6241}
6242
6243/// A basic LoadAndStorePromoter that does not remove store nodes.
6245public:
6247 Type *ZeroType)
6248 : LoadAndStorePromoter(Insts, S), ZeroType(ZeroType) {}
6249 bool shouldDelete(Instruction *I) const override {
6250 return !isa<StoreInst>(I) && !isa<AllocaInst>(I);
6251 }
6252
6254 return UndefValue::get(ZeroType);
6255 }
6256
6257private:
6258 Type *ZeroType;
6259};
6260
6261bool SROA::propagateStoredValuesToLoads(AllocaInst &AI, AllocaSlices &AS) {
6262 // Look through each "partition", looking for slices with the same start/end
6263 // that do not overlap with any before them. The slices are sorted by
6264 // increasing beginOffset. We don't use AS.partitions(), as it will use a more
6265 // sophisticated algorithm that takes splittable slices into account.
6266 LLVM_DEBUG(dbgs() << "Attempting to propagate values on " << AI << "\n");
6267 bool AllSameAndValid = true;
6268 Type *PartitionType = nullptr;
6269 SmallVector<Instruction *> Insts;
6270 uint64_t BeginOffset = 0;
6271 uint64_t EndOffset = 0;
6272
6273 auto Flush = [&]() {
6274 if (AllSameAndValid && !Insts.empty()) {
6275 LLVM_DEBUG(dbgs() << "Propagate values on slice [" << BeginOffset << ", "
6276 << EndOffset << ")\n");
6278 SSAUpdater SSA(&NewPHIs);
6279 Insts.push_back(&AI);
6280 BasicLoadAndStorePromoter Promoter(Insts, SSA, PartitionType);
6281 Promoter.run(Insts);
6282 }
6283 AllSameAndValid = true;
6284 PartitionType = nullptr;
6285 Insts.clear();
6286 };
6287
6288 for (Slice &S : AS) {
6289 auto *User = cast<Instruction>(S.getUse()->getUser());
6290 if (isAssumeLikeIntrinsic(User)) {
6291 LLVM_DEBUG({
6292 dbgs() << "Ignoring slice: ";
6293 AS.print(dbgs(), &S);
6294 });
6295 continue;
6296 }
6297 if (S.beginOffset() >= EndOffset) {
6298 Flush();
6299 BeginOffset = S.beginOffset();
6300 EndOffset = S.endOffset();
6301 } else if (S.beginOffset() != BeginOffset || S.endOffset() != EndOffset) {
6302 if (AllSameAndValid) {
6303 LLVM_DEBUG({
6304 dbgs() << "Slice does not match range [" << BeginOffset << ", "
6305 << EndOffset << ")";
6306 AS.print(dbgs(), &S);
6307 });
6308 AllSameAndValid = false;
6309 }
6310 EndOffset = std::max(EndOffset, S.endOffset());
6311 continue;
6312 }
6313
6314 if (auto *LI = dyn_cast<LoadInst>(User)) {
6315 Type *UserTy = LI->getType();
6316 // LoadAndStorePromoter requires all the types to be the same.
6317 if (!LI->isSimple() || (PartitionType && UserTy != PartitionType))
6318 AllSameAndValid = false;
6319 PartitionType = UserTy;
6320 Insts.push_back(User);
6321 } else if (auto *SI = dyn_cast<StoreInst>(User)) {
6322 Type *UserTy = SI->getValueOperand()->getType();
6323 if (!SI->isSimple() || (PartitionType && UserTy != PartitionType))
6324 AllSameAndValid = false;
6325 PartitionType = UserTy;
6326 Insts.push_back(User);
6327 } else {
6328 AllSameAndValid = false;
6329 }
6330 }
6331
6332 Flush();
6333 return true;
6334}
6335
6336/// Analyze an alloca for SROA.
6337///
6338/// This analyzes the alloca to ensure we can reason about it, builds
6339/// the slices of the alloca, and then hands it off to be split and
6340/// rewritten as needed.
6341std::pair<bool /*Changed*/, bool /*CFGChanged*/>
6342SROA::runOnAlloca(AllocaInst &AI) {
6343 bool Changed = false;
6344 bool CFGChanged = false;
6345
6346 LLVM_DEBUG(dbgs() << "SROA alloca: " << AI << "\n");
6347 ++NumAllocasAnalyzed;
6348
6349 // Special case dead allocas, as they're trivial.
6350 if (AI.use_empty()) {
6351 AI.eraseFromParent();
6352 Changed = true;
6353 return {Changed, CFGChanged};
6354 }
6355 const DataLayout &DL = AI.getDataLayout();
6356
6357 // Skip alloca forms that this analysis can't handle.
6358 std::optional<TypeSize> Size = AI.getAllocationSize(DL);
6359 if (AI.isArrayAllocation() || !Size || Size->isScalable() || Size->isZero())
6360 return {Changed, CFGChanged};
6361
6362 // First, split any FCA loads and stores touching this alloca to promote
6363 // better splitting and promotion opportunities.
6364 IRBuilderTy IRB(&AI);
6365 AggLoadStoreRewriter AggRewriter(DL, IRB);
6366 Changed |= AggRewriter.rewrite(AI);
6367
6368 // Build the slices using a recursive instruction-visiting builder.
6369 AllocaSlices AS(DL, AI);
6370 LLVM_DEBUG(AS.print(dbgs()));
6371 if (AS.isEscaped())
6372 return {Changed, CFGChanged};
6373
6374 if (AS.isEscapedReadOnly()) {
6375 Changed |= propagateStoredValuesToLoads(AI, AS);
6376 return {Changed, CFGChanged};
6377 }
6378
6379 // Delete all the dead users of this alloca before splitting and rewriting it.
6380 for (Instruction *DeadUser : AS.getDeadUsers()) {
6381 // Free up everything used by this instruction.
6382 for (Use &DeadOp : DeadUser->operands())
6383 clobberUse(DeadOp);
6384
6385 // Now replace the uses of this instruction.
6386 DeadUser->replaceAllUsesWith(PoisonValue::get(DeadUser->getType()));
6387
6388 // And mark it for deletion.
6389 DeadInsts.push_back(DeadUser);
6390 Changed = true;
6391 }
6392 for (Use *DeadOp : AS.getDeadOperands()) {
6393 clobberUse(*DeadOp);
6394 Changed = true;
6395 }
6396
6397 // No slices to split. Leave the dead alloca for a later pass to clean up.
6398 if (AS.begin() == AS.end())
6399 return {Changed, CFGChanged};
6400
6401 Changed |= splitAlloca(AI, AS);
6402
6403 LLVM_DEBUG(dbgs() << " Speculating PHIs\n");
6404 while (!SpeculatablePHIs.empty())
6405 speculatePHINodeLoads(IRB, *SpeculatablePHIs.pop_back_val());
6406
6407 LLVM_DEBUG(dbgs() << " Rewriting stores through PHIs\n");
6408 auto RemainingPHIsWithStoreToRewrite = PHIsWithStoreToRewrite.takeVector();
6409 while (!RemainingPHIsWithStoreToRewrite.empty()) {
6410 PHINode *PN = RemainingPHIsWithStoreToRewrite.pop_back_val();
6411 auto *SI = cast<StoreInst>(PN->user_back());
6412 CFGChanged |= rewritePHINodeStore(*PN, *SI, *DTU, Worklist);
6413 }
6414
6415 LLVM_DEBUG(dbgs() << " Rewriting Selects\n");
6416 auto RemainingSelectsToRewrite = SelectsToRewrite.takeVector();
6417 while (!RemainingSelectsToRewrite.empty()) {
6418 const auto [K, V] = RemainingSelectsToRewrite.pop_back_val();
6419 CFGChanged |=
6420 rewriteSelectInstMemOps(*K, V, IRB, PreserveCFG ? nullptr : DTU);
6421 }
6422
6423 return {Changed, CFGChanged};
6424}
6425
6426/// Delete the dead instructions accumulated in this run.
6427///
6428/// Recursively deletes the dead instructions we've accumulated. This is done
6429/// at the very end to maximize locality of the recursive delete and to
6430/// minimize the problems of invalidated instruction pointers as such pointers
6431/// are used heavily in the intermediate stages of the algorithm.
6432///
6433/// We also record the alloca instructions deleted here so that they aren't
6434/// subsequently handed to mem2reg to promote.
6435bool SROA::deleteDeadInstructions(
6436 SmallPtrSetImpl<AllocaInst *> &DeletedAllocas) {
6437 bool Changed = false;
6438 while (!DeadInsts.empty()) {
6439 Instruction *I = dyn_cast_or_null<Instruction>(DeadInsts.pop_back_val());
6440 if (!I)
6441 continue;
6442 LLVM_DEBUG(dbgs() << "Deleting dead instruction: " << *I << "\n");
6443
6444 // If the instruction is an alloca, find the possible dbg.declare connected
6445 // to it, and remove it too. We must do this before calling RAUW or we will
6446 // not be able to find it.
6447 if (AllocaInst *AI = dyn_cast<AllocaInst>(I)) {
6448 DeletedAllocas.insert(AI);
6449 for (DbgVariableRecord *OldDII : findDVRDeclares(AI))
6450 OldDII->eraseFromParent();
6451 }
6452
6454 I->replaceAllUsesWith(UndefValue::get(I->getType()));
6455
6456 for (Use &Operand : I->operands())
6457 if (Instruction *U = dyn_cast<Instruction>(Operand)) {
6458 // Zero out the operand and see if it becomes trivially dead.
6459 Operand = nullptr;
6461 DeadInsts.push_back(U);
6462 }
6463
6464 ++NumDeleted;
6465 I->eraseFromParent();
6466 Changed = true;
6467 }
6468 return Changed;
6469}
6470/// Promote the allocas, using the best available technique.
6471///
6472/// This attempts to promote whatever allocas have been identified as viable in
6473/// the PromotableAllocas list. If that list is empty, there is nothing to do.
6474/// This function returns whether any promotion occurred.
6475bool SROA::promoteAllocas() {
6476 if (PromotableAllocas.empty())
6477 return false;
6478
6479 if (ScalarOptions::Global.sroa_skip_mem2reg) {
6480 LLVM_DEBUG(dbgs() << "Not promoting allocas with mem2reg!\n");
6481 } else {
6482 LLVM_DEBUG(dbgs() << "Promoting allocas with mem2reg...\n");
6483 NumPromoted += PromotableAllocas.size();
6484 PromoteMemToReg(PromotableAllocas.getArrayRef(), DTU->getDomTree(), AC);
6485 }
6486
6487 PromotableAllocas.clear();
6488 return true;
6489}
6490
6491std::pair<bool /*Changed*/, bool /*CFGChanged*/> SROA::runSROA(Function &F) {
6492 LLVM_DEBUG(dbgs() << "SROA function: " << F.getName() << "\n");
6493
6494 const DataLayout &DL = F.getDataLayout();
6495 BasicBlock &EntryBB = F.getEntryBlock();
6496 for (BasicBlock::iterator I = EntryBB.begin(), E = std::prev(EntryBB.end());
6497 I != E; ++I) {
6498 if (AllocaInst *AI = dyn_cast<AllocaInst>(I)) {
6499 std::optional<TypeSize> Size = AI->getAllocationSize(DL);
6500 if (Size && Size->isScalable() && isAllocaPromotable(AI))
6501 PromotableAllocas.insert(AI);
6502 else
6503 Worklist.insert(AI);
6504 }
6505 }
6506
6507 bool Changed = false;
6508 bool CFGChanged = false;
6509 // A set of deleted alloca instruction pointers which should be removed from
6510 // the list of promotable allocas.
6511 SmallPtrSet<AllocaInst *, 4> DeletedAllocas;
6512
6513 do {
6514 while (!Worklist.empty()) {
6515 auto [IterationChanged, IterationCFGChanged] =
6516 runOnAlloca(*Worklist.pop_back_val());
6517 Changed |= IterationChanged;
6518 CFGChanged |= IterationCFGChanged;
6519
6520 Changed |= deleteDeadInstructions(DeletedAllocas);
6521
6522 // Remove the deleted allocas from various lists so that we don't try to
6523 // continue processing them.
6524 if (!DeletedAllocas.empty()) {
6525 Worklist.set_subtract(DeletedAllocas);
6526 PostPromotionWorklist.set_subtract(DeletedAllocas);
6527 PromotableAllocas.set_subtract(DeletedAllocas);
6528 DeletedAllocas.clear();
6529 }
6530 }
6531
6532 Changed |= promoteAllocas();
6533
6534 Worklist = PostPromotionWorklist;
6535 PostPromotionWorklist.clear();
6536 } while (!Worklist.empty());
6537
6538 assert((!CFGChanged || Changed) && "Can not only modify the CFG.");
6539 assert((!CFGChanged || !PreserveCFG) &&
6540 "Should not have modified the CFG when told to preserve it.");
6541
6542 if (Changed && isAssignmentTrackingEnabled(*F.getParent())) {
6543 for (auto &BB : F) {
6545 }
6546 }
6547
6548 return {Changed, CFGChanged};
6549}
6550
6554 DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy);
6555 auto [Changed, CFGChanged] =
6556 SROA(&F.getContext(), &DTU, &AC, Options).runSROA(F);
6557 if (!Changed)
6558 return PreservedAnalyses::all();
6560 if (!CFGChanged)
6563 return PA;
6564}
6565
6567 raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
6568 static_cast<PassInfoMixin<SROAPass> *>(this)->printPipeline(
6569 OS, MapClassName2PassName);
6570 OS << '<'
6571 << (Options.CFG == SROAOptions::PreserveCFG ? "preserve-cfg"
6572 : "modify-cfg");
6573 if (Options.AggregateToVector)
6574 OS << ";aggregate-to-vector";
6575 OS << '>';
6576}
6577
6578SROAPass::SROAPass(SROAOptions Options) : Options(Options) {}
6579
6580namespace {
6581
6582/// A legacy pass for the legacy pass manager that wraps the \c SROA pass.
6583class SROALegacyPass : public FunctionPass {
6585
6586public:
6587 static char ID;
6588
6590 : FunctionPass(ID), Options(Options) {
6592 }
6593
6594 bool runOnFunction(Function &F) override {
6595 if (skipFunction(F))
6596 return false;
6597
6598 DominatorTree &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
6599 AssumptionCache &AC =
6600 getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
6601 DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy);
6602 auto [Changed, _] = SROA(&F.getContext(), &DTU, &AC, Options).runSROA(F);
6603 return Changed;
6604 }
6605
6606 void getAnalysisUsage(AnalysisUsage &AU) const override {
6607 AU.addRequired<AssumptionCacheTracker>();
6608 AU.addRequired<DominatorTreeWrapperPass>();
6609 AU.addPreserved<GlobalsAAWrapperPass>();
6610 AU.addPreserved<DominatorTreeWrapperPass>();
6611 }
6612
6613 StringRef getPassName() const override { return "SROA"; }
6614};
6615
6616} // end anonymous namespace
6617
6618char SROALegacyPass::ID = 0;
6619
6620FunctionPass *llvm::createSROAPass(bool PreserveCFG, bool AggregateToVector) {
6621 return new SROALegacyPass(SROAOptions(PreserveCFG ? SROAOptions::PreserveCFG
6623 AggregateToVector));
6624}
6625
6626INITIALIZE_PASS_BEGIN(SROALegacyPass, "sroa",
6627 "Scalar Replacement Of Aggregates", false, false)
6630INITIALIZE_PASS_END(SROALegacyPass, "sroa", "Scalar Replacement Of Aggregates",
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned uint64_t
Rewrite undef for PHI
This file implements a class to represent arbitrary precision integral constant values and operations...
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")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition Compiler.h:686
This file contains the declarations for the subclasses of Constant, which represent the different fla...
DXIL Forward Handle Accesses
DXIL Resource Access
This file defines the DenseMap class.
static bool runOnFunction(Function &F, bool PostInlining)
Flatten the CFG
#define DEBUG_TYPE
This is the interface for a simple mod/ref and alias analysis over globals.
Hexagon Common GEP
#define _
IRTranslator LLVM IR MI
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
This defines the Use class.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static LVOptions Options
Definition LVOptions.cpp:25
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
print mir2vec MIR2Vec Vocabulary Printer Pass
Definition MIR2Vec.cpp:629
This file implements a map that provides insertion order iteration.
static std::optional< AllocFnsTy > getAllocationSize(const CallBase *CB, const TargetLibraryInfo *TLI)
static std::optional< uint64_t > getSizeInBytes(std::optional< uint64_t > SizeInBits)
Memory SSA
Definition MemorySSA.cpp:73
This file contains the declarations for metadata subclasses.
#define T
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
#define P(N)
if(PassOpts->AAPipeline)
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
This file defines the PointerIntPair class.
This file provides a collection of visitors which walk the (instruction) uses of a pointer.
const SmallVectorImpl< MachineOperand > & Cond
Remove Loads Into Fake Uses
bool isDead(const MachineInstr &MI, const MachineRegisterInfo &MRI)
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
static void visit(BasicBlock &Start, std::function< bool(BasicBlock *)> op)
static void migrateDebugInfo(AllocaInst *OldAlloca, bool IsSplit, uint64_t OldAllocaOffsetInBits, uint64_t SliceSizeInBits, Instruction *OldInst, Instruction *Inst, Value *Dest, Value *Value, const DataLayout &DL)
Find linked dbg.assign and generate a new one with the correct FragmentInfo.
Definition SROA.cpp:345
static VectorType * isVectorPromotionViable(Partition &P, const DataLayout &DL, unsigned VScale)
Test whether the given alloca partitioning and range of slices can be promoted to a vector.
Definition SROA.cpp:2371
static Align getAdjustedAlignment(Instruction *I, uint64_t Offset)
Compute the adjusted alignment for a load or store from an offset.
Definition SROA.cpp:2044
static VectorType * checkVectorTypesForPromotion(Partition &P, const DataLayout &DL, SmallVectorImpl< VectorType * > &CandidateTys, bool HaveCommonEltTy, Type *CommonEltTy, bool HaveVecPtrTy, bool HaveCommonVecPtrTy, VectorType *CommonVecPtrTy, unsigned VScale)
Test whether any vector type in CandidateTys is viable for promotion.
Definition SROA.cpp:2222
static std::pair< Type *, IntegerType * > findCommonType(AllocaSlices::const_iterator B, AllocaSlices::const_iterator E, uint64_t EndOffset)
Walk the range of a partitioning looking for a common type to cover this sequence of slices.
Definition SROA.cpp:1511
static Type * stripAggregateTypeWrapping(const DataLayout &DL, Type *Ty)
Strip aggregate type wrapping.
Definition SROA.cpp:4790
static FragCalcResult calculateFragment(DILocalVariable *Variable, uint64_t NewStorageSliceOffsetInBits, uint64_t NewStorageSliceSizeInBits, std::optional< DIExpression::FragmentInfo > StorageFragment, std::optional< DIExpression::FragmentInfo > CurrentFragment, DIExpression::FragmentInfo &Target)
Definition SROA.cpp:280
static DIExpression * createOrReplaceFragment(const DIExpression *Expr, DIExpression::FragmentInfo Frag, int64_t BitExtractOffset)
Create or replace an existing fragment in a DIExpression with Frag.
Definition SROA.cpp:5908
static Value * insertInteger(const DataLayout &DL, IRBuilderTy &IRB, Value *Old, Value *V, uint64_t Offset, const Twine &Name)
Definition SROA.cpp:2614
static bool isVectorPromotionViableForSlice(Partition &P, const Slice &S, VectorType *Ty, uint64_t ElementSize, const DataLayout &DL, unsigned VScale)
Test whether the given slice use can be promoted to a vector.
Definition SROA.cpp:2142
static Value * getAdjustedPtr(IRBuilderTy &IRB, const DataLayout &DL, Value *Ptr, APInt Offset, Type *PointerTy, const Twine &NamePrefix)
Compute an adjusted pointer from Ptr by Offset bytes where the resulting pointer has PointerTy.
Definition SROA.cpp:2033
static bool isIntegerWideningViableForSlice(const Slice &S, uint64_t AllocBeginOffset, Type *AllocaTy, const DataLayout &DL, bool &WholeAllocaOp)
Test whether a slice of an alloca is valid for integer widening.
Definition SROA.cpp:2453
static bool rewritePHINodeStore(PHINode &PN, StoreInst &SI, DomTreeUpdater &DTU, SmallSetVector< AllocaInst *, 16 > &Worklist)
Move a store through a pointer PHI onto each of the PHI's incoming edges.
Definition SROA.cpp:1764
static Value * extractVector(IRBuilderTy &IRB, Value *V, unsigned BeginIndex, unsigned EndIndex, const Twine &Name)
Definition SROA.cpp:2647
static Value * foldPHINodeOrSelectInst(Instruction &I)
A helper that folds a PHI node or a select.
Definition SROA.cpp:1007
static bool rewriteSelectInstMemOps(SelectInst &SI, const RewriteableMemOps &Ops, IRBuilderTy &IRB, DomTreeUpdater *DTU)
Definition SROA.cpp:1999
static void rewriteMemOpOfSelect(SelectInst &SI, T &I, SelectHandSpeculativity Spec, DomTreeUpdater &DTU)
Definition SROA.cpp:1932
static Slice * findOverlappingCopySlice(Slice &S, InstructionSliceMap &SliceMap)
Try to find a slice in the map that partially overlaps with S, i.e.
Definition SROA.cpp:4941
static Value * foldSelectInst(SelectInst &SI)
Definition SROA.cpp:994
bool isKillAddress(const DbgVariableRecord *DVR)
Definition SROA.cpp:5871
static Value * insertVector(IRBuilderTy &IRB, Value *Old, Value *V, unsigned BeginIndex, const Twine &Name)
Definition SROA.cpp:2668
static bool isIntegerWideningViable(Partition &P, Type *AllocaTy, const DataLayout &DL)
Test whether the given alloca partition's integer operations can be widened to promotable ones.
Definition SROA.cpp:2548
static void speculatePHINodeLoads(IRBuilderTy &IRB, PHINode &PN)
Definition SROA.cpp:1709
static VectorType * createAndCheckVectorTypesForPromotion(SetVector< Type * > &OtherTys, ArrayRef< VectorType * > CandidateTysCopy, function_ref< void(Type *)> CheckCandidateType, Partition &P, const DataLayout &DL, SmallVectorImpl< VectorType * > &CandidateTys, bool &HaveCommonEltTy, Type *&CommonEltTy, bool &HaveVecPtrTy, bool &HaveCommonVecPtrTy, VectorType *&CommonVecPtrTy, unsigned VScale)
Definition SROA.cpp:2327
static DebugVariable getAggregateVariable(DbgVariableRecord *DVR)
Definition SROA.cpp:326
static std::tuple< Type *, bool, VectorType * > selectPartitionType(Partition &P, const DataLayout &DL, AllocaInst &AI, LLVMContext &C, bool AggregateToVector)
Select a partition type for an alloca partition.
Definition SROA.cpp:5588
static bool isSafePHIToSpeculate(PHINode &PN)
PHI instructions that use an alloca and are subsequently loaded can be rewritten to load both input p...
Definition SROA.cpp:1580
static FixedVectorType * tryCanonicalizeStructToVector(StructType *STy, Partition &P, const DataLayout &DL)
Try to canonicalize a homogeneous struct partition to a vector type.
Definition SROA.cpp:5521
static Value * extractInteger(const DataLayout &DL, IRBuilderTy &IRB, Value *V, IntegerType *Ty, uint64_t Offset, const Twine &Name)
Definition SROA.cpp:2589
static void insertNewDbgInst(DIBuilder &DIB, DbgVariableRecord *Orig, AllocaInst *NewAddr, DIExpression *NewAddrExpr, Instruction *BeforeInst, std::optional< DIExpression::FragmentInfo > NewFragment, int64_t BitExtractAdjustment)
Insert a new DbgRecord.
Definition SROA.cpp:5972
static void speculateSelectInstLoads(SelectInst &SI, LoadInst &LI, IRBuilderTy &IRB)
Definition SROA.cpp:1894
static Value * mergeTwoVectors(Value *V0, Value *V1, const DataLayout &DL, Type *NewAIEltTy, IRBuilder<> &Builder)
This function takes two vector values and combines them into a single vector by concatenating their e...
Definition SROA.cpp:2739
const DIExpression * getAddressExpression(const DbgVariableRecord *DVR)
Definition SROA.cpp:5877
static Type * getTypePartition(const DataLayout &DL, Type *Ty, uint64_t Offset, uint64_t Size)
Try to find a partition of the aggregate type passed in for a given offset and size.
Definition SROA.cpp:4828
static bool canConvertValue(const DataLayout &DL, Type *OldTy, Type *NewTy, unsigned VScale=0)
Test whether we can convert a value from the old to the new type.
Definition SROA.cpp:2054
static SelectHandSpeculativity isSafeLoadOfSelectToSpeculate(LoadInst &LI, SelectInst &SI, bool PreserveCFG)
Definition SROA.cpp:1835
static StoreInst * getPHIStoreToRewrite(PHINode &PN, bool PreserveCFG, DominatorTree &DT)
Check whether a single store through PN can be moved onto each incoming edge.
Definition SROA.cpp:1656
static Type * findCommonTypeThroughPHIOrSelect(Instruction &I)
Find a common load/store type used through a pointer PHI or select.
Definition SROA.cpp:1487
This file provides the interface for LLVM's Scalar Replacement of Aggregates pass.
This file contains some templates that are useful if you are working with the STL at all.
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the SparseBitVector 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 SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
virt reg Virtual Register Rewriter
Value * RHS
Value * LHS
Builder for the alloca slices.
Definition SROA.cpp:1019
SliceBuilder(const DataLayout &DL, AllocaInst &AI, AllocaSlices &AS)
Definition SROA.cpp:1035
An iterator over partitions of the alloca's slices.
Definition SROA.cpp:807
bool operator==(const partition_iterator &RHS) const
Definition SROA.cpp:954
partition_iterator & operator++()
Definition SROA.cpp:974
bool shouldDelete(Instruction *I) const override
Return false if a sub-class wants to keep one of the loads/stores after the SSA construction.
Definition SROA.cpp:6249
BasicLoadAndStorePromoter(ArrayRef< const Instruction * > Insts, SSAUpdater &S, Type *ZeroType)
Definition SROA.cpp:6246
Value * getValueToUseForAlloca(Instruction *I) const override
Return the value to use for the point in the code that the alloca is positioned.
Definition SROA.cpp:6253
Class for arbitrary precision integers.
Definition APInt.h:78
an instruction to allocate memory on the stack
LLVM_ABI bool isStaticAlloca() const
Return true if this alloca is in the entry block of the function and is a constant size.
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.
LLVM_ABI std::optional< TypeSize > getAllocationSize(const DataLayout &DL) const
Get allocation size in bytes.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:130
size_t size() const
Get the array size.
Definition ArrayRef.h:141
iterator begin() const
Definition ArrayRef.h:129
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
A function analysis which provides an AssumptionCache.
An immutable pass that tracks lazily created AssumptionCache objects.
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator end()
Definition BasicBlock.h:459
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:446
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,...
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
LLVM_ABI bool canSplitPredecessors() const
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
Represents analyses that only rely on functions' control flow.
Definition Analysis.h:73
LLVM_ABI CaptureInfo getCaptureInfo(unsigned OpNo) const
Return which pointer components this operand may capture.
bool onlyReadsMemory(unsigned OpNo) const
bool isDataOperand(const Use *U) const
This is the shared class of boolean and integer constants.
Definition Constants.h:87
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
static DIAssignID * getDistinct(LLVMContext &Context)
LLVM_ABI DbgRecord * insertDbgAssign(Instruction *LinkedInstr, Value *Val, DILocalVariable *SrcVar, DIExpression *ValExpr, Value *Addr, DIExpression *AddrExpr, const DILocation *DL)
Insert a new dbg_assign record.
DWARF expression.
iterator_range< expr_op_iterator > expr_ops() const
DbgVariableFragmentInfo FragmentInfo
LLVM_ABI bool startsWithDeref() const
Return whether the first element a DW_OP_deref.
static LLVM_ABI bool calculateFragmentIntersect(const DataLayout &DL, const Value *SliceStart, uint64_t SliceOffsetInBits, uint64_t SliceSizeInBits, const Value *DbgPtr, int64_t DbgPtrOffsetInBits, int64_t DbgExtractOffsetInBits, DIExpression::FragmentInfo VarFrag, std::optional< DIExpression::FragmentInfo > &Result, int64_t &OffsetFromLocationInBits)
Computes a fragment, bit-extract operation if needed, and new constant offset to describe a part of a...
static LLVM_ABI std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
static LLVM_ABI DIExpression * prepend(const DIExpression *Expr, uint8_t Flags, int64_t Offset=0)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value or/and an ...
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
LLVM_ABI void moveBefore(DbgRecord *MoveBefore)
DebugLoc getDebugLoc() const
void setDebugLoc(DebugLoc Loc)
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LLVM_ABI void setKillAddress()
Kill the address component.
LLVM_ABI bool isKillLocation() const
LLVM_ABI bool isKillAddress() const
Check whether this kills the address component.
LLVM_ABI void replaceVariableLocationOp(Value *OldValue, Value *NewValue, bool AllowEmpty=false)
Value * getValue(unsigned OpIdx=0) const
static LLVM_ABI DbgVariableRecord * createLinkedDVRAssign(Instruction *LinkedInstr, Value *Val, DILocalVariable *Variable, DIExpression *Expression, Value *Address, DIExpression *AddressExpression, const DILocation *DI)
LLVM_ABI void setAssignId(DIAssignID *New)
DIExpression * getExpression() const
static LLVM_ABI DbgVariableRecord * createDVRDeclare(Value *Address, DILocalVariable *DV, DIExpression *Expr, const DILocation *DI)
static LLVM_ABI DbgVariableRecord * createDbgVariableRecord(Value *Location, DILocalVariable *DV, DIExpression *Expr, const DILocation *DI)
DILocalVariable * getVariable() const
DIExpression * getAddressExpression() const
LLVM_ABI DILocation * getInlinedAt() const
Definition DebugLoc.cpp:58
Identifies a unique instance of a variable.
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
Definition DenseMap.h:763
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:767
iterator end()
Definition DenseMap.h:687
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:794
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:828
Analysis pass which computes a DominatorTree.
Definition Dominators.h:241
Legacy analysis pass which computes a DominatorTree.
Definition Dominators.h:277
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
Class to represent fixed width SIMD vectors.
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Definition Type.cpp:843
FunctionPass class - This class is used to implement most global optimizations.
Definition Pass.h:314
unsigned getVScaleValue() const
Return the value for vscale based on the vscale_range attribute or 0 when unknown.
const BasicBlock & getEntryBlock() const
Definition Function.h:794
LLVM_ABI bool accumulateConstantOffset(const DataLayout &DL, APInt &Offset, function_ref< bool(Value &, APInt &)> ExternalAnalysis=nullptr) const
Accumulate the constant address offset of this GEP if possible.
Definition Operator.cpp:130
iterator_range< op_iterator > indices()
Type * getSourceElementType() const
LLVM_ABI GEPNoWrapFlags getNoWrapFlags() const
Get the nowrap flags for the GEP instruction.
This provides the default implementation of the IRBuilder 'InsertHelper' method that is called whenev...
Definition IRBuilder.h:62
void InsertHelper(Instruction *I, const Twine &Name, BasicBlock::iterator InsertPt) const
Definition IRBuilder.h:64
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2918
Base class for instruction visitors.
Definition InstVisitor.h:78
LLVM_ABI unsigned getNumSuccessors() const LLVM_READONLY
Return the number of successors that this instruction has.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
LLVM_ABI void setAAMetadata(const AAMDNodes &N)
Sets the AA metadata on this instruction from the AAMDNodes structure.
bool hasMetadata() const
Return true if this instruction has any metadata attached to it.
LLVM_ABI bool isAtomic() const LLVM_READONLY
Return true if this instruction has an AtomicOrdering of unordered or higher.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
Instruction * user_back()
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
LLVM_ABI bool mayHaveSideEffects() const LLVM_READONLY
Return true if the instruction may have side effects.
LLVM_ABI bool comesBefore(const Instruction *Other) const
Given an instruction Other in the same basic block as this instruction, return true if this instructi...
iterator_range< user_iterator > users()
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
user_iterator user_begin()
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.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
Class to represent integer types.
@ MAX_INT_BITS
Maximum number of bits that can be specified.
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
A wrapper class for inspecting calls to intrinsic functions.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LLVM_ABI LoadAndStorePromoter(ArrayRef< const Instruction * > Insts, SSAUpdater &S, StringRef Name=StringRef())
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.
Type * getPointerOperandType() const
static unsigned getPointerOperandIndex()
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.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1579
LLVMContext & getContext() const
Definition Metadata.h:1245
This is the common base class for memset/memcpy/memmove.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
op_range incoming_values()
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
int getBasicBlockIndex(const BasicBlock *BB) const
Return the first index of the specified basic block in the value list for this PHI.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
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...
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
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.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalyses & preserveSet()
Mark an analysis set as preserved.
Definition Analysis.h:151
PreservedAnalyses & preserve()
Mark an analysis as preserved.
Definition Analysis.h:132
PtrUseVisitor(const DataLayout &DL)
LLVM_ABI SROAPass(SROAOptions Options)
If PreserveCFG is set, then the pass is not allowed to modify CFG in any way, even if it would update...
Definition SROA.cpp:6578
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Run the pass over the function.
Definition SROA.cpp:6551
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
Definition SROA.cpp:6566
Helper class for SSA formation on a set of values defined in multiple blocks.
Definition SSAUpdater.h:39
This class represents the LLVM 'select' instruction.
A vector that has set insertion semantics.
Definition SetVector.h:57
size_type size() const
Determine the number of elements in the SetVector.
Definition SetVector.h:103
void clear()
Completely clear the SetVector.
Definition SetVector.h:273
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:157
bool erase(PtrType Ptr)
Remove pointer from the set.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:345
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
iterator erase(const_iterator CI)
typename SuperClass::const_iterator const_iterator
typename SuperClass::iterator iterator
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
void set(unsigned Idx)
bool test(unsigned Idx) const
void reset(unsigned Idx)
An instruction for storing to memory.
void setAlignment(Align Align)
Value * getValueOperand()
static unsigned getPointerOperandIndex()
Value * getPointerOperand()
void setAtomic(AtomicOrdering Ordering, SyncScope::ID SSID=SyncScope::System)
Sets the ordering constraint and the synchronization scope ID of this store instruction.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
static constexpr size_t npos
Definition StringRef.h:58
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition StringRef.h:597
size_t rfind(char C, size_t From=npos) const
Search for the last character C in the string.
Definition StringRef.h:365
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
Definition StringRef.h:290
LLVM_ABI size_t find_first_not_of(char C, size_t From=0) const
Find the first character in the string that is not C or npos if not found.
Used to lazily calculate structure layout information for a target machine, based on the DataLayout s...
Definition DataLayout.h:743
TypeSize getSizeInBytes() const
Definition DataLayout.h:752
LLVM_ABI unsigned getElementContainingOffset(uint64_t FixedOffset) const
Given a valid byte offset into the structure, returns the structure index that contains it.
TypeSize getElementOffset(unsigned Idx) const
Definition DataLayout.h:774
TypeSize getSizeInBits() const
Definition DataLayout.h:754
Class to represent struct types.
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
Definition Type.cpp:467
element_iterator element_end() const
ArrayRef< Type * > elements() const
element_iterator element_begin() const
bool isPacked() const
unsigned getNumElements() const
Random access to the elements.
Type * getElementType(unsigned N) const
Type::subtype_iterator element_iterator
Target - Wrapper for Target specific information.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:339
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM_ABI unsigned getIntegerBitWidth() const
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:277
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
bool isSingleValueType() const
Return true if the type is a valid type for a register in codegen.
Definition Type.h:306
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:297
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:363
bool isStructTy() const
True if this is an instance of StructType.
Definition Type.h:271
bool isTargetExtTy() const
Return true if this is a target extension type.
Definition Type.h:205
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:130
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
Definition Type.h:186
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
Definition Type.h:280
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:252
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:303
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
op_range operands()
Definition User.h:267
op_iterator op_begin()
Definition User.h:259
const Use & getOperandUse(unsigned i) const
Definition User.h:220
Value * getOperand(unsigned i) const
Definition User.h:207
op_iterator op_end()
Definition User.h:261
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
LLVM_ABI bool hasOneUser() const
Return true if there is exactly one user of this value.
Definition Value.cpp:163
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
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:260
LLVM_ABI const Value * stripInBoundsOffsets(function_ref< void(const Value *)> Func=[](const Value *) {}) const
Strip off pointer casts and inbounds GEPs.
Definition Value.cpp:828
LLVM_ABI void dropDroppableUsesIn(User &Usr)
Remove every use of this value in User that can safely be removed.
Definition Value.cpp:215
LLVM_ABI const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr, bool LookThroughIntToPtr=false) const
Accumulate the constant offset this value has compared to a base pointer.
bool use_empty() const
Definition Value.h:348
iterator_range< use_iterator > uses()
Definition Value.h:382
bool hasName() const
Definition Value.h:263
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
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
static VectorType * getWithSizeAndScalar(VectorType *SizeTy, Type *EltTy)
This static method attempts to construct a VectorType with the same size-in-bits as SizeTy but with a...
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr bool isFixed() const
Returns true if the quantity is not scaled by vscale.
Definition TypeSize.h:171
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
Definition ilist_node.h:348
CRTP base class which implements the entire standard iterator facade in terms of a minimal subset of ...
Definition iterator.h:80
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
Changed
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char IsVolatile[]
Key for Kernel::Arg::Metadata::mIsVolatile.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:83
Offsets
Offsets in bytes from the start of the input buffer.
SmallVector< DbgVariableRecord * > getDVRAssignmentMarkers(const Instruction *Inst)
Return a range of dbg_assign records for which Inst performs the assignment they encode.
Definition DebugInfo.h:212
LLVM_ABI void deleteAssignmentMarkers(const Instruction *Inst)
Delete the llvm.dbg.assign intrinsics linked to Inst.
@ DW_OP_LLVM_fragment
Only used in LLVM metadata.
Definition Dwarf.h:144
@ User
could "use" a pointer
NodeAddr< PhiNode * > Phi
Definition RDFGraph.h:390
NodeAddr< UseNode * > Use
Definition RDFGraph.h:385
bool empty() const
Definition BasicBlock.h:101
iterator end() const
Definition BasicBlock.h:89
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
LLVM_ABI iterator begin() const
unsigned getNumElements(Type *Ty)
Definition SLPUtils.cpp:103
This is an optimization pass for GlobalISel generic memory operations.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
@ Offset
Definition DWP.cpp:577
@ Length
Definition DWP.cpp:577
bool operator<(int64_t V1, const APSInt &V2)
Definition APSInt.h:360
void stable_sort(R &&Range)
Definition STLExtras.h:2132
LLVM_ABI bool RemoveRedundantDbgInstrs(BasicBlock *BB)
Try to remove redundant dbg.value instructions from given basic block.
UnaryFunction for_each(R &&Range, UnaryFunction F)
Provide wrappers to std::for_each which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1748
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:1755
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition STLExtras.h:1685
LLVM_ABI void PromoteMemToReg(ArrayRef< AllocaInst * > Allocas, DominatorTree &DT, AssumptionCache *AC=nullptr)
Promote the specified list of alloca instructions into scalar registers, inserting PHI nodes as appro...
LLVM_ABI bool isAssumeLikeIntrinsic(const Instruction *I)
Return true if it is an intrinsic that cannot be speculated but also cannot trap.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2570
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
auto successors(const MachineBasicBlock *BB)
@ Load
The value being inserted comes from a load (InsertElement only).
@ Store
The extracted value is stored (ExtractElement only).
bool operator!=(uint64_t V1, const APInt &V2)
Definition APInt.h:2139
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_ABI std::optional< RegOrConstant > getVectorSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI)
Definition Utils.cpp:1447
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:649
void * PointerTy
Align getLoadStoreAlignment(const Value *I)
A helper function that returns the alignment of load or store instruction.
auto unique(Range &&R, Predicate P)
Definition STLExtras.h:2150
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
LLVM_ABI bool isAllocaPromotable(const AllocaInst *AI)
Return true if this alloca is legal for promotion.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
Definition STLExtras.h:2216
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1762
LLVM_ABI bool isInstructionTriviallyDead(Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction is not used, and the instruction will return.
Definition Local.cpp:406
bool capturesFullProvenance(CaptureComponents CC)
Definition ModRef.h:396
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1652
LLVM_ABI void SplitBlockAndInsertIfThenElse(Value *Cond, BasicBlock::iterator SplitBefore, Instruction **ThenTerm, Instruction **ElseTerm, MDNode *BranchWeights=nullptr, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr)
SplitBlockAndInsertIfThenElse is similar to SplitBlockAndInsertIfThen, but also creates the ElseBlock...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
IRBuilder(LLVMContext &, FolderTy, InserterTy) -> IRBuilder< FolderTy, InserterTy >
LLVM_ABI void initializeSROALegacyPassPass(PassRegistry &)
SmallVector< ValueTypeFromRangeType< R >, Size > to_vector(R &&Range)
Given a range of type R, iterate the entire range and return a SmallVector with elements of the vecto...
LLVM_ABI TinyPtrVector< DbgVariableRecord * > findDVRValues(Value *V)
As above, for DVRValues.
Definition DebugInfo.cpp:82
LLVM_ABI void llvm_unreachable_internal(const char *msg=nullptr, const char *file=nullptr, unsigned line=0)
This function calls abort(), and prints the optional message to stderr.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth, bool MustPreserveProvenance=false)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
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
constexpr int PoisonMaskElem
iterator_range(Container &&) -> iterator_range< llvm::detail::IterOfRange< Container > >
LLVM_ABI BasicBlock * SplitBlockPredecessors(BasicBlock *BB, ArrayRef< BasicBlock * > Preds, const char *Suffix, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, bool PreserveLCSSA=false)
This method introduces at least one new basic block into the function and moves some of the predecess...
LLVM_ABI bool isSafeToLoadUnconditionally(Value *V, Align Alignment, const APInt &Size, const SimplifyQuery &SQ, bool IgnoreFree=false)
Return true if we know that executing a load from this value cannot trap.
Definition Loads.cpp:456
LLVM_ABI bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
DWARFExpression::Operation Op
LLVM_ABI Align tryEnforceAlignment(Value *V, Align PrefAlign, const DataLayout &DL)
If the specified pointer points to an object that we control, try to modify the object's alignment to...
Definition Local.cpp:1513
LLVM_ABI FunctionPass * createSROAPass(bool PreserveCFG=true, bool AggregateToVector=false)
Definition SROA.cpp:6620
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1788
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
Definition Sequence.h:341
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
Definition STLExtras.h:2208
LLVM_ABI TinyPtrVector< DbgVariableRecord * > findDVRDeclares(Value *V)
Finds dbg.declare records declaring local variables as living in the memory that 'V' points to.
Definition DebugInfo.cpp:48
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1963
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:206
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Next
Definition InstrProf.h:147
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition STLExtras.h:2182
LLVM_ABI Instruction * SplitBlockAndInsertIfThen(Value *Cond, BasicBlock::iterator SplitBefore, bool Unreachable, MDNode *BranchWeights=nullptr, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, BasicBlock *ThenBlock=nullptr)
Split the containing block at the specified instruction - everything before SplitBefore stays in the ...
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
@ End
Run the machine verifier once, at the end of the pipeline.
Definition CodeGen.h:267
LLVM_ABI llvm::SmallVector< int, 16 > createSequentialMask(unsigned Start, unsigned NumInts, unsigned NumUndefs)
Create a sequential shuffle mask.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#define NDEBUG
Definition regutils.h:48
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:774
AAMDNodes shift(size_t Offset) const
Create a new AAMDNode that describes this AAMDNode after applying a constant offset to the start of t...
Definition Metadata.h:833
LLVM_ABI AAMDNodes adjustForAccess(unsigned AccessSize)
Create a new AAMDNode for accessing AccessSize bytes of this AAMDNode.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Describes an element of a Bitfield.
Definition Bitfields.h:176
static Bitfield::Type get(StorageType Packed)
Unpacks the field from the Packed value.
Definition Bitfields.h:207
static void set(StorageType &Packed, typename Bitfield::Type Value)
Sets the typed value in the provided Packed value.
Definition Bitfields.h:223