Skip to content

Commit 927e0c4

Browse files
committed
SwiftCompilerSources: add all missing instruction classes
And require that all new instructions must be added and registered in SwiftCompilerSources as well.
1 parent 7916c04 commit 927e0c4

File tree

4 files changed

+120
-54
lines changed

4 files changed

+120
-54
lines changed

SwiftCompilerSources/README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,6 @@ For example, to add a new instruction class:
129129
* if needed, add bridging functions to access the instruction's data fields.
130130

131131

132-
No yet implemented instruction classes are mapped to a "placeholder" instruction, e.g `UnimplementedInstruction`. This ensures that optimizations can process any kind of SIL, even if some instructions don't have a representation in Swift yet.
133-
134132
## The Optimizer
135133

136134
Similar to SIL, the optimizer also uses a small bridging layer (`OptimizerBridging.h`).

SwiftCompilerSources/Sources/SIL/Instruction.swift

Lines changed: 71 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -250,11 +250,6 @@ extension UnaryInstruction {
250250
// no-value instructions
251251
//===----------------------------------------------------------------------===//
252252

253-
/// Used for all non-value instructions which are not implemented here, yet.
254-
/// See registerBridgedClass() in SILBridgingUtils.cpp.
255-
final public class UnimplementedInstruction : Instruction {
256-
}
257-
258253
/// Only one of the operands may have an address type.
259254
public protocol StoringInstruction : Instruction {
260255
var operands: OperandArray { get }
@@ -352,6 +347,9 @@ final public class EndAccessInst : Instruction, UnaryInstruction {
352347
}
353348
}
354349

350+
final public class BeginUnpairedAccessInst : Instruction {}
351+
final public class EndUnpairedAccessInst : Instruction {}
352+
355353
final public class EndBorrowInst : Instruction, UnaryInstruction {}
356354

357355
final public class MarkUninitializedInst : SingleValueInstruction, ConversionInstruction {
@@ -400,6 +398,8 @@ final public class CondFailInst : Instruction, UnaryInstruction {
400398
public var message: StringRef { StringRef(bridged: bridged.CondFailInst_getMessage()) }
401399
}
402400

401+
final public class IncrementProfilerCounterInst : Instruction {}
402+
403403
final public class MarkFunctionEscapeInst : Instruction {}
404404

405405
final public class HopToExecutorInst : Instruction, UnaryInstruction {}
@@ -445,6 +445,8 @@ final public class DebugValueInst : Instruction, UnaryInstruction, DebugVariable
445445

446446
final public class DebugStepInst : Instruction {}
447447

448+
final public class SpecifyTestInst : Instruction {}
449+
448450
final public class UnconditionalCheckedCastAddrInst : Instruction {
449451
public override var mayTrap: Bool { true }
450452
}
@@ -459,6 +461,9 @@ final public class BeginDeallocRefInst : SingleValueInstruction {
459461

460462
final public class EndInitLetRefInst : SingleValueInstruction, UnaryInstruction {}
461463

464+
final public class BindMemoryInst : SingleValueInstruction {}
465+
final public class RebindMemoryInst : SingleValueInstruction {}
466+
462467
public class RefCountingInst : Instruction, UnaryInstruction {
463468
public var isAtomic: Bool { bridged.RefCountingInst_getIsAtomic() }
464469
}
@@ -467,6 +472,8 @@ final public class StrongRetainInst : RefCountingInst {
467472
public var instance: Value { operand.value }
468473
}
469474

475+
final public class StrongRetainUnownedInst : RefCountingInst {}
476+
470477
final public class UnownedRetainInst : RefCountingInst {
471478
public var instance: Value { operand.value }
472479
}
@@ -501,6 +508,9 @@ final public class UnmanagedReleaseValueInst : RefCountingInst {
501508
public var value: Value { return operand.value }
502509
}
503510

511+
final public class AutoreleaseValueInst : RefCountingInst {}
512+
final public class UnmanagedAutoreleaseValueInst : RefCountingInst {}
513+
504514
final public class DestroyValueInst : Instruction, UnaryInstruction {
505515
public var destroyedValue: Value { operand.value }
506516
}
@@ -516,8 +526,6 @@ final public class InjectEnumAddrInst : Instruction, UnaryInstruction, EnumInstr
516526
public var caseIndex: Int { bridged.InjectEnumAddrInst_caseIndex() }
517527
}
518528

519-
final public class UnimplementedRefCountingInst : RefCountingInst {}
520-
521529
//===----------------------------------------------------------------------===//
522530
// no-value deallocation instructions
523531
//===----------------------------------------------------------------------===//
@@ -538,6 +546,7 @@ final public class DeallocStackInst : Instruction, UnaryInstruction, Deallocatio
538546
}
539547

540548
final public class DeallocPackInst : Instruction, UnaryInstruction, Deallocation {}
549+
final public class DeallocPackMetadataInst : Instruction, Deallocation {}
541550

542551
final public class DeallocStackRefInst : Instruction, UnaryInstruction, Deallocation {
543552
public var allocRef: AllocRefInstBase { operand.value as! AllocRefInstBase }
@@ -555,11 +564,6 @@ final public class DeallocExistentialBoxInst : Instruction, UnaryInstruction, De
555564
// single-value instructions
556565
//===----------------------------------------------------------------------===//
557566

558-
/// Used for all SingleValueInstructions which are not implemented here, yet.
559-
/// See registerBridgedClass() in SILBridgingUtils.cpp.
560-
final public class UnimplementedSingleValueInst : SingleValueInstruction {
561-
}
562-
563567
public protocol LoadInstruction: SingleValueInstruction, UnaryInstruction {}
564568

565569
extension LoadInstruction {
@@ -622,6 +626,15 @@ final public class UncheckedTrivialBitCastInst : SingleValueInstruction, UnaryIn
622626
public var fromValue: Value { operand.value }
623627
}
624628

629+
final public class UncheckedBitwiseCastInst : SingleValueInstruction, UnaryInstruction {}
630+
final public class UncheckedValueCastInst : SingleValueInstruction, UnaryInstruction {}
631+
632+
final public class RefToRawPointerInst : SingleValueInstruction, UnaryInstruction {}
633+
final public class RefToUnmanagedInst : SingleValueInstruction, UnaryInstruction {}
634+
final public class RefToUnownedInst : SingleValueInstruction, UnaryInstruction {}
635+
final public class UnmanagedToRefInst : SingleValueInstruction, UnaryInstruction {}
636+
final public class UnownedToRefInst : SingleValueInstruction, UnaryInstruction {}
637+
625638
final public
626639
class RawPointerToRefInst : SingleValueInstruction, UnaryInstruction {
627640
public var pointer: Value { operand.value }
@@ -652,6 +665,8 @@ class IndexAddrInst : SingleValueInstruction {
652665
}
653666
}
654667

668+
final public class IndexRawPointerInst : SingleValueInstruction {}
669+
655670
final public
656671
class TailAddrInst : SingleValueInstruction {
657672
public var base: Value { operands[0].value }
@@ -708,7 +723,15 @@ class ValueMetatypeInst : SingleValueInstruction, UnaryInstruction {}
708723
final public
709724
class ExistentialMetatypeInst : SingleValueInstruction, UnaryInstruction {}
710725

711-
public class GlobalAccessInst : SingleValueInstruction {
726+
final public class OpenPackElementInst : SingleValueInstruction {}
727+
final public class PackLengthInst : SingleValueInstruction {}
728+
final public class DynamicPackIndexInst : SingleValueInstruction {}
729+
final public class PackPackIndexInst : SingleValueInstruction {}
730+
final public class ScalarPackIndexInst : SingleValueInstruction {}
731+
732+
final public class ObjCProtocolInst : SingleValueInstruction {}
733+
734+
public class GlobalAccessInstruction : SingleValueInstruction {
712735
final public var global: GlobalVariable {
713736
bridged.GlobalAccessInst_getGlobal().globalVar
714737
}
@@ -733,7 +756,7 @@ final public class DynamicFunctionRefInst : FunctionRefBaseInst {
733756
final public class PreviousDynamicFunctionRefInst : FunctionRefBaseInst {
734757
}
735758

736-
final public class GlobalAddrInst : GlobalAccessInst, VarDeclInstruction {
759+
final public class GlobalAddrInst : GlobalAccessInstruction, VarDeclInstruction {
737760
public var varDecl: VarDecl? {
738761
VarDecl(bridged: bridged.GlobalAddr_getDecl())
739762
}
@@ -743,10 +766,12 @@ final public class GlobalAddrInst : GlobalAccessInst, VarDeclInstruction {
743766
}
744767
}
745768

746-
final public class GlobalValueInst : GlobalAccessInst {
769+
final public class GlobalValueInst : GlobalAccessInstruction {
747770
public var isBare: Bool { bridged.GlobalValueInst_isBare() }
748771
}
749772

773+
final public class BaseAddrForOffsetInst : SingleValueInstruction {}
774+
750775
final public class AllocGlobalInst : Instruction {
751776
public var global: GlobalVariable {
752777
bridged.AllocGlobalInst_getGlobal().globalVar
@@ -788,6 +813,8 @@ final public class StringLiteralInst : SingleValueInstruction {
788813
}
789814
}
790815

816+
final public class HasSymbolInst : SingleValueInstruction {}
817+
791818
final public class TupleInst : SingleValueInstruction, ForwardingInstruction {}
792819

793820
final public class TupleExtractInst : SingleValueInstruction, UnaryInstruction, ForwardingInstruction {
@@ -897,6 +924,12 @@ class ConvertFunctionInst : SingleValueInstruction, ConversionInstruction {
897924
final public
898925
class ThinToThickFunctionInst : SingleValueInstruction, ConversionInstruction {}
899926

927+
final public class ThickToObjCMetatypeInst : SingleValueInstruction, ConversionInstruction {}
928+
final public class ObjCToThickMetatypeInst : SingleValueInstruction, ConversionInstruction {}
929+
930+
final public class CopyBlockInst : SingleValueInstruction {}
931+
final public class CopyBlockWithoutEscapingInst : SingleValueInstruction {}
932+
900933
final public
901934
class ConvertEscapeToNoEscapeInst : SingleValueInstruction, UnaryInstruction {
902935
public var fromFunction: Value { operand.value }
@@ -920,6 +953,8 @@ class GetAsyncContinuationInst : SingleValueInstruction {}
920953
final public
921954
class GetAsyncContinuationAddrInst : SingleValueInstruction, UnaryInstruction {}
922955

956+
final public class ExtractExecutorInst : SingleValueInstruction {}
957+
923958
final public
924959
class MarkDependenceInst : SingleValueInstruction, ForwardingInstruction {
925960
public enum DependenceKind: Int32 {
@@ -1002,6 +1037,8 @@ final public class ProjectBoxInst : SingleValueInstruction, UnaryInstruction {
10021037
public var fieldIndex: Int { bridged.ProjectBoxInst_fieldIndex() }
10031038
}
10041039

1040+
final public class ProjectExistentialBoxInst : SingleValueInstruction, UnaryInstruction {}
1041+
10051042
public protocol CopyingInstruction : SingleValueInstruction, UnaryInstruction {}
10061043

10071044
final public class CopyValueInst : SingleValueInstruction, UnaryInstruction, CopyingInstruction {
@@ -1012,6 +1049,11 @@ final public class ExplicitCopyValueInst : SingleValueInstruction, UnaryInstruct
10121049
public var fromValue: Value { operand.value }
10131050
}
10141051

1052+
final public class UnownedCopyValueInst : SingleValueInstruction, UnaryInstruction, CopyingInstruction {}
1053+
final public class WeakCopyValueInst : SingleValueInstruction, UnaryInstruction, CopyingInstruction {}
1054+
1055+
final public class UncheckedOwnershipConversionInst : SingleValueInstruction {}
1056+
10151057
final public class MoveValueInst : SingleValueInstruction, UnaryInstruction {
10161058
public var fromValue: Value { operand.value }
10171059

@@ -1025,8 +1067,8 @@ final public class DropDeinitInst : SingleValueInstruction, UnaryInstruction {
10251067
}
10261068

10271069
final public class StrongCopyUnownedValueInst : SingleValueInstruction, UnaryInstruction {}
1028-
10291070
final public class StrongCopyUnmanagedValueInst : SingleValueInstruction, UnaryInstruction {}
1071+
final public class StrongCopyWeakValueInst : SingleValueInstruction, UnaryInstruction {}
10301072

10311073
final public class EndCOWMutationInst : SingleValueInstruction, UnaryInstruction {
10321074
public var instance: Value { operand.value }
@@ -1055,6 +1097,8 @@ final public class ApplyInst : SingleValueInstruction, FullApplySite {
10551097
public var specializationInfo: SpecializationInfo { bridged.ApplyInst_getSpecializationInfo() }
10561098
}
10571099

1100+
final public class FunctionExtractIsolationInst : SingleValueInstruction {}
1101+
10581102
final public class ClassMethodInst : SingleValueInstruction, UnaryInstruction {}
10591103

10601104
final public class SuperMethodInst : SingleValueInstruction, UnaryInstruction {}
@@ -1072,6 +1116,8 @@ final public class IsEscapingClosureInst : SingleValueInstruction, UnaryInstruct
10721116
final public class MarkUnresolvedNonCopyableValueInst
10731117
: SingleValueInstruction, UnaryInstruction, ConversionInstruction {}
10741118

1119+
final public class MarkUnresolvedReferenceBindingInst : SingleValueInstruction {}
1120+
10751121
final public class MarkUnresolvedMoveAddrInst : Instruction, SourceDestAddrInstruction {
10761122
public var isTakeOfSrc: Bool { true }
10771123
public var isInitializationOfDest: Bool { true }
@@ -1083,6 +1129,8 @@ final public class CopyableToMoveOnlyWrapperValueInst
10831129
final public class MoveOnlyWrapperToCopyableValueInst
10841130
: SingleValueInstruction, UnaryInstruction, ConversionInstruction {}
10851131

1132+
final public class MoveOnlyWrapperToCopyableBoxInst : SingleValueInstruction {}
1133+
10861134
final public class CopyableToMoveOnlyWrapperAddrInst
10871135
: SingleValueInstruction, UnaryInstruction {}
10881136

@@ -1120,6 +1168,9 @@ final public class PackElementSetInst: SingleValueInstruction {}
11201168
final public class DifferentiableFunctionInst: SingleValueInstruction, ForwardingInstruction {}
11211169

11221170
final public class LinearFunctionInst: SingleValueInstruction, ForwardingInstruction {}
1171+
final public class DifferentiableFunctionExtractInst: SingleValueInstruction {}
1172+
final public class LinearFunctionExtractInst: SingleValueInstruction {}
1173+
final public class DifferentiabilityWitnessFunctionInst: SingleValueInstruction {}
11231174

11241175
final public class ProjectBlockStorageInst: SingleValueInstruction, UnaryInstruction {}
11251176

@@ -1147,6 +1198,9 @@ final public class AllocVectorInst : SingleValueInstruction, Allocation, UnaryIn
11471198
public var capacity: Value { operand.value }
11481199
}
11491200

1201+
final public class AllocPackInst : SingleValueInstruction, Allocation {}
1202+
final public class AllocPackMetadataInst : SingleValueInstruction, Allocation {}
1203+
11501204
public class AllocRefInstBase : SingleValueInstruction, Allocation {
11511205
final public var isObjC: Bool { bridged.AllocRefInstBase_isObjc() }
11521206

@@ -1346,7 +1400,7 @@ final public class SwitchEnumInst : TermInst, ForwardingInstruction {
13461400
final public class SwitchEnumAddrInst : TermInst {
13471401
}
13481402

1349-
final public class SelectEnumAddrInst : TermInst {
1403+
final public class SelectEnumAddrInst : SingleValueInstruction {
13501404
}
13511405

13521406
final public class DynamicMethodBranchInst : TermInst {

0 commit comments

Comments
 (0)