Skip to content

Commit f889111

Browse files
committed
[NFC] Extracted emitPackExpansionPack.
1 parent 2d72c5b commit f889111

File tree

1 file changed

+37
-57
lines changed

1 file changed

+37
-57
lines changed

lib/IRGen/GenPack.cpp

Lines changed: 37 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -345,11 +345,14 @@ static llvm::Value *emitPackExpansionElementMetadata(
345345
return element;
346346
}
347347

348-
static void emitPackExpansionType(IRGenFunction &IGF, Address pack,
349-
CanPackExpansionType expansionTy,
350-
llvm::Value *dynamicIndex,
351-
llvm::Value *dynamicLength,
352-
DynamicMetadataRequest request) {
348+
/// Store the values corresponding to the specified pack expansion \p
349+
/// expansionTy for each index in its range [dynamicIndex, dynamicIndex +
350+
/// dynamicLength) produced by the provided function \p elementForIndex into
351+
/// the indicated buffer \p pack.
352+
static void emitPackExpansionPack(
353+
IRGenFunction &IGF, Address pack, CanPackExpansionType expansionTy,
354+
llvm::Value *dynamicIndex, llvm::Value *dynamicLength,
355+
function_ref<llvm::Value *(llvm::Value *)> elementForIndex) {
353356
auto *prev = IGF.Builder.GetInsertBlock();
354357
auto *check = IGF.createBasicBlock("pack-expansion-check");
355358
auto *loop = IGF.createBasicBlock("pack-expansion-loop");
@@ -368,8 +371,7 @@ static void emitPackExpansionType(IRGenFunction &IGF, Address pack,
368371

369372
IGF.Builder.emitBlock(loop);
370373

371-
auto *element =
372-
emitPackExpansionElementMetadata(IGF, expansionTy, phi, request);
374+
auto *element = elementForIndex(phi);
373375

374376
// Store the element metadata into to the current destination index.
375377
auto *eltIndex = IGF.Builder.CreateAdd(dynamicIndex, phi);
@@ -395,6 +397,18 @@ static void emitPackExpansionType(IRGenFunction &IGF, Address pack,
395397
IGF.Builder.emitBlock(rest);
396398
}
397399

400+
static void emitPackExpansionMetadataPack(IRGenFunction &IGF, Address pack,
401+
CanPackExpansionType expansionTy,
402+
llvm::Value *dynamicIndex,
403+
llvm::Value *dynamicLength,
404+
DynamicMetadataRequest request) {
405+
emitPackExpansionPack(IGF, pack, expansionTy, dynamicIndex, dynamicLength,
406+
[&](auto *index) {
407+
return emitPackExpansionElementMetadata(
408+
IGF, expansionTy, index, request);
409+
});
410+
}
411+
398412
StackAddress
399413
irgen::emitTypeMetadataPack(IRGenFunction &IGF,
400414
CanPackType packType,
@@ -421,8 +435,8 @@ irgen::emitTypeMetadataPack(IRGenFunction &IGF,
421435
}
422436

423437
if (auto expansionTy = dyn_cast<PackExpansionType>(eltTy)) {
424-
emitPackExpansionType(IGF, pack.getAddress(), expansionTy,
425-
dynamicIndex, dynamicLength, request);
438+
emitPackExpansionMetadataPack(IGF, pack.getAddress(), expansionTy,
439+
dynamicIndex, dynamicLength, request);
426440
} else {
427441
Address eltPtr(
428442
IGF.Builder.CreateInBoundsGEP(pack.getAddress().getElementType(),
@@ -508,52 +522,17 @@ static llvm::Value *emitPackExpansionElementWitnessTable(
508522
return wtable;
509523
}
510524

511-
static void emitExpansionWitnessTablePack(IRGenFunction &IGF, Address pack,
512-
CanPackExpansionType expansionTy,
513-
ProtocolConformanceRef conformance,
514-
llvm::Value *dynamicIndex,
515-
llvm::Value *dynamicLength) {
516-
auto *prev = IGF.Builder.GetInsertBlock();
517-
auto *check = IGF.createBasicBlock("pack-expansion-check");
518-
auto *loop = IGF.createBasicBlock("pack-expansion-loop");
519-
auto *rest = IGF.createBasicBlock("pack-expansion-rest");
520-
521-
IGF.Builder.CreateBr(check);
522-
IGF.Builder.emitBlock(check);
523-
524-
// An index into the source witness table pack.
525-
auto *phi = IGF.Builder.CreatePHI(IGF.IGM.SizeTy, 2);
526-
phi->addIncoming(llvm::ConstantInt::get(IGF.IGM.SizeTy, 0), prev);
527-
528-
// If we reach the end, jump to the continuation block.
529-
auto *cond = IGF.Builder.CreateICmpULT(phi, dynamicLength);
530-
IGF.Builder.CreateCondBr(cond, loop, rest);
531-
532-
IGF.Builder.emitBlock(loop);
533-
534-
llvm::Value *_metadata = nullptr;
535-
auto *element = emitPackExpansionElementWitnessTable(
536-
IGF, expansionTy, conformance, /*srcMetadataCache=*/&_metadata, phi);
537-
538-
// Store the element witness table into to the current destination index.
539-
auto *eltIndex = IGF.Builder.CreateAdd(dynamicIndex, phi);
540-
Address eltPtr(IGF.Builder.CreateInBoundsGEP(pack.getElementType(),
541-
pack.getAddress(), eltIndex),
542-
pack.getElementType(), pack.getAlignment());
543-
544-
IGF.Builder.CreateStore(element, eltPtr);
545-
546-
// Increment our counter.
547-
auto *next =
548-
IGF.Builder.CreateAdd(phi, llvm::ConstantInt::get(IGF.IGM.SizeTy, 1));
549-
550-
phi->addIncoming(next, loop);
551-
552-
// Repeat the loop.
553-
IGF.Builder.CreateBr(check);
554-
555-
// Fall through.
556-
IGF.Builder.emitBlock(rest);
525+
static void emitPackExpansionWitnessTablePack(
526+
IRGenFunction &IGF, Address pack, CanPackExpansionType expansionTy,
527+
ProtocolConformanceRef conformance, llvm::Value *dynamicIndex,
528+
llvm::Value *dynamicLength) {
529+
emitPackExpansionPack(IGF, pack, expansionTy, dynamicIndex, dynamicLength,
530+
[&](auto *index) {
531+
llvm::Value *_metadata = nullptr;
532+
return emitPackExpansionElementWitnessTable(
533+
IGF, expansionTy, conformance,
534+
/*srcMetadataCache=*/&_metadata, index);
535+
});
557536
}
558537

559538
StackAddress irgen::emitWitnessTablePack(IRGenFunction &IGF,
@@ -582,8 +561,9 @@ StackAddress irgen::emitWitnessTablePack(IRGenFunction &IGF,
582561

583562
auto conformance = packConformance->getPatternConformances()[index];
584563
if (auto expansionTy = dyn_cast<PackExpansionType>(eltTy)) {
585-
emitExpansionWitnessTablePack(IGF, pack.getAddress(), expansionTy,
586-
conformance, dynamicIndex, dynamicLength);
564+
emitPackExpansionWitnessTablePack(IGF, pack.getAddress(), expansionTy,
565+
conformance, dynamicIndex,
566+
dynamicLength);
587567
} else {
588568
Address eltPtr(
589569
IGF.Builder.CreateInBoundsGEP(pack.getAddress().getElementType(),

0 commit comments

Comments
 (0)