Skip to content

Commit a38db64

Browse files
committed
SIL: add the vector_base_addr instruction
It derives the address of the first element of a vector, i.e. a `Builtin.FixedArray`, from the address of the vector itself. Addresses of other vector elements can then be derived with `index_addr`.
1 parent 17fbcb5 commit a38db64

27 files changed

+128
-1
lines changed

SwiftCompilerSources/Sources/Optimizer/Utilities/Verifier.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,16 @@ extension LoadBorrowInst : VerifiableInstruction {
148148
}
149149
}
150150

151+
extension VectorBaseAddrInst : VerifiableInstruction {
152+
func verify(_ context: FunctionPassContext) {
153+
require(vector.type.isBuiltinFixedArray,
154+
"vector operand of vector_element_addr must be a Builtin.FixedArray")
155+
require(type == vector.type.builtinFixedArrayElementType(in: parentFunction,
156+
maximallyAbstracted: true).addressType,
157+
"result of vector_element_addr has wrong type")
158+
}
159+
}
160+
151161
// Used to check if any instruction is mutating the memory location within the liverange of a `load_borrow`.
152162
// Note that it is not checking if an instruction _may_ mutate the memory, but it's checking if any instruction
153163
// _definitely_ will mutate the memory.

SwiftCompilerSources/Sources/SIL/Builder.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,10 @@ public struct Builder {
487487
return notifyNew(vectorInst.getAs(VectorInst.self))
488488
}
489489

490+
public func createVectorBaseAddr(vector: Value) -> VectorBaseAddrInst {
491+
return notifyNew(bridged.createVectorBaseAddr(vector.bridged).getAs(VectorBaseAddrInst.self))
492+
}
493+
490494
public func createGlobalAddr(global: GlobalVariable, dependencyToken: Value?) -> GlobalAddrInst {
491495
return notifyNew(bridged.createGlobalAddr(global.bridged, dependencyToken.bridged).getAs(GlobalAddrInst.self))
492496
}

SwiftCompilerSources/Sources/SIL/Instruction.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1350,6 +1350,10 @@ final public class ObjectInst : SingleValueInstruction {
13501350
final public class VectorInst : SingleValueInstruction {
13511351
}
13521352

1353+
final public class VectorBaseAddrInst : SingleValueInstruction, UnaryInstruction {
1354+
public var vector: Value { operand.value }
1355+
}
1356+
13531357
final public class DifferentiableFunctionInst: SingleValueInstruction {}
13541358

13551359
final public class LinearFunctionInst: SingleValueInstruction {}

SwiftCompilerSources/Sources/SIL/Registration.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ public func registerSILClasses() {
118118
register(MoveOnlyWrapperToCopyableAddrInst.self)
119119
register(ObjectInst.self)
120120
register(VectorInst.self)
121+
register(VectorBaseAddrInst.self)
121122
register(TuplePackExtractInst.self)
122123
register(TuplePackElementAddrInst.self)
123124
register(PackElementGetInst.self)

docs/SIL/Instructions.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3467,6 +3467,20 @@ Constructs a statically initialized vector of elements. This instruction
34673467
can only appear as final instruction in a global variable static
34683468
initializer list.
34693469

3470+
### vector_base_addr
3471+
3472+
```
3473+
sil-instruction ::= 'vector_base_addr' sil-operand
3474+
3475+
%1 = vector_base_addr %0 : $*Builtin.FixedArray<N, Element>
3476+
// %0 must have type $*Builtin.FixedArray
3477+
// %1 will be of the element type of the Builtin.FixedArray
3478+
```
3479+
3480+
Derives the address of the first element of a vector, i.e. a `Builtin.FixedArray`,
3481+
from the address of the vector itself.
3482+
Addresses of other vector elements can then be derived with `index_addr`.
3483+
34703484
### ref_element_addr
34713485

34723486
```

include/swift/SIL/AddressWalker.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ TransitiveAddressWalker<Impl>::walk(SILValue projectedAddress) {
249249
isa<BeginAccessInst>(user) || isa<TailAddrInst>(user) ||
250250
isa<IndexAddrInst>(user) || isa<StoreBorrowInst>(user) ||
251251
isa<UncheckedAddrCastInst>(user) ||
252+
isa<VectorBaseAddrInst>(user) ||
252253
isa<MarkUnresolvedNonCopyableValueInst>(user) ||
253254
isa<MarkUninitializedInst>(user) || isa<DropDeinitInst>(user) ||
254255
isa<ProjectBlockStorageInst>(user) || isa<UpcastInst>(user) ||

include/swift/SIL/SILBridging.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,6 +1258,7 @@ struct BridgedBuilder{
12581258
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createObject(BridgedType type, BridgedValueArray arguments,
12591259
SwiftInt numBaseElements) const;
12601260
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createVector(BridgedValueArray arguments) const;
1261+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createVectorBaseAddr(BridgedValue vector) const;
12611262
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createGlobalAddr(BridgedGlobalVar global,
12621263
OptionalBridgedValue dependencyToken) const;
12631264
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createGlobalValue(BridgedGlobalVar global,

include/swift/SIL/SILBridgingImpl.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2453,6 +2453,10 @@ BridgedInstruction BridgedBuilder::createVector(BridgedValueArray arguments) con
24532453
return {unbridged().createVector(swift::ArtificialUnreachableLocation(), arguments.getValues(argValues))};
24542454
}
24552455

2456+
BridgedInstruction BridgedBuilder::createVectorBaseAddr(BridgedValue vector) const {
2457+
return {unbridged().createVectorBaseAddr(regularLoc(), vector.getSILValue())};
2458+
}
2459+
24562460
BridgedInstruction BridgedBuilder::createGlobalAddr(BridgedGlobalVar global,
24572461
OptionalBridgedValue dependencyToken) const {
24582462
return {unbridged().createGlobalAddr(regularLoc(), global.getGlobal(), dependencyToken.getSILValue())};

include/swift/SIL/SILBuilder.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "swift/SIL/SILInstruction.h"
2323
#include "swift/SIL/SILModule.h"
2424
#include "swift/SIL/SILUndef.h"
25+
#include "swift/SIL/AbstractionPattern.h"
2526
#include "llvm/ADT/PointerUnion.h"
2627
#include "llvm/ADT/StringExtras.h"
2728
#include <type_traits>
@@ -1923,6 +1924,15 @@ class SILBuilder {
19231924
return createStructElementAddr(Loc, Operand, Field, ResultTy);
19241925
}
19251926

1927+
VectorBaseAddrInst *
1928+
createVectorBaseAddr(SILLocation loc, SILValue vector) {
1929+
auto arrayTy = vector->getType().getAs<BuiltinFixedArrayType>();
1930+
ASSERT(arrayTy && "operand of vector_extract must be a builtin array type");
1931+
auto elemtTy = getFunction().getLoweredType(Lowering::AbstractionPattern::getOpaque(), arrayTy->getElementType());
1932+
return insert(new (getModule()) VectorBaseAddrInst(
1933+
getSILDebugLocation(loc), vector, elemtTy.getAddressType()));
1934+
}
1935+
19261936
RefElementAddrInst *createRefElementAddr(SILLocation Loc, SILValue Operand,
19271937
VarDecl *Field, SILType ResultTy,
19281938
bool IsImmutable = false) {

include/swift/SIL/SILCloner.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2542,6 +2542,16 @@ SILCloner<ImplClass>::visitStructElementAddrInst(StructElementAddrInst *Inst) {
25422542
Inst->getField(), getOpType(Inst->getType())));
25432543
}
25442544

2545+
template<typename ImplClass>
2546+
void
2547+
SILCloner<ImplClass>::visitVectorBaseAddrInst(VectorBaseAddrInst *Inst) {
2548+
getBuilder().setCurrentDebugScope(getOpScope(Inst->getDebugScope()));
2549+
recordClonedInstruction(
2550+
Inst, getBuilder().createVectorBaseAddr(
2551+
getOpLocation(Inst->getLoc()),
2552+
getOpValue(Inst->getVector())));
2553+
}
2554+
25452555
template<typename ImplClass>
25462556
void
25472557
SILCloner<ImplClass>::visitRefElementAddrInst(RefElementAddrInst *Inst) {

include/swift/SIL/SILInstruction.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6791,6 +6791,17 @@ class VectorInst final : public InstructionBaseWithTrailingOperands<
67916791
}
67926792
};
67936793

6794+
class VectorBaseAddrInst
6795+
: public UnaryInstructionBase<SILInstructionKind::VectorBaseAddrInst,
6796+
SingleValueInstruction> {
6797+
friend SILBuilder;
6798+
6799+
VectorBaseAddrInst(SILDebugLocation debugLoc, SILValue vector, SILType resultTy)
6800+
: UnaryInstructionBase(debugLoc, vector, resultTy) {}
6801+
public:
6802+
SILValue getVector() const { return getOperand(); }
6803+
};
6804+
67946805
/// TupleInst - Represents a constructed loadable tuple.
67956806
class TupleInst final : public InstructionBaseWithTrailingOperands<
67966807
SILInstructionKind::TupleInst, TupleInst,

include/swift/SIL/SILNodes.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,8 @@ ABSTRACT_VALUE_AND_INST(SingleValueInstruction, ValueBase, SILInstruction)
587587
SingleValueInstruction, None, DoesNotRelease)
588588
SINGLE_VALUE_INST(VectorInst, vector,
589589
SingleValueInstruction, None, DoesNotRelease)
590+
SINGLE_VALUE_INST(VectorBaseAddrInst, vector_base_addr,
591+
SingleValueInstruction, None, DoesNotRelease)
590592
SINGLE_VALUE_INST(TupleInst, tuple,
591593
SingleValueInstruction, None, DoesNotRelease)
592594
SINGLE_VALUE_INST(TupleExtractInst, tuple_extract,

lib/IRGen/IRGenSIL.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1352,6 +1352,7 @@ class IRGenSILFunction :
13521352
void visitTupleElementAddrInst(TupleElementAddrInst *i);
13531353
void visitStructExtractInst(StructExtractInst *i);
13541354
void visitStructElementAddrInst(StructElementAddrInst *i);
1355+
void visitVectorBaseAddrInst(VectorBaseAddrInst *i);
13551356
void visitRefElementAddrInst(RefElementAddrInst *i);
13561357
void visitRefTailAddrInst(RefTailAddrInst *i);
13571358

@@ -5639,6 +5640,13 @@ void IRGenSILFunction::visitStructElementAddrInst(
56395640
setLoweredAddress(i, field);
56405641
}
56415642

5643+
void IRGenSILFunction::visitVectorBaseAddrInst(VectorBaseAddrInst *i) {
5644+
auto addr = getLoweredAddress(i->getVector());
5645+
auto &ti = getTypeInfo(i->getType());
5646+
auto result = Builder.CreateElementBitCast(addr, ti.getStorageType());
5647+
setLoweredAddress(i, result);
5648+
}
5649+
56425650
void IRGenSILFunction::visitRefElementAddrInst(swift::RefElementAddrInst *i) {
56435651
Explosion base = getLoweredExplosion(i->getOperand());
56445652
llvm::Value *value = base.claimNext();

lib/SIL/IR/OperandOwnership.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ OPERAND_OWNERSHIP(TrivialUse, DestroyAddr)
171171
OPERAND_OWNERSHIP(TrivialUse, EndAccess)
172172
OPERAND_OWNERSHIP(TrivialUse, EndUnpairedAccess)
173173
OPERAND_OWNERSHIP(TrivialUse, GetAsyncContinuationAddr)
174+
OPERAND_OWNERSHIP(TrivialUse, VectorBaseAddr)
174175
OPERAND_OWNERSHIP(TrivialUse, IndexAddr)
175176
OPERAND_OWNERSHIP(TrivialUse, IndexRawPointer)
176177
OPERAND_OWNERSHIP(TrivialUse, InitBlockStorageHeader)

lib/SIL/IR/SILPrinter.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2500,6 +2500,9 @@ class SILPrinter : public SILInstructionVisitor<SILPrinter> {
25002500
printFullContext(EI->getField()->getDeclContext(), PrintState.OS);
25012501
*this << EI->getField()->getName().get();
25022502
}
2503+
void visitVectorBaseAddrInst(VectorBaseAddrInst *vbai) {
2504+
*this << getIDAndType(vbai->getVector());
2505+
}
25032506
void visitRefElementAddrInst(RefElementAddrInst *EI) {
25042507
*this << (EI->isImmutable() ? "[immutable] " : "")
25052508
<< getIDAndType(EI->getOperand()) << ", #";

lib/SIL/IR/ValueOwnership.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ CONSTANT_OWNERSHIP_INST(None, PreviousDynamicFunctionRef)
125125
CONSTANT_OWNERSHIP_INST(None, GlobalAddr)
126126
CONSTANT_OWNERSHIP_INST(None, BaseAddrForOffset)
127127
CONSTANT_OWNERSHIP_INST(None, HasSymbol)
128+
CONSTANT_OWNERSHIP_INST(None, VectorBaseAddr)
128129
CONSTANT_OWNERSHIP_INST(None, IndexAddr)
129130
CONSTANT_OWNERSHIP_INST(None, IndexRawPointer)
130131
CONSTANT_OWNERSHIP_INST(None, InitEnumDataAddr)

lib/SIL/Parser/ParseSIL.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5891,6 +5891,12 @@ bool SILParser::parseSpecificSILInstruction(SILBuilder &B,
58915891
ResultVal = B.createIndexAddr(InstLoc, Val, IndexVal, needsStackProtection);
58925892
break;
58935893
}
5894+
case SILInstructionKind::VectorBaseAddrInst: {
5895+
if (parseTypedValueRef(Val, B) || parseSILDebugLocation(InstLoc, B))
5896+
return true;
5897+
ResultVal = B.createVectorBaseAddr(InstLoc, Val);
5898+
break;
5899+
}
58945900
case SILInstructionKind::TailAddrInst: {
58955901
SILValue IndexVal;
58965902
SILType ResultObjTy;

lib/SIL/Utils/InstructionUtils.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,7 @@ RuntimeEffect swift::getRuntimeEffect(SILInstruction *inst, SILType &impactType)
581581
case SILInstructionKind::TupleExtractInst:
582582
case SILInstructionKind::StructInst:
583583
case SILInstructionKind::StructExtractInst:
584+
case SILInstructionKind::VectorBaseAddrInst:
584585
case SILInstructionKind::RefElementAddrInst:
585586
case SILInstructionKind::EnumInst:
586587
case SILInstructionKind::UncheckedEnumDataInst:

lib/SIL/Verifier/SILVerifier.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -821,6 +821,7 @@ struct ImmutableAddressUseVerifier {
821821
LLVM_FALLTHROUGH;
822822
case SILInstructionKind::MoveOnlyWrapperToCopyableAddrInst:
823823
case SILInstructionKind::CopyableToMoveOnlyWrapperAddrInst:
824+
case SILInstructionKind::VectorBaseAddrInst:
824825
case SILInstructionKind::StructElementAddrInst:
825826
case SILInstructionKind::TupleElementAddrInst:
826827
case SILInstructionKind::IndexAddrInst:

lib/SILOptimizer/Analysis/RegionAnalysis.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3411,6 +3411,7 @@ CONSTANT_TRANSLATION(InitExistentialValueInst, LookThrough)
34113411
CONSTANT_TRANSLATION(UncheckedEnumDataInst, LookThrough)
34123412
CONSTANT_TRANSLATION(TupleElementAddrInst, LookThrough)
34133413
CONSTANT_TRANSLATION(StructElementAddrInst, LookThrough)
3414+
CONSTANT_TRANSLATION(VectorBaseAddrInst, LookThrough)
34143415
CONSTANT_TRANSLATION(UncheckedTakeEnumDataAddrInst, LookThrough)
34153416

34163417
//===---

lib/SILOptimizer/UtilityPasses/SerializeSILPass.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ static bool hasOpaqueArchetype(TypeExpansionContext context,
209209
case SILInstructionKind::ObjCProtocolInst:
210210
case SILInstructionKind::ObjectInst:
211211
case SILInstructionKind::VectorInst:
212+
case SILInstructionKind::VectorBaseAddrInst:
212213
case SILInstructionKind::TupleInst:
213214
case SILInstructionKind::TupleAddrConstructorInst:
214215
case SILInstructionKind::TupleExtractInst:

lib/SILOptimizer/Utils/SILInliner.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,6 +1096,7 @@ InlineCost swift::instructionInlineCost(SILInstruction &I) {
10961096
case SILInstructionKind::DynamicMethodBranchInst:
10971097
case SILInstructionKind::EnumInst:
10981098
case SILInstructionKind::IndexAddrInst:
1099+
case SILInstructionKind::VectorBaseAddrInst:
10991100
case SILInstructionKind::TailAddrInst:
11001101
case SILInstructionKind::IndexRawPointerInst:
11011102
case SILInstructionKind::InitEnumDataAddrInst:

lib/Serialization/DeserializeSIL.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2452,6 +2452,15 @@ bool SILDeserializer::readSILInstruction(SILFunction *Fn,
24522452
getSILType(Ty2, (SILValueCategory)TyCategory2, Fn)));
24532453
break;
24542454
}
2455+
case SILInstructionKind::VectorBaseAddrInst: {
2456+
assert(RecordKind == SIL_ONE_TYPE_ONE_OPERAND);
2457+
ResultInst = Builder.createVectorBaseAddr(
2458+
Loc,
2459+
getLocalValue(
2460+
Builder.maybeGetFunction(), ValID,
2461+
getSILType(MF->getType(TyID2), (SILValueCategory)TyCategory2, Fn)));
2462+
break;
2463+
}
24552464
case SILInstructionKind::IndexAddrInst: {
24562465
auto Ty = MF->getType(TyID);
24572466
auto Ty2 = MF->getType(TyID2);

lib/Serialization/ModuleFormat.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ const uint16_t SWIFTMODULE_VERSION_MAJOR = 0;
5858
/// describe what change you made. The content of this comment isn't important;
5959
/// it just ensures a conflict if two people change the module format.
6060
/// Don't worry about adhering to the 80-column limit for this line.
61-
const uint16_t SWIFTMODULE_VERSION_MINOR = 948; // remove SwiftSettings
61+
const uint16_t SWIFTMODULE_VERSION_MINOR = 949; // vector_base_addr instruction
6262

6363
/// A standard hash seed used for all string hashes in a serialized module.
6464
///

lib/Serialization/SerializeSIL.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2177,6 +2177,7 @@ void SILSerializer::writeSILInstruction(const SILInstruction &SI) {
21772177
case SILInstructionKind::UncheckedTrivialBitCastInst:
21782178
case SILInstructionKind::UncheckedBitwiseCastInst:
21792179
case SILInstructionKind::UncheckedValueCastInst:
2180+
case SILInstructionKind::VectorBaseAddrInst:
21802181
case SILInstructionKind::BridgeObjectToRefInst:
21812182
case SILInstructionKind::BridgeObjectToWordInst:
21822183
case SILInstructionKind::UpcastInst:

test/SIL/Parser/basic.sil

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,6 +1220,16 @@ sil @alloc_stack_test : $() -> () {
12201220
// CHECK: } // end sil function 'alloc_stack_test'
12211221
}
12221222

1223+
// CHECK-LABEL: sil @vector_base_addr :
1224+
// CHECK: %1 = vector_base_addr %0 : $*Builtin.FixedArray<10, Int>
1225+
// CHECK-LABEL: } // end sil function 'vector_base_addr'
1226+
sil @vector_base_addr : $@convention(thin) (@inout Builtin.FixedArray<10, Int>) -> Int {
1227+
bb0(%0 : $*Builtin.FixedArray<10, Int>):
1228+
%1 = vector_base_addr %0
1229+
%2 = load %1
1230+
return %2
1231+
}
1232+
12231233
sil_global @staticProp: $Int
12241234

12251235
// CHECK-LABEL: sil private @globalinit_func0 : $@convention(thin) () -> () {

test/Serialization/Inputs/def_basic.sil

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,16 @@ bb0(%0 : $Int): // CHECK: bb0(%0 : $Int):
120120
return %3 : $Int // CHECK: return {{.*}} : $Int
121121
}
122122

123+
// CHECK-LABEL: sil public_external @vector_base_addr :
124+
// CHECK: %1 = vector_base_addr %0 : $*Builtin.FixedArray<10, Int>
125+
// CHECK-LABEL: } // end sil function 'vector_base_addr'
126+
sil [serialized] @vector_base_addr : $@convention(thin) (@inout Builtin.FixedArray<10, Int>) -> Int {
127+
bb0(%0 : $*Builtin.FixedArray<10, Int>):
128+
%1 = vector_base_addr %0
129+
%2 = load %1
130+
return %2
131+
}
132+
123133
// CHECK-LABEL: @call_fn_pointer : $@convention(thin) (() -> Int) -> Int {
124134
sil [transparent] [serialized] @call_fn_pointer : $@convention(thin) (() -> Int) -> Int {
125135
bb0(%0 : $() -> Int):
@@ -1528,6 +1538,7 @@ bb0:
15281538
%4 = function_ref @test2 : $@convention(thin) (Int) -> ()
15291539
%6 = function_ref @named_tuple : $@convention(thin) () -> (Builtin.Word, Builtin.Word)
15301540
%9 = function_ref @return_int : $@convention(thin) (Int) -> Int
1541+
%10 = function_ref @vector_base_addr : $@convention(thin) (@inout Builtin.FixedArray<10, Int>) -> Int
15311542
%11 = function_ref @call_fn_pointer : $@convention(thin) (() -> Int) -> Int
15321543
%13 = function_ref @return_constant : $@convention(thin) () -> Int
15331544
%23 = function_ref @existentials : $@convention(thin) (@in P) -> ()

0 commit comments

Comments
 (0)