LLVM 24.0.0git
CoroFrame.cpp
Go to the documentation of this file.
1//===- CoroFrame.cpp - Builds and manipulates coroutine frame -------------===//
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// This file contains classes used to discover if for a particular value
9// its definition precedes and its uses follow a suspend block. This is
10// referred to as a suspend crossing value.
11//
12// Using the information discovered we form a Coroutine Frame structure to
13// contain those values. All uses of those values are replaced with appropriate
14// GEP + load from the coroutine frame. At the point of the definition we spill
15// the value into the coroutine frame.
16//===----------------------------------------------------------------------===//
17
18#include "CoroInternal.h"
19#include "llvm/ADT/ScopeExit.h"
22#include "llvm/IR/DIBuilder.h"
23#include "llvm/IR/DebugInfo.h"
24#include "llvm/IR/Dominators.h"
25#include "llvm/IR/IRBuilder.h"
28#include "llvm/IR/LLVMContext.h"
29#include "llvm/IR/MDBuilder.h"
30#include "llvm/IR/Module.h"
33#include "llvm/Support/Debug.h"
43#include <algorithm>
44#include <optional>
45
46using namespace llvm;
47
48namespace llvm {
50}
51
52#define DEBUG_TYPE "coro-frame"
53
54namespace {
55class FrameTypeBuilder;
56// Mapping from the to-be-spilled value to all the users that need reload.
57struct FrameDataInfo {
58 // All the values (that are not allocas) that needs to be spilled to the
59 // frame.
60 coro::SpillInfo &Spills;
61 // Allocas contains all values defined as allocas that need to live in the
62 // frame.
64
65 FrameDataInfo(coro::SpillInfo &Spills,
67 : Spills(Spills), Allocas(Allocas) {}
68
69 SmallVector<Value *, 8> getAllDefs() const {
71 for (const auto &P : Spills)
72 Defs.push_back(P.first);
73 for (const auto &A : Allocas)
74 Defs.push_back(A.Alloca);
75 return Defs;
76 }
77
78 uint32_t getFieldIndex(Value *V) const {
79 auto Itr = FieldIndexMap.find(V);
80 assert(Itr != FieldIndexMap.end() &&
81 "Value does not have a frame field index");
82 return Itr->second;
83 }
84
85 void setFieldIndex(Value *V, uint32_t Index) {
86 assert(FieldIndexMap.count(V) == 0 &&
87 "Cannot set the index for the same field twice.");
88 FieldIndexMap[V] = Index;
89 }
90
91 Align getAlign(Value *V) const {
92 auto Iter = FieldAlignMap.find(V);
93 assert(Iter != FieldAlignMap.end());
94 return Iter->second;
95 }
96
97 void setAlign(Value *V, Align AL) {
98 assert(FieldAlignMap.count(V) == 0);
99 FieldAlignMap.insert({V, AL});
100 }
101
102 uint64_t getDynamicAlign(Value *V) const {
103 auto Iter = FieldDynamicAlignMap.find(V);
104 assert(Iter != FieldDynamicAlignMap.end());
105 return Iter->second;
106 }
107
108 void setDynamicAlign(Value *V, uint64_t Align) {
109 assert(FieldDynamicAlignMap.count(V) == 0);
110 FieldDynamicAlignMap.insert({V, Align});
111 }
112
113 uint64_t getOffset(Value *V) const {
114 auto Iter = FieldOffsetMap.find(V);
115 assert(Iter != FieldOffsetMap.end());
116 return Iter->second;
117 }
118
119 void setOffset(Value *V, uint64_t Offset) {
120 assert(FieldOffsetMap.count(V) == 0);
121 FieldOffsetMap.insert({V, Offset});
122 }
123
124 // Update field offset and alignment information from FrameTypeBuilder.
125 void updateLayoutInfo(FrameTypeBuilder &B);
126
127private:
128 // Map from values to their slot indexes on the frame (insertion order).
129 DenseMap<Value *, uint32_t> FieldIndexMap;
130 // Map from values to their alignment on the frame. They would be set after
131 // the frame is built.
132 DenseMap<Value *, Align> FieldAlignMap;
133 DenseMap<Value *, uint64_t> FieldDynamicAlignMap;
134 // Map from values to their offset on the frame. They would be set after
135 // the frame is built.
136 DenseMap<Value *, uint64_t> FieldOffsetMap;
137};
138} // namespace
139
140#ifndef NDEBUG
141static void dumpSpills(StringRef Title, const coro::SpillInfo &Spills) {
142 dbgs() << "------------- " << Title << " --------------\n";
143 for (const auto &E : Spills) {
144 E.first->dump();
145 dbgs() << " user: ";
146 for (auto *I : E.second)
147 I->dump();
148 }
149}
150
152 dbgs() << "------------- Allocas --------------\n";
153 for (const auto &A : Allocas) {
154 A.Alloca->dump();
155 }
156}
157#endif
158
159namespace {
160using FieldIDType = size_t;
161// We cannot rely solely on natural alignment of a type when building a
162// coroutine frame and if the alignment specified on the Alloca instruction
163// differs from the natural alignment of the alloca type we will need to insert
164// padding.
165class FrameTypeBuilder {
166private:
167 struct Field {
171 uint64_t DynamicAlignBuffer;
172 };
173
174 const DataLayout &DL;
175 uint64_t StructSize = 0;
176 Align StructAlign;
177 bool IsFinished = false;
178
179 std::optional<Align> MaxFrameAlignment;
180
182 DenseMap<Value*, unsigned> FieldIndexByKey;
183
184public:
185 FrameTypeBuilder(const DataLayout &DL, std::optional<Align> MaxFrameAlignment)
186 : DL(DL), MaxFrameAlignment(MaxFrameAlignment) {}
187
188 /// Add a field to this structure for the storage of an `alloca`
189 /// instruction.
190 [[nodiscard]] FieldIDType addFieldForAlloca(AllocaInst *AI,
191 bool IsHeader = false) {
192 auto Size = AI->getAllocationSize(AI->getDataLayout());
193 if (!Size || !Size->isFixed())
195 "Coroutines cannot handle non static or vscale allocas yet");
196 return addField(Size->getFixedValue(), AI->getAlign(), IsHeader);
197 }
198
199 /// We want to put the allocas whose lifetime-ranges are not overlapped
200 /// into one slot of coroutine frame.
201 /// Consider the example at:https://bugs.llvm.org/show_bug.cgi?id=45566
202 ///
203 /// cppcoro::task<void> alternative_paths(bool cond) {
204 /// if (cond) {
205 /// big_structure a;
206 /// process(a);
207 /// co_await something();
208 /// } else {
209 /// big_structure b;
210 /// process2(b);
211 /// co_await something();
212 /// }
213 /// }
214 ///
215 /// We want to put variable a and variable b in the same slot to
216 /// reduce the size of coroutine frame.
217 ///
218 /// This function use StackLifetime algorithm to partition the AllocaInsts in
219 /// Spills to non-overlapped sets in order to put Alloca in the same
220 /// non-overlapped set into the same slot in the Coroutine Frame. Then add
221 /// field for the allocas in the same non-overlapped set by using the largest
222 /// type as the field type.
223 ///
224 /// Side Effects: Because We sort the allocas, the order of allocas in the
225 /// frame may be different with the order in the source code.
226 void addFieldForAllocas(const Function &F, FrameDataInfo &FrameData,
227 coro::Shape &Shape, bool OptimizeFrame);
228
229 /// Add a field to this structure for a spill.
230 [[nodiscard]] FieldIDType addField(Type *Ty, MaybeAlign MaybeFieldAlignment,
231 bool IsHeader = false,
232 bool IsSpillOfValue = false) {
233 assert(Ty && "must provide a type for a field");
234 // The field size is the alloc size of the type.
235 uint64_t FieldSize = DL.getTypeAllocSize(Ty);
236 // The field alignment is usually the type alignment.
237 // But if we are spilling values we don't need to worry about ABI alignment
238 // concerns.
239 Align ABIAlign = DL.getABITypeAlign(Ty);
240 Align TyAlignment = ABIAlign;
241 if (IsSpillOfValue && MaxFrameAlignment && *MaxFrameAlignment < ABIAlign)
242 TyAlignment = *MaxFrameAlignment;
243 Align FieldAlignment = MaybeFieldAlignment.value_or(TyAlignment);
244 return addField(FieldSize, FieldAlignment, IsHeader);
245 }
246
247 /// Add a field to this structure.
248 [[nodiscard]] FieldIDType addField(uint64_t FieldSize, Align FieldAlignment,
249 bool IsHeader = false) {
250 assert(!IsFinished && "adding fields to a finished builder");
251
252 // For an alloca with size=0, we don't need to add a field and they
253 // can just point to any index in the frame. Use index 0.
254 if (FieldSize == 0)
255 return 0;
256
257 // The field alignment could be bigger than the max frame case, in that case
258 // we request additional storage to be able to dynamically align the
259 // pointer.
260 uint64_t DynamicAlignBuffer = 0;
261 if (MaxFrameAlignment && (FieldAlignment > *MaxFrameAlignment)) {
262 DynamicAlignBuffer =
263 offsetToAlignment(MaxFrameAlignment->value(), FieldAlignment);
264 FieldAlignment = *MaxFrameAlignment;
265 FieldSize = FieldSize + DynamicAlignBuffer;
266 }
267
268 // Lay out header fields immediately.
270 if (IsHeader) {
271 Offset = alignTo(StructSize, FieldAlignment);
272 StructSize = Offset + FieldSize;
273
274 // Everything else has a flexible offset.
275 } else {
277 }
278
279 Fields.push_back({FieldSize, Offset, FieldAlignment, DynamicAlignBuffer});
280 return Fields.size() - 1;
281 }
282
283 /// Finish the layout and compute final size and alignment.
284 void finish();
285
286 uint64_t getStructSize() const {
287 assert(IsFinished && "not yet finished!");
288 return StructSize;
289 }
290
291 Align getStructAlign() const {
292 assert(IsFinished && "not yet finished!");
293 return StructAlign;
294 }
295
296 Field getLayoutField(FieldIDType Id) const {
297 assert(IsFinished && "not yet finished!");
298 return Fields[Id];
299 }
300};
301} // namespace
302
303void FrameDataInfo::updateLayoutInfo(FrameTypeBuilder &B) {
304 auto Updater = [&](Value *I) {
305 uint32_t FieldIndex = getFieldIndex(I);
306 auto Field = B.getLayoutField(FieldIndex);
307 setAlign(I, Field.Alignment);
308 uint64_t dynamicAlign =
309 Field.DynamicAlignBuffer
310 ? Field.DynamicAlignBuffer + Field.Alignment.value()
311 : 0;
312 setDynamicAlign(I, dynamicAlign);
313 setOffset(I, Field.Offset);
314 };
315 for (auto &S : Spills)
316 Updater(S.first);
317 for (const auto &A : Allocas)
318 Updater(A.Alloca);
319}
320
321void FrameTypeBuilder::addFieldForAllocas(const Function &F,
322 FrameDataInfo &FrameData,
323 coro::Shape &Shape,
324 bool OptimizeFrame) {
325 using AllocaSetType = SmallVector<AllocaInst *, 4>;
326 SmallVector<AllocaSetType, 4> NonOverlapedAllocas;
327
328 // We need to add field for allocas at the end of this function.
329 llvm::scope_exit AddFieldForAllocasAtExit([&]() {
330 for (auto AllocaList : NonOverlapedAllocas) {
331 auto *LargestAI = *AllocaList.begin();
332 FieldIDType Id = addFieldForAlloca(LargestAI);
333 for (auto *Alloca : AllocaList)
334 FrameData.setFieldIndex(Alloca, Id);
335 }
336 });
337
338 if (!OptimizeFrame) {
339 for (const auto &A : FrameData.Allocas) {
340 AllocaInst *Alloca = A.Alloca;
341 NonOverlapedAllocas.emplace_back(AllocaSetType(1, Alloca));
342 }
343 return;
344 }
345
346 // Because there are paths from the lifetime.start to coro.end
347 // for each alloca, the liferanges for every alloca is overlaped
348 // in the blocks who contain coro.end and the successor blocks.
349 // So we choose to skip there blocks when we calculate the liferange
350 // for each alloca. It should be reasonable since there shouldn't be uses
351 // in these blocks and the coroutine frame shouldn't be used outside the
352 // coroutine body.
353 //
354 // Note that the user of coro.suspend may not be SwitchInst. However, this
355 // case seems too complex to handle. And it is harmless to skip these
356 // patterns since it just prevend putting the allocas to live in the same
357 // slot.
358 DenseMap<SwitchInst *, BasicBlock *> DefaultSuspendDest;
359 for (auto *CoroSuspendInst : Shape.CoroSuspends) {
360 for (auto *U : CoroSuspendInst->users()) {
361 if (auto *ConstSWI = dyn_cast<SwitchInst>(U)) {
362 auto *SWI = const_cast<SwitchInst *>(ConstSWI);
363 DefaultSuspendDest[SWI] = SWI->getDefaultDest();
364 SWI->setDefaultDest(SWI->getSuccessor(1));
365 }
366 }
367 }
368
369 auto ExtractAllocas = [&]() {
370 AllocaSetType Allocas;
371 Allocas.reserve(FrameData.Allocas.size());
372 for (const auto &A : FrameData.Allocas)
373 Allocas.push_back(A.Alloca);
374 return Allocas;
375 };
376 StackLifetime StackLifetimeAnalyzer(F, ExtractAllocas(),
377 StackLifetime::LivenessType::May);
378 StackLifetimeAnalyzer.run();
379 auto DoAllocasInterfere = [&](const AllocaInst *AI1, const AllocaInst *AI2) {
380 return StackLifetimeAnalyzer.getLiveRange(AI1).overlaps(
381 StackLifetimeAnalyzer.getLiveRange(AI2));
382 };
383 auto GetAllocaSize = [&](const coro::AllocaInfo &A) {
384 std::optional<TypeSize> RetSize = A.Alloca->getAllocationSize(DL);
385 assert(RetSize && "Variable Length Arrays (VLA) are not supported.\n");
386 assert(!RetSize->isScalable() && "Scalable vectors are not yet supported");
387 return RetSize->getFixedValue();
388 };
389 // Put larger allocas in the front. So the larger allocas have higher
390 // priority to merge, which can save more space potentially. Also each
391 // AllocaSet would be ordered. So we can get the largest Alloca in one
392 // AllocaSet easily.
393 sort(FrameData.Allocas, [&](const auto &Iter1, const auto &Iter2) {
394 return GetAllocaSize(Iter1) > GetAllocaSize(Iter2);
395 });
396 for (const auto &A : FrameData.Allocas) {
397 AllocaInst *Alloca = A.Alloca;
398 bool Merged = false;
399 // Try to find if the Alloca does not interfere with any existing
400 // NonOverlappedAllocaSet. If it is true, insert the alloca to that
401 // NonOverlappedAllocaSet.
402 for (auto &AllocaSet : NonOverlapedAllocas) {
403 assert(!AllocaSet.empty() && "Processing Alloca Set is not empty.\n");
404 bool NoInterference = none_of(AllocaSet, [&](auto Iter) {
405 return DoAllocasInterfere(Alloca, Iter);
406 });
407 // If the alignment of A is multiple of the alignment of B, the address
408 // of A should satisfy the requirement for aligning for B.
409 //
410 // There may be other more fine-grained strategies to handle the alignment
411 // infomation during the merging process. But it seems hard to handle
412 // these strategies and benefit little.
413 bool Alignable = [&]() -> bool {
414 auto *LargestAlloca = *AllocaSet.begin();
415 return LargestAlloca->getAlign().value() % Alloca->getAlign().value() ==
416 0;
417 }();
418 bool CouldMerge = NoInterference && Alignable;
419 if (!CouldMerge)
420 continue;
421 AllocaSet.push_back(Alloca);
422 Merged = true;
423 break;
424 }
425 if (!Merged) {
426 NonOverlapedAllocas.emplace_back(AllocaSetType(1, Alloca));
427 }
428 }
429 // Recover the default target destination for each Switch statement
430 // reserved.
431 for (auto SwitchAndDefaultDest : DefaultSuspendDest) {
432 SwitchInst *SWI = SwitchAndDefaultDest.first;
433 BasicBlock *DestBB = SwitchAndDefaultDest.second;
434 SWI->setDefaultDest(DestBB);
435 }
436 // This Debug Info could tell us which allocas are merged into one slot.
437 LLVM_DEBUG(for (auto &AllocaSet
438 : NonOverlapedAllocas) {
439 if (AllocaSet.size() > 1) {
440 dbgs() << "In Function:" << F.getName() << "\n";
441 dbgs() << "Find Union Set "
442 << "\n";
443 dbgs() << "\tAllocas are \n";
444 for (auto Alloca : AllocaSet)
445 dbgs() << "\t\t" << *Alloca << "\n";
446 }
447 });
448}
449
450void FrameTypeBuilder::finish() {
451 assert(!IsFinished && "already finished!");
452
453 // Prepare the optimal-layout field array.
454 // The Id in the layout field is a pointer to our Field for it.
456 LayoutFields.reserve(Fields.size());
457 for (auto &Field : Fields) {
458 LayoutFields.emplace_back(&Field, Field.Size, Field.Alignment,
459 Field.Offset);
460 }
461
462 // Perform layout to compute size, alignment, and field offsets.
463 auto SizeAndAlign = performOptimizedStructLayout(LayoutFields);
464 StructSize = SizeAndAlign.first;
465 StructAlign = SizeAndAlign.second;
466
467 auto getField = [](const OptimizedStructLayoutField &LayoutField) -> Field & {
468 return *static_cast<Field *>(const_cast<void*>(LayoutField.Id));
469 };
470
471 // Update field offsets from the computed layout.
472 for (auto &LayoutField : LayoutFields) {
473 auto &F = getField(LayoutField);
474 F.Offset = LayoutField.Offset;
475 }
476
477 IsFinished = true;
478}
479
480static void cacheDIVar(FrameDataInfo &FrameData,
482 for (auto *V : FrameData.getAllDefs()) {
483 if (DIVarCache.contains(V))
484 continue;
485
486 auto CacheIt = [&DIVarCache, V](const auto &Container) {
487 auto *I = llvm::find_if(Container, [](auto *DDI) {
488 return DDI->getExpression()->getNumElements() == 0;
489 });
490 if (I != Container.end())
491 DIVarCache.insert({V, (*I)->getVariable()});
492 };
493 CacheIt(findDVRDeclares(V));
494 CacheIt(findDVRDeclareValues(V));
495 }
496}
497
498/// Create name for Type. It uses MDString to store new created string to
499/// avoid memory leak.
501 if (Ty->isIntegerTy()) {
502 // The longest name in common may be '__int_128', which has 9 bits.
503 SmallString<16> Buffer;
504 raw_svector_ostream OS(Buffer);
505 OS << "__int_" << cast<IntegerType>(Ty)->getBitWidth();
506 auto *MDName = MDString::get(Ty->getContext(), OS.str());
507 return MDName->getString();
508 }
509
510 if (Ty->isFloatingPointTy()) {
511 if (Ty->isFloatTy())
512 return "__float_";
513 if (Ty->isDoubleTy())
514 return "__double_";
515 return "__floating_type_";
516 }
517
518 if (Ty->isPointerTy())
519 return "PointerType";
520
521 if (Ty->isStructTy()) {
522 if (!cast<StructType>(Ty)->hasName())
523 return "__LiteralStructType_";
524
525 auto Name = Ty->getStructName();
526
527 SmallString<16> Buffer(Name);
528 for (auto &Iter : Buffer)
529 if (Iter == '.' || Iter == ':')
530 Iter = '_';
531 auto *MDName = MDString::get(Ty->getContext(), Buffer.str());
532 return MDName->getString();
533 }
534
535 return "UnknownType";
536}
537
538static DIType *solveDIType(DIBuilder &Builder, Type *Ty,
539 const DataLayout &Layout, DIScope *Scope,
540 unsigned LineNum,
541 DenseMap<Type *, DIType *> &DITypeCache) {
542 if (DIType *DT = DITypeCache.lookup(Ty))
543 return DT;
544
545 StringRef Name = solveTypeName(Ty);
546
547 DIType *RetType = nullptr;
548
549 if (Ty->isIntegerTy()) {
550 auto BitWidth = cast<IntegerType>(Ty)->getBitWidth();
551 RetType = Builder.createBasicType(Name, BitWidth, dwarf::DW_ATE_signed,
552 llvm::DINode::FlagArtificial);
553 } else if (Ty->isFloatingPointTy()) {
554 RetType = Builder.createBasicType(Name, Layout.getTypeSizeInBits(Ty),
555 dwarf::DW_ATE_float,
556 llvm::DINode::FlagArtificial);
557 } else if (Ty->isPointerTy()) {
558 // Construct PointerType points to null (aka void *) instead of exploring
559 // pointee type to avoid infinite search problem. For example, we would be
560 // in trouble if we traverse recursively:
561 //
562 // struct Node {
563 // Node* ptr;
564 // };
565 RetType =
566 Builder.createPointerType(nullptr, Layout.getTypeSizeInBits(Ty),
567 Layout.getABITypeAlign(Ty).value() * CHAR_BIT,
568 /*DWARFAddressSpace=*/std::nullopt, Name);
569 } else if (Ty->isStructTy()) {
570 auto *DIStruct = Builder.createStructType(
571 Scope, Name, Scope->getFile(), LineNum, Layout.getTypeSizeInBits(Ty),
572 Layout.getPrefTypeAlign(Ty).value() * CHAR_BIT,
573 llvm::DINode::FlagArtificial, nullptr, llvm::DINodeArray());
574
575 auto *StructTy = cast<StructType>(Ty);
577 for (unsigned I = 0; I < StructTy->getNumElements(); I++) {
578 DIType *DITy = solveDIType(Builder, StructTy->getElementType(I), Layout,
579 DIStruct, LineNum, DITypeCache);
580 assert(DITy);
581 Elements.push_back(Builder.createMemberType(
582 DIStruct, DITy->getName(), DIStruct->getFile(), LineNum,
583 DITy->getSizeInBits(), DITy->getAlignInBits(),
584 Layout.getStructLayout(StructTy)->getElementOffsetInBits(I),
585 llvm::DINode::FlagArtificial, DITy));
586 }
587
588 Builder.replaceArrays(DIStruct, Builder.getOrCreateArray(Elements));
589
590 RetType = DIStruct;
591 } else {
592 LLVM_DEBUG(dbgs() << "Unresolved Type: " << *Ty << "\n");
593 TypeSize Size = Layout.getTypeSizeInBits(Ty);
594 auto *CharSizeType = Builder.createBasicType(
595 Name, 8, dwarf::DW_ATE_unsigned_char, llvm::DINode::FlagArtificial);
596
597 if (Size <= 8)
598 RetType = CharSizeType;
599 else {
600 if (Size % 8 != 0)
601 Size = TypeSize::getFixed(Size + 8 - (Size % 8));
602
603 RetType = Builder.createArrayType(
604 Size, Layout.getPrefTypeAlign(Ty).value(), CharSizeType,
605 Builder.getOrCreateArray(Builder.getOrCreateSubrange(0, Size / 8)));
606 }
607 }
608
609 DITypeCache.insert({Ty, RetType});
610 return RetType;
611}
612
613/// Build artificial debug info for C++ coroutine frames to allow users to
614/// inspect the contents of the frame directly
615///
616/// Create Debug information for coroutine frame with debug name "__coro_frame".
617/// The debug information for the fields of coroutine frame is constructed from
618/// the following way:
619/// 1. For all the value in the Frame, we search the use of dbg.declare to find
620/// the corresponding debug variables for the value. If we can find the
621/// debug variable, we can get full and accurate debug information.
622/// 2. If we can't get debug information in step 1 and 2, we could only try to
623/// build the DIType by Type. We did this in solveDIType. We only handle
624/// integer, float, double, integer type and struct type for now.
626 FrameDataInfo &FrameData) {
627 DISubprogram *DIS = F.getSubprogram();
628 // If there is no DISubprogram for F, it implies the function is compiled
629 // without debug info. So we also don't generate debug info for the frame.
630
631 if (!DIS || !DIS->getUnit())
632 return;
633
635 DIS->getUnit()->getSourceLanguage().getUnversionedName())) ||
636 DIS->getUnit()->getEmissionKind() !=
638 return;
639
640 assert(Shape.ABI == coro::ABI::Switch &&
641 "We could only build debug infomation for C++ coroutine now.\n");
642
643 DIBuilder DBuilder(*F.getParent(), /*AllowUnresolved*/ false);
644
645 DIFile *DFile = DIS->getFile();
646 unsigned LineNum = DIS->getLine();
647
648 DICompositeType *FrameDITy = DBuilder.createStructType(
649 DIS->getUnit(), Twine(F.getName() + ".coro_frame_ty").str(), DFile,
650 LineNum, Shape.FrameSize * 8, Shape.FrameAlign.value() * 8,
651 llvm::DINode::FlagArtificial, nullptr, llvm::DINodeArray());
653 DataLayout Layout = F.getDataLayout();
654
656 cacheDIVar(FrameData, DIVarCache);
657
658 // This counter is used to avoid same type names. e.g., there would be
659 // many i32 and i64 types in one coroutine. And we would use i32_0 and
660 // i32_1 to avoid the same type. Since it makes no sense the name of the
661 // fields confilicts with each other.
662 unsigned UnknownTypeNum = 0;
663 DenseMap<Type *, DIType *> DITypeCache;
664
665 auto addElement = [&](StringRef Name, uint64_t SizeInBits, uint64_t Alignment,
666 uint64_t Offset, DIType *DITy) {
667 Elements.push_back(DBuilder.createMemberType(
668 FrameDITy, Name, DFile, LineNum, SizeInBits, Alignment, Offset * 8,
669 llvm::DINode::FlagArtificial, DITy));
670 };
671
672 auto addDIDef = [&](Value *V) {
673 // Get the offset and alignment for this value.
674 uint64_t Offset = FrameData.getOffset(V);
675 Align Alignment = FrameData.getAlign(V);
676
677 std::string Name;
678 uint64_t SizeInBits;
679 DIType *DITy = nullptr;
680
681 auto It = DIVarCache.find(V);
682 if (It != DIVarCache.end()) {
683 // Get the type from the debug variable.
684 Name = It->second->getName().str();
685 DITy = It->second->getType();
686 } else {
687 if (auto AI = dyn_cast<AllocaInst>(V)) {
688 // Frame alloca
689 DITy = solveDIType(DBuilder, AI->getAllocatedType(), Layout, FrameDITy,
690 LineNum, DITypeCache);
691 } else {
692 // Spill
693 DITy = solveDIType(DBuilder, V->getType(), Layout, FrameDITy, LineNum,
694 DITypeCache);
695 }
696 assert(DITy && "SolveDIType shouldn't return nullptr.\n");
697 Name = DITy->getName().str();
698 Name += "_" + std::to_string(UnknownTypeNum);
699 UnknownTypeNum++;
700 }
701
702 if (auto AI = dyn_cast<AllocaInst>(V)) {
703 // Lookup the total size of this alloca originally
704 auto Size = AI->getAllocationSize(Layout);
705 assert(Size && Size->isFixed() &&
706 "unreachable due to addFieldForAlloca checks");
707 SizeInBits = Size->getFixedValue() * 8;
708 } else {
709 // Compute the size of the active data of this member for this spill
710 SizeInBits = Layout.getTypeSizeInBits(V->getType());
711 }
712
713 addElement(Name, SizeInBits, Alignment.value() * 8, Offset, DITy);
714 };
715
716 // For Switch ABI, add debug info for the added fields (resume, destroy).
717 if (Shape.ABI == coro::ABI::Switch) {
718 auto *FnPtrTy = Shape.getSwitchResumePointerType();
719 uint64_t PtrSize = Layout.getPointerSizeInBits(FnPtrTy->getAddressSpace());
720 uint64_t PtrAlign =
721 Layout.getPointerABIAlignment(FnPtrTy->getAddressSpace()).value() * 8;
722 auto *DIPtr = DBuilder.createPointerType(nullptr, PtrSize,
723 FnPtrTy->getAddressSpace());
724 addElement("__resume_fn", PtrSize, PtrAlign, 0, DIPtr);
725 addElement("__destroy_fn", PtrSize, PtrAlign,
726 Shape.SwitchLowering.DestroyOffset, DIPtr);
727 uint64_t IndexSize =
729 addElement("__coro_index", IndexSize, Shape.SwitchLowering.IndexAlign * 8,
731 DBuilder.createBasicType("__coro_index",
732 (IndexSize < 8) ? 8 : IndexSize,
733 dwarf::DW_ATE_unsigned_char));
734 }
735 auto Defs = FrameData.getAllDefs();
736 for (auto *V : Defs)
737 addDIDef(V);
738
739 DBuilder.replaceArrays(FrameDITy, DBuilder.getOrCreateArray(Elements));
740
741 auto *FrameDIVar =
742 DBuilder.createAutoVariable(DIS, "__coro_frame", DFile, LineNum,
743 FrameDITy, true, DINode::FlagArtificial);
744
745 // Subprogram would have ContainedNodes field which records the debug
746 // variables it contained. So we need to add __coro_frame to the
747 // ContainedNodes of it.
748 //
749 // If we don't add __coro_frame to the RetainedNodes, user may get
750 // `no symbol __coro_frame in context` rather than `__coro_frame`
751 // is optimized out, which is more precise.
752 DIS->retainNodes(&FrameDIVar, &FrameDIVar + 1);
753
754 // Construct the location for the frame debug variable. The column number
755 // is fake but it should be fine.
756 DILocation *DILoc =
757 DILocation::get(DIS->getContext(), LineNum, /*Column=*/1, DIS);
758 assert(FrameDIVar->isValidLocationForIntrinsic(DILoc));
759
760 DbgVariableRecord *NewDVR =
761 new DbgVariableRecord(ValueAsMetadata::get(Shape.FramePtr), FrameDIVar,
762 DBuilder.createExpression(), DILoc,
765 It->getParent()->insertDbgRecordBefore(NewDVR, It);
766}
767
768// If there is memory accessing to promise alloca before CoroBegin
770 coro::Shape &Shape) {
771 auto *PA = Shape.SwitchLowering.PromiseAlloca;
772 return llvm::any_of(PA->uses(), [&](Use &U) {
773 auto *Inst = dyn_cast<Instruction>(U.getUser());
774 if (!Inst || DT.dominates(Shape.CoroBegin, Inst))
775 return false;
776
777 if (auto *CI = dyn_cast<CallInst>(Inst)) {
778 // It is fine if the call wouldn't write to the Promise.
779 // This is possible for @llvm.coro.id intrinsics, which
780 // would take the promise as the second argument as a
781 // marker.
782 if (CI->onlyReadsMemory() || CI->onlyReadsMemory(CI->getArgOperandNo(&U)))
783 return false;
784 return true;
785 }
786
787 return isa<StoreInst>(Inst) ||
788 // It may take too much time to track the uses.
789 // Be conservative about the case the use may escape.
791 // There would always be a bitcast for the promise alloca
792 // before we enabled Opaque pointers. And now given
793 // opaque pointers are enabled by default. This should be
794 // fine.
795 isa<BitCastInst>(Inst);
796 });
797}
798// Build the coroutine frame type as a byte array.
799// The frame layout includes:
800// - Resume function pointer at offset 0 (Switch ABI only)
801// - Destroy function pointer at offset ptrsize (Switch ABI only)
802// - Promise alloca (Switch ABI only, only if present)
803// - Suspend/Resume index
804// - Spilled values and allocas
805static void buildFrameLayout(Function &F, const DominatorTree &DT,
806 coro::Shape &Shape, FrameDataInfo &FrameData,
807 bool OptimizeFrame) {
808 const DataLayout &DL = F.getDataLayout();
809
810 // We will use this value to cap the alignment of spilled values.
811 std::optional<Align> MaxFrameAlignment;
812 if (Shape.ABI == coro::ABI::Async)
813 MaxFrameAlignment = Shape.AsyncLowering.getContextAlignment();
814 FrameTypeBuilder B(DL, MaxFrameAlignment);
815
816 AllocaInst *PromiseAlloca = Shape.getPromiseAlloca();
817 std::optional<FieldIDType> SwitchIndexFieldId;
818 IntegerType *SwitchIndexType = nullptr;
819
820 if (Shape.ABI == coro::ABI::Switch) {
821 auto *FnPtrTy = Shape.getSwitchResumePointerType();
822
823 // Add header fields for the resume and destroy functions.
824 // We can rely on these being perfectly packed.
825 (void)B.addField(FnPtrTy, MaybeAlign(), /*header*/ true);
826 (void)B.addField(FnPtrTy, MaybeAlign(), /*header*/ true);
827
828 // PromiseAlloca field needs to be explicitly added here because it's
829 // a header field with a fixed offset based on its alignment. Hence it
830 // needs special handling.
831 if (PromiseAlloca)
832 FrameData.setFieldIndex(
833 PromiseAlloca, B.addFieldForAlloca(PromiseAlloca, /*header*/ true));
834
835 // Add a field to store the suspend index. This doesn't need to
836 // be in the header.
837 unsigned IndexBits = std::max(1U, Log2_64_Ceil(Shape.CoroSuspends.size()));
838 Type *LegalTy =
839 F.getDataLayout().getSmallestLegalIntType(F.getContext(), IndexBits);
840 SwitchIndexType = LegalTy ? cast<IntegerType>(LegalTy)
841 : Type::getIntNTy(F.getContext(), IndexBits);
842
843 SwitchIndexFieldId = B.addField(SwitchIndexType, MaybeAlign());
844 } else {
845 assert(PromiseAlloca == nullptr && "lowering doesn't support promises");
846 }
847
848 // Because multiple allocas may own the same field slot,
849 // we add allocas to field here.
850 B.addFieldForAllocas(F, FrameData, Shape, OptimizeFrame);
851 // Add PromiseAlloca to Allocas list so that
852 // 1. updateLayoutIndex could update its index after
853 // `performOptimizedStructLayout`
854 // 2. it is processed in insertSpills.
855 if (Shape.ABI == coro::ABI::Switch && PromiseAlloca) {
856 // We assume that no alias will be create before CoroBegin.
857 FrameData.Allocas.emplace_back(
858 PromiseAlloca, SmallMapVector<Instruction *, std::optional<APInt>, 4>{},
859 hasAccessingPromiseBeforeCB(DT, Shape));
860 }
861 // Create an entry for every spilled value.
862 for (auto &S : FrameData.Spills) {
863 Type *FieldType = S.first->getType();
864 MaybeAlign MA;
865 // For byval arguments, we need to store the pointed value in the frame,
866 // instead of the pointer itself.
867 if (const Argument *A = dyn_cast<Argument>(S.first)) {
868 if (A->hasByValAttr()) {
869 FieldType = A->getParamByValType();
870 MA = A->getParamAlign();
871 }
872 }
873 FieldIDType Id =
874 B.addField(FieldType, MA, false /*header*/, true /*IsSpillOfValue*/);
875 FrameData.setFieldIndex(S.first, Id);
876 }
877
878 B.finish();
879
880 FrameData.updateLayoutInfo(B);
881 Shape.FrameAlign = B.getStructAlign();
882 Shape.FrameSize = B.getStructSize();
883
884 switch (Shape.ABI) {
885 case coro::ABI::Switch: {
886 // In the switch ABI, remember the function pointer and index field info.
887 // Resume and Destroy function pointers are in the frame header.
888 const DataLayout &DL = F.getDataLayout();
889 Shape.SwitchLowering.DestroyOffset = DL.getPointerSize();
890
891 auto IndexField = B.getLayoutField(*SwitchIndexFieldId);
892 Shape.SwitchLowering.IndexType = SwitchIndexType;
893 Shape.SwitchLowering.IndexAlign = IndexField.Alignment.value();
894 Shape.SwitchLowering.IndexOffset = IndexField.Offset;
895
896 // Also round the frame size up to a multiple of its alignment, as is
897 // generally expected in C/C++.
898 Shape.FrameSize = alignTo(Shape.FrameSize, Shape.FrameAlign);
899 break;
900 }
901
902 // In the retcon ABI, remember whether the frame is inline in the storage.
905 auto Id = Shape.getRetconCoroId();
907 = (B.getStructSize() <= Id->getStorageSize() &&
908 B.getStructAlign() <= Id->getStorageAlignment());
909 break;
910 }
911 case coro::ABI::Async: {
914 // Also make the final context size a multiple of the context alignment to
915 // make allocation easier for allocators.
919 if (Shape.AsyncLowering.getContextAlignment() < Shape.FrameAlign) {
921 "The alignment requirment of frame variables cannot be higher than "
922 "the alignment of the async function context");
923 }
924 break;
925 }
926 }
927}
928
929/// If MaybeArgument is a byval Argument, return its byval type. Also removes
930/// the captures attribute, so that the argument *value* may be stored directly
931/// on the coroutine frame.
932static Type *extractByvalIfArgument(Value *MaybeArgument) {
933 if (auto *Arg = dyn_cast<Argument>(MaybeArgument)) {
934 Arg->getParent()->removeParamAttr(Arg->getArgNo(), Attribute::Captures);
935
936 if (Arg->hasByValAttr())
937 return Arg->getParamByValType();
938 }
939 return nullptr;
940}
941
942/// Store Def into the coroutine frame.
943static void createStoreIntoFrame(IRBuilder<> &Builder, Value *Def,
944 Type *ByValTy, const coro::Shape &Shape,
945 const FrameDataInfo &FrameData) {
946 uint64_t Offset = FrameData.getOffset(Def);
947
948 Value *G = Shape.FramePtr;
949 if (Offset != 0) {
950 G = Builder.CreatePtrAddWithUnsignedOffset(
951 G, Offset, Def->getName() + Twine(".spill.addr"),
953 }
954 auto SpillAlignment = Align(FrameData.getAlign(Def));
955
956 // For byval arguments, copy the pointed-to value to the frame.
957 if (ByValTy) {
958 auto &DL = Builder.getDataLayout();
959 auto Size = DL.getTypeStoreSize(ByValTy);
960 // Def is a pointer to the byval argument
961 Builder.CreateMemCpy(G, SpillAlignment, Def, SpillAlignment, Size);
962 } else {
963 Builder.CreateAlignedStore(Def, G, SpillAlignment);
964 }
965}
966
967/// Returns a pointer into the coroutine frame at the offset where Orig is
968/// located.
969static Value *createGEPToFramePointer(const FrameDataInfo &FrameData,
970 IRBuilder<> &Builder, coro::Shape &Shape,
971 Value *Orig) {
972 uint64_t Offset = FrameData.getOffset(Orig);
973 Value *Ptr = Builder.CreatePtrAddWithUnsignedOffset(
975
976 if (auto *AI = dyn_cast<AllocaInst>(Orig)) {
977 if (FrameData.getDynamicAlign(Orig) != 0) {
978 assert(FrameData.getDynamicAlign(Orig) == AI->getAlign().value());
979 auto *M = AI->getModule();
980 auto *IntPtrTy = M->getDataLayout().getIntPtrType(AI->getType());
981 auto *PtrValue = Builder.CreatePtrToInt(Ptr, IntPtrTy);
982 auto *AlignMask = ConstantInt::get(IntPtrTy, AI->getAlign().value() - 1);
983 PtrValue = Builder.CreateAdd(PtrValue, AlignMask);
984 PtrValue = Builder.CreateAnd(PtrValue, Builder.CreateNot(AlignMask));
985 return Builder.CreateIntToPtr(PtrValue, AI->getType());
986 }
987 // If the type of Ptr is not equal to the type of AllocaInst, it implies
988 // that the AllocaInst may be reused in the Frame slot of other AllocaInst.
989 // Note: If the strategy dealing with alignment changes, this cast must be
990 // refined
991 if (Ptr->getType() != Orig->getType())
992 Ptr = Builder.CreateAddrSpaceCast(Ptr, Orig->getType(),
993 Orig->getName() + Twine(".cast"));
994 }
995 return Ptr;
996}
997
998/// Find dbg.declare or dbg.declare_value records referencing `Def`. If none are
999/// found, walk up the load chain to find one.
1000template <DbgVariableRecord::LocationType record_type>
1001static TinyPtrVector<DbgVariableRecord *>
1003 static_assert(record_type == DbgVariableRecord::LocationType::Declare ||
1005 constexpr auto FindFunc =
1009
1010 TinyPtrVector<DbgVariableRecord *> Records = FindFunc(Def);
1011
1012 if (!F.getSubprogram())
1013 return Records;
1014
1015 Value *CurDef = Def;
1016 while (Records.empty() && isa<LoadInst>(CurDef)) {
1017 auto *LdInst = cast<LoadInst>(CurDef);
1018 if (!LdInst->getType()->isPointerTy())
1019 break;
1020 CurDef = LdInst->getPointerOperand();
1021 if (!isa<AllocaInst, LoadInst>(CurDef))
1022 break;
1023 Records = FindFunc(CurDef);
1024 }
1025
1026 return Records;
1027}
1028
1029// Helper function to handle allocas that may be accessed before CoroBegin.
1030// This creates a memcpy from the original alloca to the coroutine frame after
1031// CoroBegin, ensuring the frame has the correct initial values.
1032static void handleAccessBeforeCoroBegin(const FrameDataInfo &FrameData,
1033 coro::Shape &Shape,
1034 IRBuilder<> &Builder,
1035 AllocaInst *Alloca) {
1036 Value *Size = Builder.CreateAllocationSize(Builder.getInt64Ty(), Alloca);
1037 auto *G = createGEPToFramePointer(FrameData, Builder, Shape, Alloca);
1038 Builder.CreateMemCpy(G, FrameData.getAlign(Alloca), Alloca,
1039 Alloca->getAlign(), Size);
1040}
1041
1042// Replace all alloca and SSA values that are accessed across suspend points
1043// with GetElementPointer from coroutine frame + loads and stores. Create an
1044// AllocaSpillBB that will become the new entry block for the resume parts of
1045// the coroutine:
1046//
1047// %hdl = coro.begin(...)
1048// whatever
1049//
1050// becomes:
1051//
1052// %hdl = coro.begin(...)
1053// br label %AllocaSpillBB
1054//
1055// AllocaSpillBB:
1056// ; geps corresponding to allocas that were moved to coroutine frame
1057// br label PostSpill
1058//
1059// PostSpill:
1060// whatever
1061//
1062//
1063static void insertSpills(const FrameDataInfo &FrameData, coro::Shape &Shape) {
1064 LLVMContext &C = Shape.CoroBegin->getContext();
1065 Function *F = Shape.CoroBegin->getFunction();
1066 IRBuilder<> Builder(*F->getParent());
1067 DominatorTree DT(*F);
1069
1070 MDBuilder MDB(C);
1071 // Create a TBAA tag for accesses to certain coroutine frame slots, so that
1072 // subsequent alias analysis will understand they do not intersect with
1073 // user memory.
1074 // We do this only if a suitable TBAA root already exists in the module.
1075 MDNode *TBAATag = nullptr;
1076 if (auto *CppTBAAStr = MDString::getIfExists(C, "Simple C++ TBAA")) {
1077 auto *TBAARoot = MDNode::getIfExists(C, CppTBAAStr);
1078 // Create a "fake" scalar type; all other types defined in the source
1079 // language will be assumed non-aliasing with this type.
1080 MDNode *Scalar = MDB.createTBAAScalarTypeNode(
1081 (F->getName() + ".Frame Slot").str(), TBAARoot);
1082 TBAATag = MDB.createTBAAStructTagNode(Scalar, Scalar, 0);
1083 }
1084 for (auto const &E : FrameData.Spills) {
1085 Value *Def = E.first;
1086 Type *ByValTy = extractByvalIfArgument(Def);
1087
1088 Builder.SetInsertPoint(coro::getSpillInsertionPt(Shape, Def, DT));
1089 createStoreIntoFrame(Builder, Def, ByValTy, Shape, FrameData);
1090
1091 BasicBlock *CurrentBlock = nullptr;
1092 Value *CurrentReload = nullptr;
1093 for (auto *U : E.second) {
1094 // If we have not seen the use block, create a load instruction to reload
1095 // the spilled value from the coroutine frame. Populates the Value pointer
1096 // reference provided with the frame GEP.
1097 if (CurrentBlock != U->getParent()) {
1098 CurrentBlock = U->getParent();
1099 Builder.SetInsertPoint(CurrentBlock->getFirstInsertionPt());
1100
1101 auto *GEP = createGEPToFramePointer(FrameData, Builder, Shape, E.first);
1102 GEP->setName(E.first->getName() + Twine(".reload.addr"));
1103 if (ByValTy) {
1104 CurrentReload = GEP;
1105 } else {
1106 auto SpillAlignment = Align(FrameData.getAlign(Def));
1107 auto *LI =
1108 Builder.CreateAlignedLoad(E.first->getType(), GEP, SpillAlignment,
1109 E.first->getName() + Twine(".reload"));
1110 if (TBAATag)
1111 LI->setMetadata(LLVMContext::MD_tbaa, TBAATag);
1112 CurrentReload = LI;
1113 }
1114
1117
1118 auto SalvageOne = [&](DbgVariableRecord *DDI) {
1119 // This dbg.declare is preserved for all coro-split function
1120 // fragments. It will be unreachable in the main function, and
1121 // processed by coro::salvageDebugInfo() by the Cloner.
1123 ValueAsMetadata::get(CurrentReload), DDI->getVariable(),
1124 DDI->getExpression(), DDI->getDebugLoc(),
1126 Builder.GetInsertPoint()->getParent()->insertDbgRecordBefore(
1127 NewDVR, Builder.GetInsertPoint());
1128 // This dbg.declare is for the main function entry point. It
1129 // will be deleted in all coro-split functions.
1130 coro::salvageDebugInfo(ArgToAllocaMap, *DDI, false /*UseEntryValue*/);
1131 };
1132 for_each(DVRs, SalvageOne);
1133 }
1134
1135 TinyPtrVector<DbgVariableRecord *> DVRDeclareValues =
1138
1139 auto SalvageOneCoro = [&](auto *DDI) {
1140 // This dbg.declare_value is preserved for all coro-split function
1141 // fragments. It will be unreachable in the main function, and
1142 // processed by coro::salvageDebugInfo() by the Cloner. However, convert
1143 // it to a dbg.declare to make sure future passes don't have to deal
1144 // with a dbg.declare_value.
1145 auto *VAM = ValueAsMetadata::get(CurrentReload);
1146 Type *Ty = VAM->getValue()->getType();
1147 // If the metadata type is not a pointer, emit a dbg.value instead.
1149 ValueAsMetadata::get(CurrentReload), DDI->getVariable(),
1150 DDI->getExpression(), DDI->getDebugLoc(),
1153 Builder.GetInsertPoint()->getParent()->insertDbgRecordBefore(
1154 NewDVR, Builder.GetInsertPoint());
1155 // This dbg.declare_value is for the main function entry point. It
1156 // will be deleted in all coro-split functions.
1157 coro::salvageDebugInfo(ArgToAllocaMap, *DDI, false /*UseEntryValue*/);
1158 };
1159 for_each(DVRDeclareValues, SalvageOneCoro);
1160
1161 // If we have a single edge PHINode, remove it and replace it with a
1162 // reload from the coroutine frame. (We already took care of multi edge
1163 // PHINodes by normalizing them in the rewritePHIs function).
1164 if (auto *PN = dyn_cast<PHINode>(U)) {
1165 assert(PN->getNumIncomingValues() == 1 &&
1166 "unexpected number of incoming "
1167 "values in the PHINode");
1168 PN->replaceAllUsesWith(CurrentReload);
1169 PN->eraseFromParent();
1170 continue;
1171 }
1172
1173 // Replace all uses of CurrentValue in the current instruction with
1174 // reload.
1175 U->replaceUsesOfWith(Def, CurrentReload);
1176 // Instructions are added to Def's user list if the attached
1177 // debug records use Def. Update those now.
1178 for (DbgVariableRecord &DVR : filterDbgVars(U->getDbgRecordRange()))
1179 DVR.replaceVariableLocationOp(Def, CurrentReload, true);
1180 }
1181 }
1182
1183 BasicBlock *FramePtrBB = Shape.getInsertPtAfterFramePtr()->getParent();
1184
1185 auto SpillBlock = FramePtrBB->splitBasicBlock(
1186 Shape.getInsertPtAfterFramePtr(), "AllocaSpillBB");
1187 SpillBlock->splitBasicBlock(&SpillBlock->front(), "PostSpill");
1188 Shape.AllocaSpillBlock = SpillBlock;
1189
1190 // retcon and retcon.once lowering assumes all uses have been sunk.
1191 if (Shape.ABI == coro::ABI::Retcon || Shape.ABI == coro::ABI::RetconOnce ||
1192 Shape.ABI == coro::ABI::Async) {
1193 // If we found any allocas, replace all of their remaining uses with Geps.
1194 Builder.SetInsertPoint(SpillBlock->begin());
1195 for (const auto &P : FrameData.Allocas) {
1196 AllocaInst *Alloca = P.Alloca;
1197 auto *G = createGEPToFramePointer(FrameData, Builder, Shape, Alloca);
1198
1199 // Remove any lifetime intrinsics, now that these are no longer allocas.
1200 for (User *U : make_early_inc_range(Alloca->users())) {
1201 auto *I = cast<Instruction>(U);
1202 if (I->isLifetimeStartOrEnd())
1203 I->eraseFromParent();
1204 }
1205
1206 // We are not using ReplaceInstWithInst(P.first, cast<Instruction>(G))
1207 // here, as we are changing location of the instruction.
1208 G->takeName(Alloca);
1209 Alloca->replaceAllUsesWith(G);
1210 Alloca->eraseFromParent();
1211 }
1212 return;
1213 }
1214
1215 // If we found any alloca, replace all of their remaining uses with GEP
1216 // instructions. To remain debugbility, we replace the uses of allocas for
1217 // dbg.declares and dbg.values with the reload from the frame.
1218 // Note: We cannot replace the alloca with GEP instructions indiscriminately,
1219 // as some of the uses may not be dominated by CoroBegin.
1220 Builder.SetInsertPoint(Shape.AllocaSpillBlock->begin());
1221 SmallVector<Instruction *, 4> UsersToUpdate;
1222 for (const auto &A : FrameData.Allocas) {
1223 AllocaInst *Alloca = A.Alloca;
1224 UsersToUpdate.clear();
1225 for (User *U : make_early_inc_range(Alloca->users())) {
1226 auto *I = cast<Instruction>(U);
1227 // It is meaningless to retain the lifetime intrinsics refer for the
1228 // member of coroutine frames and the meaningless lifetime intrinsics
1229 // are possible to block further optimizations.
1230 if (I->isLifetimeStartOrEnd())
1231 I->eraseFromParent();
1232 else if (DT.dominates(Shape.CoroBegin, I))
1233 UsersToUpdate.push_back(I);
1234 }
1235
1236 if (UsersToUpdate.empty())
1237 continue;
1238 auto *G = createGEPToFramePointer(FrameData, Builder, Shape, Alloca);
1239 G->setName(Alloca->getName() + Twine(".reload.addr"));
1240
1241 SmallVector<DbgVariableRecord *> DbgVariableRecords;
1242 findDbgUsers(Alloca, DbgVariableRecords);
1243 for (auto *DVR : DbgVariableRecords)
1244 DVR->replaceVariableLocationOp(Alloca, G);
1245
1246 for (Instruction *I : UsersToUpdate)
1247 I->replaceUsesOfWith(Alloca, G);
1248
1249 if (Alloca->user_empty())
1250 Alloca->eraseFromParent();
1251 }
1252 Builder.SetInsertPoint(&*Shape.getInsertPtAfterFramePtr());
1253 for (const auto &A : FrameData.Allocas) {
1254 AllocaInst *Alloca = A.Alloca;
1255 if (A.MayWriteBeforeCoroBegin) {
1256 // isEscaped really means potentially modified before CoroBegin.
1257 handleAccessBeforeCoroBegin(FrameData, Shape, Builder, Alloca);
1258 }
1259 // For each alias to Alloca created before CoroBegin but used after
1260 // CoroBegin, we recreate them after CoroBegin by applying the offset
1261 // to the pointer in the frame.
1262 for (const auto &Alias : A.Aliases) {
1263 auto *FramePtr =
1264 createGEPToFramePointer(FrameData, Builder, Shape, Alloca);
1265 auto &Value = *Alias.second;
1266 auto ITy = IntegerType::get(C, Value.getBitWidth());
1267 auto *AliasPtr =
1268 Builder.CreateInBoundsPtrAdd(FramePtr, ConstantInt::get(ITy, Value));
1269 Alias.first->replaceUsesWithIf(
1270 AliasPtr, [&](Use &U) { return DT.dominates(Shape.CoroBegin, U); });
1271 }
1272 }
1273}
1274
1275// Moves the values in the PHIs in SuccBB that correspong to PredBB into a new
1276// PHI in InsertedBB.
1278 BasicBlock *InsertedBB,
1279 BasicBlock *PredBB,
1280 PHINode *UntilPHI = nullptr) {
1281 auto *PN = cast<PHINode>(&SuccBB->front());
1282 do {
1283 int Index = PN->getBasicBlockIndex(InsertedBB);
1284 Value *V = PN->getIncomingValue(Index);
1285 PHINode *InputV = PHINode::Create(
1286 V->getType(), 1, V->getName() + Twine(".") + SuccBB->getName());
1287 InputV->insertBefore(InsertedBB->begin());
1288 InputV->addIncoming(V, PredBB);
1289 PN->setIncomingValue(Index, InputV);
1290 PN = dyn_cast<PHINode>(PN->getNextNode());
1291 } while (PN != UntilPHI);
1292}
1293
1294// Rewrites the PHI Nodes in a cleanuppad.
1295static void rewritePHIsForCleanupPad(BasicBlock *CleanupPadBB,
1296 CleanupPadInst *CleanupPad) {
1297 // For every incoming edge to a CleanupPad we will create a new block holding
1298 // all incoming values in single-value PHI nodes. We will then create another
1299 // block to act as a dispather (as all unwind edges for related EH blocks
1300 // must be the same).
1301 //
1302 // cleanuppad:
1303 // %2 = phi i32[%0, %catchswitch], [%1, %catch.1]
1304 // %3 = cleanuppad within none []
1305 //
1306 // It will create:
1307 //
1308 // cleanuppad.corodispatch
1309 // %2 = phi i8[0, %catchswitch], [1, %catch.1]
1310 // %3 = cleanuppad within none []
1311 // switch i8 % 2, label %unreachable
1312 // [i8 0, label %cleanuppad.from.catchswitch
1313 // i8 1, label %cleanuppad.from.catch.1]
1314 // cleanuppad.from.catchswitch:
1315 // %4 = phi i32 [%0, %catchswitch]
1316 // br %label cleanuppad
1317 // cleanuppad.from.catch.1:
1318 // %6 = phi i32 [%1, %catch.1]
1319 // br %label cleanuppad
1320 // cleanuppad:
1321 // %8 = phi i32 [%4, %cleanuppad.from.catchswitch],
1322 // [%6, %cleanuppad.from.catch.1]
1323
1324 // Unreachable BB, in case switching on an invalid value in the dispatcher.
1325 auto *UnreachBB = BasicBlock::Create(
1326 CleanupPadBB->getContext(), "unreachable", CleanupPadBB->getParent());
1327 IRBuilder<> Builder(UnreachBB);
1328 Builder.CreateUnreachable();
1329
1330 // Create a new cleanuppad which will be the dispatcher.
1331 auto *NewCleanupPadBB =
1332 BasicBlock::Create(CleanupPadBB->getContext(),
1333 CleanupPadBB->getName() + Twine(".corodispatch"),
1334 CleanupPadBB->getParent(), CleanupPadBB);
1335 Builder.SetInsertPoint(NewCleanupPadBB);
1336 auto *SwitchType = Builder.getInt8Ty();
1337 auto *SetDispatchValuePN =
1338 Builder.CreatePHI(SwitchType, pred_size(CleanupPadBB));
1339 CleanupPad->removeFromParent();
1340 CleanupPad->insertAfter(SetDispatchValuePN->getIterator());
1341 auto *SwitchOnDispatch = Builder.CreateSwitch(SetDispatchValuePN, UnreachBB,
1342 pred_size(CleanupPadBB));
1343
1344 int SwitchIndex = 0;
1345 SmallVector<BasicBlock *, 8> Preds(predecessors(CleanupPadBB));
1346 for (BasicBlock *Pred : Preds) {
1347 // Create a new cleanuppad and move the PHI values to there.
1348 auto *CaseBB = BasicBlock::Create(CleanupPadBB->getContext(),
1349 CleanupPadBB->getName() +
1350 Twine(".from.") + Pred->getName(),
1351 CleanupPadBB->getParent(), CleanupPadBB);
1352 updatePhiNodes(CleanupPadBB, Pred, CaseBB);
1353 CaseBB->setName(CleanupPadBB->getName() + Twine(".from.") +
1354 Pred->getName());
1355 Builder.SetInsertPoint(CaseBB);
1356 Builder.CreateBr(CleanupPadBB);
1357 movePHIValuesToInsertedBlock(CleanupPadBB, CaseBB, NewCleanupPadBB);
1358
1359 // Update this Pred to the new unwind point.
1360 setUnwindEdgeTo(Pred->getTerminator(), NewCleanupPadBB);
1361
1362 // Setup the switch in the dispatcher.
1363 auto *SwitchConstant = ConstantInt::get(SwitchType, SwitchIndex);
1364 SetDispatchValuePN->addIncoming(SwitchConstant, Pred);
1365 SwitchOnDispatch->addCase(SwitchConstant, CaseBB);
1366 SwitchIndex++;
1367 }
1368
1370 // Add branch weights to SwitchOnDispatch, where branches are unreachable by
1371 // default. We mark all branches as having equal weights because they are
1372 // mutually exclusive.
1373 MDBuilder MDB(CleanupPadBB->getContext());
1374 SmallVector<uint32_t> Weights;
1375 Weights.push_back(0);
1376 for (int i = 0; i < SwitchIndex; ++i) {
1378 }
1379 SwitchOnDispatch->setMetadata(LLVMContext::MD_prof,
1380 MDB.createBranchWeights(Weights));
1381 }
1382}
1383
1386 for (auto &BB : F) {
1387 for (auto &Phi : BB.phis()) {
1388 if (Phi.getNumIncomingValues() == 1) {
1389 Worklist.push_back(&Phi);
1390 } else
1391 break;
1392 }
1393 }
1394 while (!Worklist.empty()) {
1395 auto *Phi = Worklist.pop_back_val();
1396 auto *OriginalValue = Phi->getIncomingValue(0);
1397 Phi->replaceAllUsesWith(OriginalValue);
1398 }
1399}
1400
1401static void rewritePHIs(BasicBlock &BB) {
1402 // For every incoming edge we will create a block holding all
1403 // incoming values in a single PHI nodes.
1404 //
1405 // loop:
1406 // %n.val = phi i32[%n, %entry], [%inc, %loop]
1407 //
1408 // It will create:
1409 //
1410 // loop.from.entry:
1411 // %n.loop.pre = phi i32 [%n, %entry]
1412 // br %label loop
1413 // loop.from.loop:
1414 // %inc.loop.pre = phi i32 [%inc, %loop]
1415 // br %label loop
1416 //
1417 // After this rewrite, further analysis will ignore any phi nodes with more
1418 // than one incoming edge.
1419
1420 // TODO: Simplify PHINodes in the basic block to remove duplicate
1421 // predecessors.
1422
1423 // Special case for CleanupPad: all EH blocks must have the same unwind edge
1424 // so we need to create an additional "dispatcher" block.
1425 if (!BB.empty()) {
1426 if (auto *CleanupPad =
1429 for (BasicBlock *Pred : Preds) {
1430 if (CatchSwitchInst *CS =
1431 dyn_cast<CatchSwitchInst>(Pred->getTerminator())) {
1432 // CleanupPad with a CatchSwitch predecessor: therefore this is an
1433 // unwind destination that needs to be handle specially.
1434 assert(CS->getUnwindDest() == &BB);
1435 (void)CS;
1436 rewritePHIsForCleanupPad(&BB, CleanupPad);
1437 return;
1438 }
1439 }
1440 }
1441 }
1442
1443 LandingPadInst *LandingPad = nullptr;
1444 PHINode *ReplPHI = nullptr;
1445 if (!BB.empty()) {
1446 if ((LandingPad =
1448 // ehAwareSplitEdge will clone the LandingPad in all the edge blocks.
1449 // We replace the original landing pad with a PHINode that will collect the
1450 // results from all of them.
1451 ReplPHI = PHINode::Create(LandingPad->getType(), 1, "");
1452 ReplPHI->insertBefore(LandingPad->getIterator());
1453 ReplPHI->takeName(LandingPad);
1454 LandingPad->replaceAllUsesWith(ReplPHI);
1455 // We will erase the original landing pad at the end of this function after
1456 // ehAwareSplitEdge cloned it in the transition blocks.
1457 }
1458 }
1459
1461 for (BasicBlock *Pred : Preds) {
1462 auto *IncomingBB = ehAwareSplitEdge(Pred, &BB, LandingPad, ReplPHI);
1463 IncomingBB->setName(BB.getName() + Twine(".from.") + Pred->getName());
1464
1465 // Stop the moving of values at ReplPHI, as this is either null or the PHI
1466 // that replaced the landing pad.
1467 movePHIValuesToInsertedBlock(&BB, IncomingBB, Pred, ReplPHI);
1468 }
1469
1470 if (LandingPad) {
1471 // Calls to ehAwareSplitEdge function cloned the original lading pad.
1472 // No longer need it.
1473 LandingPad->eraseFromParent();
1474 }
1475}
1476
1477static void rewritePHIs(Function &F) {
1479
1480 for (BasicBlock &BB : F)
1481 if (auto *PN = dyn_cast<PHINode>(&BB.front()))
1482 if (PN->getNumIncomingValues() > 1)
1483 WorkList.push_back(&BB);
1484
1485 for (BasicBlock *BB : WorkList)
1486 rewritePHIs(*BB);
1487}
1488
1489// Splits the block at a particular instruction unless it is the first
1490// instruction in the block with a single predecessor.
1492 auto *BB = I->getParent();
1493 if (&BB->front() == I) {
1494 if (BB->getSinglePredecessor()) {
1495 BB->setName(Name);
1496 return BB;
1497 }
1498 }
1499 return BB->splitBasicBlock(I, Name);
1500}
1501
1502// Split above and below a particular instruction so that it
1503// will be all alone by itself in a block.
1504static void splitAround(Instruction *I, const Twine &Name) {
1505 splitBlockIfNotFirst(I, Name);
1506 splitBlockIfNotFirst(I->getNextNode(), "After" + Name);
1507}
1508
1509/// After we split the coroutine, will the given basic block be along
1510/// an obvious exit path for the resumption function?
1512 unsigned depth = 3) {
1513 // If we've bottomed out our depth count, stop searching and assume
1514 // that the path might loop back.
1515 if (depth == 0) return false;
1516
1517 // If this is a suspend block, we're about to exit the resumption function.
1518 if (coro::isSuspendBlock(BB))
1519 return true;
1520
1521 // Recurse into the successors.
1522 for (auto *Succ : successors(BB)) {
1523 if (!willLeaveFunctionImmediatelyAfter(Succ, depth - 1))
1524 return false;
1525 }
1526
1527 // If none of the successors leads back in a loop, we're on an exit/abort.
1528 return true;
1529}
1530
1532 // Look for a free that isn't sufficiently obviously followed by
1533 // either a suspend or a termination, i.e. something that will leave
1534 // the coro resumption frame.
1535 for (auto *U : AI->users()) {
1536 auto FI = dyn_cast<CoroAllocaFreeInst>(U);
1537 if (!FI) continue;
1538
1539 if (!willLeaveFunctionImmediatelyAfter(FI->getParent()))
1540 return true;
1541 }
1542
1543 // If we never found one, we don't need a stack save.
1544 return false;
1545}
1546
1547/// Turn each of the given local allocas into a normal (dynamic) alloca
1548/// instruction.
1550 SmallVectorImpl<Instruction*> &DeadInsts) {
1551 for (auto *AI : LocalAllocas) {
1552 IRBuilder<> Builder(AI);
1553
1554 // Save the stack depth. Try to avoid doing this if the stackrestore
1555 // is going to immediately precede a return or something.
1556 Value *StackSave = nullptr;
1558 StackSave = Builder.CreateStackSave();
1559
1560 // Allocate memory.
1561 auto Alloca = Builder.CreateAlloca(Builder.getInt8Ty(), AI->getSize());
1562 Alloca->setAlignment(AI->getAlignment());
1563
1564 for (auto *U : AI->users()) {
1565 // Replace gets with the allocation.
1566 if (isa<CoroAllocaGetInst>(U)) {
1567 U->replaceAllUsesWith(Alloca);
1568
1569 // Replace frees with stackrestores. This is safe because
1570 // alloca.alloc is required to obey a stack discipline, although we
1571 // don't enforce that structurally.
1572 } else {
1573 auto FI = cast<CoroAllocaFreeInst>(U);
1574 if (StackSave) {
1575 Builder.SetInsertPoint(FI);
1576 Builder.CreateStackRestore(StackSave);
1577 }
1578 }
1579 DeadInsts.push_back(cast<Instruction>(U));
1580 }
1581
1582 DeadInsts.push_back(AI);
1583 }
1584}
1585
1586/// Get the current swifterror value.
1588 coro::Shape &Shape) {
1589 // Make a fake function pointer as a sort of intrinsic.
1590 auto FnTy = FunctionType::get(ValueTy, {}, false);
1591 auto Fn = ConstantPointerNull::get(Builder.getPtrTy());
1592
1593 auto Call = Builder.CreateCall(FnTy, Fn, {});
1594 Shape.SwiftErrorOps.push_back(Call);
1595
1596 return Call;
1597}
1598
1599/// Set the given value as the current swifterror value.
1600///
1601/// Returns a slot that can be used as a swifterror slot.
1603 coro::Shape &Shape) {
1604 // Make a fake function pointer as a sort of intrinsic.
1605 auto FnTy = FunctionType::get(Builder.getPtrTy(),
1606 {V->getType()}, false);
1607 auto Fn = ConstantPointerNull::get(Builder.getPtrTy());
1608
1609 auto Call = Builder.CreateCall(FnTy, Fn, { V });
1610 Shape.SwiftErrorOps.push_back(Call);
1611
1612 return Call;
1613}
1614
1615/// Set the swifterror value from the given alloca before a call,
1616/// then put in back in the alloca afterwards.
1617///
1618/// Returns an address that will stand in for the swifterror slot
1619/// until splitting.
1621 AllocaInst *Alloca,
1622 coro::Shape &Shape) {
1623 auto ValueTy = Alloca->getAllocatedType();
1624 IRBuilder<> Builder(Call);
1625
1626 // Load the current value from the alloca and set it as the
1627 // swifterror value.
1628 auto ValueBeforeCall = Builder.CreateLoad(ValueTy, Alloca);
1629 auto Addr = emitSetSwiftErrorValue(Builder, ValueBeforeCall, Shape);
1630
1631 // Move to after the call. Since swifterror only has a guaranteed
1632 // value on normal exits, we can ignore implicit and explicit unwind
1633 // edges.
1634 if (isa<CallInst>(Call)) {
1635 Builder.SetInsertPoint(Call->getNextNode());
1636 } else {
1637 auto Invoke = cast<InvokeInst>(Call);
1638 Builder.SetInsertPoint(
1639 Invoke->getNormalDest()->getFirstNonPHIOrPseudoProbe());
1640 }
1641
1642 // Get the current swifterror value and store it to the alloca.
1643 auto ValueAfterCall = emitGetSwiftErrorValue(Builder, ValueTy, Shape);
1644 Builder.CreateStore(ValueAfterCall, Alloca);
1645
1646 return Addr;
1647}
1648
1649/// Eliminate a formerly-swifterror alloca by inserting the get/set
1650/// intrinsics and attempting to MemToReg the alloca away.
1652 coro::Shape &Shape) {
1653 for (Use &Use : llvm::make_early_inc_range(Alloca->uses())) {
1654 // swifterror values can only be used in very specific ways.
1655 // We take advantage of that here.
1656 auto User = Use.getUser();
1658 continue;
1659
1661 auto Call = cast<Instruction>(User);
1662
1663 auto Addr = emitSetAndGetSwiftErrorValueAround(Call, Alloca, Shape);
1664
1665 // Use the returned slot address as the call argument.
1666 Use.set(Addr);
1667 }
1668
1669 // All the uses should be loads and stores now.
1670 assert(isAllocaPromotable(Alloca));
1671}
1672
1673/// "Eliminate" a swifterror argument by reducing it to the alloca case
1674/// and then loading and storing in the prologue and epilog.
1675///
1676/// The argument keeps the swifterror flag.
1678 coro::Shape &Shape,
1679 SmallVectorImpl<AllocaInst*> &AllocasToPromote) {
1680 IRBuilder<> Builder(F.getEntryBlock().getFirstNonPHIOrPseudoProbe());
1681
1682 auto ArgTy = cast<PointerType>(Arg.getType());
1683 auto ValueTy = PointerType::getUnqual(F.getContext());
1684
1685 // Reduce to the alloca case:
1686
1687 // Create an alloca and replace all uses of the arg with it.
1688 auto Alloca = Builder.CreateAlloca(ValueTy, ArgTy->getAddressSpace());
1689 Arg.replaceAllUsesWith(Alloca);
1690
1691 // Set an initial value in the alloca. swifterror is always null on entry.
1692 auto InitialValue = Constant::getNullValue(ValueTy);
1693 Builder.CreateStore(InitialValue, Alloca);
1694
1695 // Find all the suspends in the function and save and restore around them.
1696 for (auto *Suspend : Shape.CoroSuspends) {
1697 (void) emitSetAndGetSwiftErrorValueAround(Suspend, Alloca, Shape);
1698 }
1699
1700 // Find all the coro.ends in the function and restore the error value.
1701 for (auto *End : Shape.CoroEnds) {
1702 Builder.SetInsertPoint(End);
1703 auto FinalValue = Builder.CreateLoad(ValueTy, Alloca);
1704 (void) emitSetSwiftErrorValue(Builder, FinalValue, Shape);
1705 }
1706
1707 // Now we can use the alloca logic.
1708 AllocasToPromote.push_back(Alloca);
1709 eliminateSwiftErrorAlloca(F, Alloca, Shape);
1710}
1711
1712/// Eliminate all problematic uses of swifterror arguments and allocas
1713/// from the function. We'll fix them up later when splitting the function.
1715 SmallVector<AllocaInst*, 4> AllocasToPromote;
1716
1717 // Look for a swifterror argument.
1718 for (auto &Arg : F.args()) {
1719 if (!Arg.hasSwiftErrorAttr()) continue;
1720
1721 eliminateSwiftErrorArgument(F, Arg, Shape, AllocasToPromote);
1722 break;
1723 }
1724
1725 // Look for swifterror allocas.
1726 for (auto &Inst : F.getEntryBlock()) {
1727 auto Alloca = dyn_cast<AllocaInst>(&Inst);
1728 if (!Alloca || !Alloca->isSwiftError()) continue;
1729
1730 // Clear the swifterror flag.
1731 Alloca->setSwiftError(false);
1732
1733 AllocasToPromote.push_back(Alloca);
1734 eliminateSwiftErrorAlloca(F, Alloca, Shape);
1735 }
1736
1737 // If we have any allocas to promote, compute a dominator tree and
1738 // promote them en masse.
1739 if (!AllocasToPromote.empty()) {
1740 DominatorTree DT(F);
1741 PromoteMemToReg(AllocasToPromote, DT);
1742 }
1743}
1744
1745/// For each local variable that all of its user are only used inside one of
1746/// suspended region, we sink their lifetime.start markers to the place where
1747/// after the suspend block. Doing so minimizes the lifetime of each variable,
1748/// hence minimizing the amount of data we end up putting on the frame.
1750 SuspendCrossingInfo &Checker,
1751 const DominatorTree &DT) {
1752 if (F.hasOptNone())
1753 return;
1754
1755 // Collect all possible basic blocks which may dominate all uses of allocas.
1757 DomSet.insert(&F.getEntryBlock());
1758 for (auto *CSI : Shape.CoroSuspends) {
1759 BasicBlock *SuspendBlock = CSI->getParent();
1760 assert(coro::isSuspendBlock(SuspendBlock) &&
1761 SuspendBlock->getSingleSuccessor() &&
1762 "should have split coro.suspend into its own block");
1763 DomSet.insert(SuspendBlock->getSingleSuccessor());
1764 }
1765
1766 for (Instruction &I : instructions(F)) {
1768 if (!AI)
1769 continue;
1770
1771 for (BasicBlock *DomBB : DomSet) {
1772 bool Valid = true;
1774
1775 auto isLifetimeStart = [](Instruction* I) {
1776 if (auto* II = dyn_cast<IntrinsicInst>(I))
1777 return II->getIntrinsicID() == Intrinsic::lifetime_start;
1778 return false;
1779 };
1780
1781 auto collectLifetimeStart = [&](Instruction *U, AllocaInst *AI) {
1782 if (isLifetimeStart(U)) {
1783 Lifetimes.push_back(U);
1784 return true;
1785 }
1786 if (!U->hasOneUse() || U->stripPointerCasts() != AI)
1787 return false;
1788 if (isLifetimeStart(U->user_back())) {
1789 Lifetimes.push_back(U->user_back());
1790 return true;
1791 }
1792 return false;
1793 };
1794
1795 for (User *U : AI->users()) {
1797 // For all users except lifetime.start markers, if they are all
1798 // dominated by one of the basic blocks and do not cross
1799 // suspend points as well, then there is no need to spill the
1800 // instruction.
1801 if (!DT.dominates(DomBB, UI->getParent()) ||
1802 Checker.isDefinitionAcrossSuspend(DomBB, UI)) {
1803 // Skip lifetime.start, GEP and bitcast used by lifetime.start
1804 // markers.
1805 if (collectLifetimeStart(UI, AI))
1806 continue;
1807 Valid = false;
1808 break;
1809 }
1810 }
1811 // Sink lifetime.start markers to dominate block when they are
1812 // only used outside the region.
1813 if (Valid && Lifetimes.size() != 0) {
1814 auto *NewLifetime = Lifetimes[0]->clone();
1815 NewLifetime->replaceUsesOfWith(NewLifetime->getOperand(0), AI);
1816 NewLifetime->insertBefore(DomBB->getTerminator()->getIterator());
1817
1818 // All the outsided lifetime.start markers are no longer necessary.
1819 for (Instruction *S : Lifetimes)
1820 S->eraseFromParent();
1821
1822 break;
1823 }
1824 }
1825 }
1826}
1827
1828static std::optional<std::pair<Value &, DIExpression &>>
1830 bool UseEntryValue, Function *F, Value *Storage,
1831 DIExpression *Expr, bool SkipOutermostLoad) {
1832 auto InsertPt = F->getEntryBlock().getFirstInsertionPt();
1833 while (isa<IntrinsicInst>(InsertPt))
1834 ++InsertPt;
1835 IRBuilder<> Builder(InsertPt);
1836
1837 while (auto *Inst = dyn_cast_or_null<Instruction>(Storage)) {
1838 if (auto *LdInst = dyn_cast<LoadInst>(Inst)) {
1839 Storage = LdInst->getPointerOperand();
1840 // FIXME: This is a heuristic that works around the fact that
1841 // LLVM IR debug intrinsics cannot yet distinguish between
1842 // memory and value locations: Because a dbg.declare(alloca) is
1843 // implicitly a memory location no DW_OP_deref operation for the
1844 // last direct load from an alloca is necessary. This condition
1845 // effectively drops the *last* DW_OP_deref in the expression.
1846 if (!SkipOutermostLoad)
1848 } else if (auto *StInst = dyn_cast<StoreInst>(Inst)) {
1849 Storage = StInst->getValueOperand();
1850 } else {
1852 SmallVector<Value *, 0> AdditionalValues;
1854 *Inst, Expr ? Expr->getNumLocationOperands() : 0, Ops,
1855 AdditionalValues);
1856 if (!Op || !AdditionalValues.empty()) {
1857 // If salvaging failed or salvaging produced more than one location
1858 // operand, give up.
1859 break;
1860 }
1861 Storage = Op;
1862 Expr = DIExpression::appendOpsToArg(Expr, Ops, 0, /*StackValue*/ false);
1863 }
1864 SkipOutermostLoad = false;
1865 }
1866 if (!Storage)
1867 return std::nullopt;
1868
1869 auto *StorageAsArg = dyn_cast<Argument>(Storage);
1870
1871 const bool IsSingleLocationExpression = Expr->isSingleLocationExpression();
1872 // Use an EntryValue when requested (UseEntryValue) for swift async Arguments.
1873 // Entry values in variadic expressions are not supported.
1874 const bool WillUseEntryValue =
1875 UseEntryValue && StorageAsArg &&
1876 StorageAsArg->hasAttribute(Attribute::SwiftAsync) &&
1877 !Expr->isEntryValue() && IsSingleLocationExpression;
1878
1879 if (WillUseEntryValue)
1881
1882 // If the coroutine frame is an Argument, store it in an alloca to improve
1883 // its availability (e.g. registers may be clobbered).
1884 // Avoid this if the value is guaranteed to be available through other means
1885 // (e.g. swift ABI guarantees).
1886 // Avoid this if multiple location expressions are involved, as LLVM does not
1887 // know how to prepend a deref in this scenario.
1888 if (StorageAsArg && !WillUseEntryValue && IsSingleLocationExpression) {
1889 auto &Cached = ArgToAllocaMap[StorageAsArg];
1890 if (!Cached) {
1891 Cached = Builder.CreateAlloca(Storage->getType(), 0, nullptr,
1892 Storage->getName() + ".debug");
1893 Builder.CreateStore(Storage, Cached);
1894 }
1895 Storage = Cached;
1896 // FIXME: LLVM lacks nuanced semantics to differentiate between
1897 // memory and direct locations at the IR level. The backend will
1898 // turn a dbg.declare(alloca, ..., DIExpression()) into a memory
1899 // location. Thus, if there are deref and offset operations in the
1900 // expression, we need to add a DW_OP_deref at the *start* of the
1901 // expression to first load the contents of the alloca before
1902 // adjusting it with the expression.
1904 }
1905
1906 Expr = Expr->foldConstantMath();
1907 return {{*Storage, *Expr}};
1908}
1909
1912 DbgVariableRecord &DVR, bool UseEntryValue) {
1913
1914 Function *F = DVR.getFunction();
1915 // Follow the pointer arithmetic all the way to the incoming
1916 // function argument and convert into a DIExpression.
1917 bool SkipOutermostLoad = DVR.isDbgDeclare() || DVR.isDbgDeclareValue();
1918 Value *OriginalStorage = DVR.getVariableLocationOp(0);
1919
1920 auto SalvagedInfo =
1921 ::salvageDebugInfoImpl(ArgToAllocaMap, UseEntryValue, F, OriginalStorage,
1922 DVR.getExpression(), SkipOutermostLoad);
1923 if (!SalvagedInfo)
1924 return;
1925
1926 Value *Storage = &SalvagedInfo->first;
1927 DIExpression *Expr = &SalvagedInfo->second;
1928
1929 DVR.replaceVariableLocationOp(OriginalStorage, Storage);
1930 DVR.setExpression(Expr);
1931 // We only hoist dbg.declare and dbg.declare_value today since it doesn't make
1932 // sense to hoist dbg.value since it does not have the same function wide
1933 // guarantees that dbg.declare does.
1936 std::optional<BasicBlock::iterator> InsertPt;
1937 if (auto *I = dyn_cast<Instruction>(Storage)) {
1938 InsertPt = I->getInsertionPointAfterDef();
1939 // Update DILocation only if variable was not inlined.
1940 DebugLoc ILoc = I->getDebugLoc();
1941 DebugLoc DVRLoc = DVR.getDebugLoc();
1942 if (ILoc && DVRLoc &&
1943 DVRLoc->getScope()->getSubprogram() ==
1944 ILoc->getScope()->getSubprogram())
1945 DVR.setDebugLoc(ILoc);
1946 } else if (isa<Argument>(Storage))
1947 InsertPt = F->getEntryBlock().begin();
1948 if (InsertPt) {
1949 DVR.removeFromParent();
1950 // If there is a dbg.declare_value being reinserted, insert it as a
1951 // dbg.declare instead, so that subsequent passes don't have to deal with
1952 // a dbg.declare_value.
1954 auto *MD = DVR.getRawLocation();
1955 if (auto *VAM = dyn_cast<ValueAsMetadata>(MD)) {
1956 Type *Ty = VAM->getValue()->getType();
1957 if (Ty->isPointerTy())
1959 else
1961 }
1962 }
1963 (*InsertPt)->getParent()->insertDbgRecordBefore(&DVR, *InsertPt);
1964 }
1965 }
1966}
1967
1970 // Don't eliminate swifterror in async functions that won't be split.
1971 if (Shape.ABI != coro::ABI::Async || !Shape.CoroSuspends.empty())
1973
1974 if (Shape.ABI == coro::ABI::Switch &&
1977 }
1978
1979 // Make sure that all coro.save, coro.suspend and the fallthrough coro.end
1980 // intrinsics are in their own blocks to simplify the logic of building up
1981 // SuspendCrossing data.
1982 for (auto *CSI : Shape.CoroSuspends) {
1983 if (auto *Save = CSI->getCoroSave())
1984 splitAround(Save, "CoroSave");
1985 splitAround(CSI, "CoroSuspend");
1986 }
1987
1988 // Put CoroEnds into their own blocks.
1989 for (AnyCoroEndInst *CE : Shape.CoroEnds) {
1990 splitAround(CE, "CoroEnd");
1991
1992 // Emit the musttail call function in a new block before the CoroEnd.
1993 // We do this here so that the right suspend crossing info is computed for
1994 // the uses of the musttail call function call. (Arguments to the coro.end
1995 // instructions would be ignored)
1996 if (auto *AsyncEnd = dyn_cast<CoroAsyncEndInst>(CE)) {
1997 auto *MustTailCallFn = AsyncEnd->getMustTailCallFunction();
1998 if (!MustTailCallFn)
1999 continue;
2000 IRBuilder<> Builder(AsyncEnd);
2001 SmallVector<Value *, 8> Args(AsyncEnd->args());
2002 auto Arguments = ArrayRef<Value *>(Args).drop_front(3);
2004 AsyncEnd->getDebugLoc(), MustTailCallFn, TTI, Arguments, Builder);
2005 splitAround(Call, "MustTailCall.Before.CoroEnd");
2006 }
2007 }
2008
2009 // Later code makes structural assumptions about single predecessors phis e.g
2010 // that they are not live across a suspend point.
2012
2013 // Transforms multi-edge PHI Nodes, so that any value feeding into a PHI will
2014 // never have its definition separated from the PHI by the suspend point.
2015 rewritePHIs(F);
2016}
2017
2018void coro::BaseABI::buildCoroutineFrame(bool OptimizeFrame) {
2019 SuspendCrossingInfo Checker(F, Shape);
2021
2022 const DominatorTree DT(F);
2023 if (Shape.ABI != coro::ABI::Async && Shape.ABI != coro::ABI::Retcon &&
2025 sinkLifetimeStartMarkers(F, Shape, Checker, DT);
2026
2027 // All values (that are not allocas) that needs to be spilled to the frame.
2028 coro::SpillInfo Spills;
2029 // All values defined as allocas that need to live in the frame.
2031
2032 // Collect the spills for arguments and other not-materializable values.
2033 coro::collectSpillsFromArgs(Spills, F, Checker);
2034 SmallVector<Instruction *, 4> DeadInstructions;
2036 coro::collectSpillsAndAllocasFromInsts(Spills, Allocas, DeadInstructions,
2037 LocalAllocas, F, Checker, DT, Shape);
2038 coro::collectSpillsFromDbgInfo(Spills, F, Checker);
2039
2040 LLVM_DEBUG(dumpAllocas(Allocas));
2041 LLVM_DEBUG(dumpSpills("Spills", Spills));
2042
2043 if (Shape.ABI == coro::ABI::Retcon || Shape.ABI == coro::ABI::RetconOnce ||
2044 Shape.ABI == coro::ABI::Async)
2045 sinkSpillUsesAfterCoroBegin(DT, Shape.CoroBegin, Spills, Allocas);
2046
2047 // Build frame layout
2048 FrameDataInfo FrameData(Spills, Allocas);
2049 buildFrameLayout(F, DT, Shape, FrameData, OptimizeFrame);
2050 Shape.FramePtr = Shape.CoroBegin;
2051 // For now, this works for C++ programs only.
2052 buildFrameDebugInfo(F, Shape, FrameData);
2053 // Insert spills and reloads
2054 insertSpills(FrameData, Shape);
2055 lowerLocalAllocas(LocalAllocas, DeadInstructions);
2056
2057 for (auto *I : DeadInstructions)
2058 I->eraseFromParent();
2059}
SDValue Pred
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
uint64_t uint64_t
AMDGPU Lower Kernel Arguments
Rewrite undef for false bool rewritePHIs(Function &F, UniformityInfo &UA, DominatorTree *DT)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static void cleanupSinglePredPHIs(Function &F)
static TinyPtrVector< DbgVariableRecord * > findDbgRecordsThroughLoads(Function &F, Value *Def)
Find dbg.declare or dbg.declare_value records referencing Def.
static void createStoreIntoFrame(IRBuilder<> &Builder, Value *Def, Type *ByValTy, const coro::Shape &Shape, const FrameDataInfo &FrameData)
Store Def into the coroutine frame.
static void eliminateSwiftError(Function &F, coro::Shape &Shape)
Eliminate all problematic uses of swifterror arguments and allocas from the function.
static void lowerLocalAllocas(ArrayRef< CoroAllocaAllocInst * > LocalAllocas, SmallVectorImpl< Instruction * > &DeadInsts)
Turn each of the given local allocas into a normal (dynamic) alloca instruction.
static Value * emitSetSwiftErrorValue(IRBuilder<> &Builder, Value *V, coro::Shape &Shape)
Set the given value as the current swifterror value.
static Value * emitSetAndGetSwiftErrorValueAround(Instruction *Call, AllocaInst *Alloca, coro::Shape &Shape)
Set the swifterror value from the given alloca before a call, then put in back in the alloca afterwar...
static void cacheDIVar(FrameDataInfo &FrameData, DenseMap< Value *, DILocalVariable * > &DIVarCache)
static bool localAllocaNeedsStackSave(CoroAllocaAllocInst *AI)
static void dumpAllocas(const SmallVectorImpl< coro::AllocaInfo > &Allocas)
static void splitAround(Instruction *I, const Twine &Name)
static void eliminateSwiftErrorAlloca(Function &F, AllocaInst *Alloca, coro::Shape &Shape)
Eliminate a formerly-swifterror alloca by inserting the get/set intrinsics and attempting to MemToReg...
static void buildFrameLayout(Function &F, const DominatorTree &DT, coro::Shape &Shape, FrameDataInfo &FrameData, bool OptimizeFrame)
static void movePHIValuesToInsertedBlock(BasicBlock *SuccBB, BasicBlock *InsertedBB, BasicBlock *PredBB, PHINode *UntilPHI=nullptr)
static void dumpSpills(StringRef Title, const coro::SpillInfo &Spills)
static DIType * solveDIType(DIBuilder &Builder, Type *Ty, const DataLayout &Layout, DIScope *Scope, unsigned LineNum, DenseMap< Type *, DIType * > &DITypeCache)
static bool willLeaveFunctionImmediatelyAfter(BasicBlock *BB, unsigned depth=3)
After we split the coroutine, will the given basic block be along an obvious exit path for the resump...
static void eliminateSwiftErrorArgument(Function &F, Argument &Arg, coro::Shape &Shape, SmallVectorImpl< AllocaInst * > &AllocasToPromote)
"Eliminate" a swifterror argument by reducing it to the alloca case and then loading and storing in t...
static void buildFrameDebugInfo(Function &F, coro::Shape &Shape, FrameDataInfo &FrameData)
Build artificial debug info for C++ coroutine frames to allow users to inspect the contents of the fr...
static Value * createGEPToFramePointer(const FrameDataInfo &FrameData, IRBuilder<> &Builder, coro::Shape &Shape, Value *Orig)
Returns a pointer into the coroutine frame at the offset where Orig is located.
static bool hasAccessingPromiseBeforeCB(const DominatorTree &DT, coro::Shape &Shape)
static BasicBlock * splitBlockIfNotFirst(Instruction *I, const Twine &Name)
static void rewritePHIsForCleanupPad(BasicBlock *CleanupPadBB, CleanupPadInst *CleanupPad)
static void sinkLifetimeStartMarkers(Function &F, coro::Shape &Shape, SuspendCrossingInfo &Checker, const DominatorTree &DT)
For each local variable that all of its user are only used inside one of suspended region,...
static Type * extractByvalIfArgument(Value *MaybeArgument)
If MaybeArgument is a byval Argument, return its byval type.
static StringRef solveTypeName(Type *Ty)
Create name for Type.
static Value * emitGetSwiftErrorValue(IRBuilder<> &Builder, Type *ValueTy, coro::Shape &Shape)
Get the current swifterror value.
static void insertSpills(const FrameDataInfo &FrameData, coro::Shape &Shape)
static void handleAccessBeforeCoroBegin(const FrameDataInfo &FrameData, coro::Shape &Shape, IRBuilder<> &Builder, AllocaInst *Alloca)
static bool isLifetimeStart(const Instruction *Inst)
Definition GVN.cpp:1498
Hexagon Common GEP
static MaybeAlign getAlign(Value *Ptr)
Module.h This file contains the declarations for the Module class.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
uint64_t IntrinsicInst * II
OptimizedStructLayoutField Field
This file provides an interface for laying out a sequence of fields as a struct in a way that attempt...
#define P(N)
This file contains the declarations for profiling metadata utility functions.
This file defines the scope_exit class, which executes user-defined cleanup logic at scope exit.
This file defines the SmallString class.
#define LLVM_DEBUG(...)
Definition Debug.h:119
static const unsigned FramePtr
an instruction to allocate memory on the stack
bool isSwiftError() const
Return true if this alloca is used as a swifterror argument to a call.
void setSwiftError(bool V)
Specify whether this alloca is used to represent a swifterror.
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.
void setAlignment(Align Align)
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:440
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
LLVM_ABI BasicBlock * splitBasicBlock(iterator I, const Twine &BBName="")
Split the basic block into two basic blocks at the specified instruction.
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
bool empty() const
Definition BasicBlock.h:462
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
Definition BasicBlock.h:206
const Instruction & front() const
Definition BasicBlock.h:463
LLVM_ABI const BasicBlock * getSingleSuccessor() const
Return the successor of this block if it has a single successor.
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
LLVM_ABI LLVMContext & getContext() const
Get the context in which this basic block lives.
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
This represents the llvm.coro.alloca.alloc instruction.
Definition CoroInstr.h:776
void clearPromise()
Definition CoroInstr.h:159
LLVM_ABI DICompositeType * createStructType(DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber, Metadata *SizeInBits, uint32_t AlignInBits, DINode::DIFlags Flags, DIType *DerivedFrom, DINodeArray Elements, unsigned RunTimeLang=0, DIType *VTableHolder=nullptr, StringRef UniqueIdentifier="", DIType *Specification=nullptr, uint32_t NumExtraInhabitants=0, DINodeArray Annotations=nullptr)
Create debugging information entry for a struct.
LLVM_ABI DIDerivedType * createMemberType(DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNo, Metadata *SizeInBits, uint32_t AlignInBits, Metadata *OffsetInBits, DINode::DIFlags Flags, DIType *Ty, DINodeArray Annotations=nullptr)
Create debugging information entry for a member.
LLVM_ABI DIDerivedType * createPointerType(DIType *PointeeTy, uint64_t SizeInBits, uint32_t AlignInBits=0, std::optional< unsigned > DWARFAddressSpace=std::nullopt, StringRef Name="", DINodeArray Annotations=nullptr)
Create debugging information entry for a pointer.
LLVM_ABI DIBasicType * createBasicType(StringRef Name, uint64_t SizeInBits, unsigned Encoding, DINode::DIFlags Flags=DINode::FlagZero, uint32_t NumExtraInhabitants=0, uint32_t DataSizeInBits=0)
Create debugging information entry for a basic type.
LLVM_ABI DINodeArray getOrCreateArray(ArrayRef< Metadata * > Elements)
Get a DINodeArray, create one if required.
LLVM_ABI DIExpression * createExpression(ArrayRef< uint64_t > Addr={})
Create a new descriptor for the specified variable which has a complex address expression for its add...
LLVM_ABI DILocalVariable * createAutoVariable(DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNo, DIType *Ty, bool AlwaysPreserve=false, DINode::DIFlags Flags=DINode::FlagZero, uint32_t AlignInBits=0)
Create a new descriptor for an auto variable.
LLVM_ABI void replaceArrays(DICompositeType *&T, DINodeArray Elements, DINodeArray TParams=DINodeArray())
Replace arrays on a composite type.
DWARF expression.
LLVM_ABI bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
static LLVM_ABI DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
LLVM_ABI DIExpression * foldConstantMath()
Try to shorten an expression with constant math operations that can be evaluated at compile time.
LLVM_ABI uint64_t getNumLocationOperands() const
Return the number of unique location operands referred to (via DW_OP_LLVM_arg) in this expression; th...
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 ...
LLVM_ABI bool isSingleLocationExpression() const
Return whether the evaluated expression makes use of a single location at the start of the expression...
Base class for scope-like contexts.
DIFile * getFile() const
Subprogram description. Uses SubclassData1.
Base class for types.
StringRef getName() const
uint64_t getSizeInBits() const
LLVM_ABI uint32_t getAlignInBits() const
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
unsigned getPointerSizeInBits(unsigned AS=0) const
The size in bits of the pointer representation in a given address space.
Definition DataLayout.h:501
LLVM_ABI const StructLayout * getStructLayout(StructType *Ty) const
Returns a StructLayout object, indicating the alignment of the struct, its size, and the offsets of i...
LLVM_ABI Align getABITypeAlign(Type *Ty) const
Returns the minimum ABI-required alignment for the specified type.
TypeSize getTypeSizeInBits(Type *Ty) const
Size examples:
Definition DataLayout.h:791
LLVM_ABI Align getPointerABIAlignment(unsigned AS) const
Layout pointer alignment.
LLVM_ABI Align getPrefTypeAlign(Type *Ty) const
Returns the preferred stack/global alignment for the specified type.
LLVM_ABI void removeFromParent()
DebugLoc getDebugLoc() const
void setDebugLoc(DebugLoc Loc)
LLVM_ABI Function * getFunction()
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LocationType Type
Classification of the debug-info record that this DbgVariableRecord represents.
LLVM_ABI void replaceVariableLocationOp(Value *OldValue, Value *NewValue, bool AllowEmpty=false)
LLVM_ABI Value * getVariableLocationOp(unsigned OpIdx) const
void setExpression(DIExpression *NewExpr)
DIExpression * getExpression() const
Metadata * getRawLocation() const
Returns the metadata operand for the first location description.
A debug info location.
Definition DebugLoc.h:126
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition DenseMap.h:757
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:766
iterator end()
Definition DenseMap.h:686
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:793
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:827
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.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static GEPNoWrapFlags inBounds()
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2947
LLVM_ABI void removeFromParent()
This method unlinks 'this' from the containing basic block, but does not delete it.
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 insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
iterator_range< user_iterator > users()
LLVM_ABI void insertAfter(Instruction *InsertPos)
Insert an unlinked instruction into a basic block immediately after the specified instruction.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:338
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:76
The landingpad instruction holds all of the information necessary to generate correct exception handl...
LLVM_ABI MDNode * createBranchWeights(uint32_t TrueWeight, uint32_t FalseWeight, bool IsExpected=false)
Return metadata containing two branch weights.
Definition MDBuilder.cpp:38
LLVM_ABI MDNode * createTBAAScalarTypeNode(StringRef Name, MDNode *Parent, uint64_t Offset=0)
Return metadata for a TBAA scalar type node with the given name, an offset and a parent in the TBAA t...
static constexpr uint32_t kUnlikelyBranchWeight
The weight for a branch taken with low probability.
Definition MDBuilder.h:53
LLVM_ABI MDNode * createTBAAStructTagNode(MDNode *BaseType, MDNode *AccessType, uint64_t Offset, bool IsConstant=false)
Return metadata for a TBAA tag node with the given base type, access type and offset relative to the ...
Metadata node.
Definition Metadata.h:1081
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1579
LLVMContext & getContext() const
Definition Metadata.h:1245
static MDTuple * getIfExists(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1583
static LLVM_ABI MDString * getIfExists(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:607
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:597
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static PointerType * getUnqual(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
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.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
StringRef str() const
Explicit conversion to StringRef.
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)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
std::string str() const
Get the contents as an std::string.
Definition StringRef.h:222
TypeSize getElementOffsetInBits(unsigned Idx) const
Definition DataLayout.h:779
bool isDefinitionAcrossSuspend(BasicBlock *DefBB, User *U) const
void setDefaultDest(BasicBlock *DefaultCase)
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
TinyPtrVector - This class is specialized for cases where there are normally 0 or 1 element in a vect...
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
LLVM_ABI std::string str() const
Return the twine contents as a std::string.
Definition Twine.cpp:17
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:352
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:303
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM_ABI void set(Value *Val)
Definition Value.h:876
User * getUser() const
Returns the User that contains this Use.
Definition Use.h:61
static LLVM_ABI ValueAsMetadata * get(Value *V)
Definition Metadata.cpp:514
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 void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:549
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:260
iterator_range< use_iterator > uses()
Definition Value.h:382
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:315
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:396
bool user_empty() const
Definition Value.h:391
std::function< bool(Instruction &I)> IsMaterializable
Definition ABI.h:64
Function & F
Definition ABI.h:59
virtual void buildCoroutineFrame(bool OptimizeFrame)
coro::Shape & Shape
Definition ABI.h:60
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:201
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
A raw_ostream that writes to an SmallVector or SmallString.
StringRef str() const
Return a StringRef for the vector contents.
CallInst * Call
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:83
SmallMapVector< Value *, SmallVector< Instruction *, 2 >, 8 > SpillInfo
Definition SpillUtils.h:19
@ Async
The "async continuation" lowering, where each suspend point creates a single continuation function.
Definition CoroShape.h:49
@ RetconOnce
The "unique returned-continuation" lowering, where each suspend point creates a single continuation f...
Definition CoroShape.h:44
@ Retcon
The "returned-continuation" lowering, where each suspend point creates a single continuation function...
Definition CoroShape.h:37
@ Switch
The "resume-switch" lowering, where there are separate resume and destroy functions that are shared b...
Definition CoroShape.h:32
LLVM_ABI BasicBlock::iterator getSpillInsertionPt(const coro::Shape &, Value *Def, const DominatorTree &DT)
bool isSuspendBlock(BasicBlock *BB)
void normalizeCoroutine(Function &F, coro::Shape &Shape, TargetTransformInfo &TTI)
CallInst * createMustTailCall(DebugLoc Loc, Function *MustTailCallFn, TargetTransformInfo &TTI, ArrayRef< Value * > Arguments, IRBuilder<> &)
LLVM_ABI void sinkSpillUsesAfterCoroBegin(const DominatorTree &DT, CoroBeginInst *CoroBegin, coro::SpillInfo &Spills, SmallVectorImpl< coro::AllocaInfo > &Allocas)
Async and Retcon{Once} conventions assume that all spill uses can be sunk after the coro....
LLVM_ABI void doRematerializations(Function &F, SuspendCrossingInfo &Checker, std::function< bool(Instruction &)> IsMaterializable)
LLVM_ABI void collectSpillsFromArgs(SpillInfo &Spills, Function &F, const SuspendCrossingInfo &Checker)
LLVM_ABI void collectSpillsFromDbgInfo(SpillInfo &Spills, Function &F, const SuspendCrossingInfo &Checker)
void salvageDebugInfo(SmallDenseMap< Argument *, AllocaInst *, 4 > &ArgToAllocaMap, DbgVariableRecord &DVR, bool UseEntryValue)
Attempts to rewrite the location operand of debug records in terms of the coroutine frame pointer,...
LLVM_ABI void collectSpillsAndAllocasFromInsts(SpillInfo &Spills, SmallVector< AllocaInfo, 8 > &Allocas, SmallVector< Instruction *, 4 > &DeadInstructions, SmallVector< CoroAllocaAllocInst *, 4 > &LocalAllocas, Function &F, const SuspendCrossingInfo &Checker, const DominatorTree &DT, const coro::Shape &Shape)
bool isCPlusPlus(SourceLanguage S)
Definition Dwarf.h:566
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
LLVM_ABI cl::opt< bool > ProfcheckDisableMetadataFixes
Definition LoopInfo.cpp:61
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
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...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
unsigned Log2_64_Ceil(uint64_t Value)
Return the ceil log base 2 of the specified value, 64 if the value is zero.
Definition MathExtras.h:345
auto successors(const MachineBasicBlock *BB)
scope_exit(Callable) -> scope_exit< Callable >
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
auto pred_size(const MachineBasicBlock *BB)
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
static Error getOffset(const SymbolRef &Sym, SectionRef Sec, uint64_t &Result)
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
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1652
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1769
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:149
LLVM_ABI BasicBlock * ehAwareSplitEdge(BasicBlock *BB, BasicBlock *Succ, LandingPadInst *OriginalPad=nullptr, PHINode *LandingPadReplacement=nullptr, const CriticalEdgeSplittingOptions &Options=CriticalEdgeSplittingOptions(), const Twine &BBName="")
Split the edge connect the specficed blocks in the case that Succ is an Exception Handling Block.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI Value * salvageDebugInfoImpl(Instruction &I, uint64_t CurrentLocOps, SmallVectorImpl< uint64_t > &Ops, SmallVectorImpl< Value * > &AdditionalValues)
Definition Local.cpp:2308
uint64_t offsetToAlignment(uint64_t Value, Align Alignment)
Returns the offset to the next integer (mod 2**64) that is greater than or equal to Value and is a mu...
Definition Alignment.h:191
TargetTransformInfo TTI
LLVM_ABI std::pair< uint64_t, Align > performOptimizedStructLayout(MutableArrayRef< OptimizedStructLayoutField > Fields)
Compute a layout for a struct containing the given fields, making a best-effort attempt to minimize t...
IntPtrTy
Definition InstrProf.h:82
DWARFExpression::Operation Op
LLVM_ABI TinyPtrVector< DbgVariableRecord * > findDVRDeclareValues(Value *V)
As above, for DVRDeclareValues.
Definition DebugInfo.cpp:65
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
LLVM_ABI void updatePhiNodes(BasicBlock *DestBB, BasicBlock *OldPred, BasicBlock *NewPred, PHINode *Until=nullptr)
Replaces all uses of OldPred with the NewPred block in all PHINodes in a block.
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
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
auto predecessors(const MachineBasicBlock *BB)
@ End
Run the machine verifier once, at the end of the pipeline.
Definition CodeGen.h:320
LLVM_ABI void setUnwindEdgeTo(Instruction *TI, BasicBlock *Succ)
Sets the unwind edge of an instruction to a particular successor.
static auto filterDbgVars(iterator_range< simple_ilist< DbgRecord >::iterator > R)
Filter the DbgRecord range to DbgVariableRecord types only and downcast.
LLVM_ABI void findDbgUsers(Value *V, SmallVectorImpl< DbgVariableRecord * > &DbgVariableRecords)
Finds the debug info records describing a value.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:82
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:111
Align Alignment
The required alignment of this field.
uint64_t Offset
The offset of this field in the final layout.
uint64_t Size
The required size of this field in bytes.
static constexpr uint64_t FlexibleOffset
A special value for Offset indicating that the field can be moved anywhere.
A MapVector that performs no allocations if smaller than a certain size.
Definition MapVector.h:342
AsyncLoweringStorage AsyncLowering
Definition CoroShape.h:148
IntegerType * getIndexType() const
Definition CoroShape.h:166
AnyCoroIdRetconInst * getRetconCoroId() const
Definition CoroShape.h:156
PointerType * getSwitchResumePointerType() const
Definition CoroShape.h:175
CoroIdInst * getSwitchCoroId() const
Definition CoroShape.h:151
SmallVector< AnyCoroSuspendInst *, 4 > CoroSuspends
Definition CoroShape.h:60
uint64_t FrameSize
Definition CoroShape.h:106
AllocaInst * getPromiseAlloca() const
Definition CoroShape.h:235
SwitchLoweringStorage SwitchLowering
Definition CoroShape.h:146
CoroBeginInst * CoroBegin
Definition CoroShape.h:55
BasicBlock::iterator getInsertPtAfterFramePtr() const
Definition CoroShape.h:241
RetconLoweringStorage RetconLowering
Definition CoroShape.h:147
SmallVector< AnyCoroEndInst *, 4 > CoroEnds
Definition CoroShape.h:56
SmallVector< CallInst *, 2 > SwiftErrorOps
Definition CoroShape.h:70
BasicBlock * AllocaSpillBlock
Definition CoroShape.h:108