diff --git a/include/swift/SIL/Projection.h b/include/swift/SIL/Projection.h index b8d66d7983634..510a0cf78d9d0 100644 --- a/include/swift/SIL/Projection.h +++ b/include/swift/SIL/Projection.h @@ -106,6 +106,7 @@ enum class ProjectionKind : unsigned { Class = PointerIntEnumIndexKindValue<3, ProjectionKind>::value, Enum = PointerIntEnumIndexKindValue<4, ProjectionKind>::value, Box = PointerIntEnumIndexKindValue<5, ProjectionKind>::value, + Access = PointerIntEnumIndexKindValue<6, ProjectionKind>::value, LastIndexKind = Enum, }; @@ -129,6 +130,7 @@ static inline bool isCastProjectionKind(ProjectionKind Kind) { case ProjectionKind::Enum: case ProjectionKind::Box: case ProjectionKind::TailElems: + case ProjectionKind::Access: return false; } } @@ -428,6 +430,7 @@ class Projection { case ProjectionKind::TailElems: case ProjectionKind::Enum: case ProjectionKind::Box: + case ProjectionKind::Access: return false; } @@ -439,6 +442,7 @@ class Projection { case ProjectionKind::Class: case ProjectionKind::Enum: case ProjectionKind::Struct: + case ProjectionKind::Access: return true; case ProjectionKind::BitwiseCast: case ProjectionKind::Index: diff --git a/lib/SIL/Utils/InstructionUtils.cpp b/lib/SIL/Utils/InstructionUtils.cpp index b51e15605b172..a745f28b8b401 100644 --- a/lib/SIL/Utils/InstructionUtils.cpp +++ b/lib/SIL/Utils/InstructionUtils.cpp @@ -31,6 +31,7 @@ SILValue swift::stripOwnershipInsts(SILValue v) { return v; case ValueKind::CopyValueInst: case ValueKind::BeginBorrowInst: + case ValueKind::BeginAccessInst: v = cast(v)->getOperand(0); } } diff --git a/lib/SIL/Utils/Projection.cpp b/lib/SIL/Utils/Projection.cpp index 2881469102ea1..d531b13cea89d 100644 --- a/lib/SIL/Utils/Projection.cpp +++ b/lib/SIL/Utils/Projection.cpp @@ -169,6 +169,11 @@ Projection::Projection(SingleValueInstruction *I) : Value() { assert(getKind() == ProjectionKind::BitwiseCast); break; } + case SILInstructionKind::BeginAccessInst: { + Value = ValueTy(ProjectionKind::Access, uintptr_t(0)); + assert(getKind() == ProjectionKind::Access); + break; + } } } @@ -196,6 +201,7 @@ SILType Projection::getType(SILType BaseType, SILModule &M, case ProjectionKind::BitwiseCast: case ProjectionKind::TailElems: return getCastType(BaseType); + case ProjectionKind::Access: case ProjectionKind::Index: // Index types do not change the underlying type. return BaseType; @@ -237,6 +243,8 @@ Projection::createObjectProjection(SILBuilder &B, SILLocation Loc, return B.createUncheckedRefCast(Loc, Base, getCastType(BaseTy)); case ProjectionKind::BitwiseCast: return B.createUncheckedBitwiseCast(Loc, Base, getCastType(BaseTy)); + case ProjectionKind::Access: + return nullptr; } llvm_unreachable("Unhandled ProjectionKind in switch."); @@ -281,6 +289,8 @@ Projection::createAddressProjection(SILBuilder &B, SILLocation Loc, case ProjectionKind::RefCast: case ProjectionKind::BitwiseCast: return B.createUncheckedAddrCast(Loc, Base, getCastType(BaseTy)); + case ProjectionKind::Access: + return nullptr; } llvm_unreachable("Unhandled ProjectionKind in switch."); @@ -835,6 +845,10 @@ SILValue Projection::getOperandForAggregate(SILInstruction *I) const { } } break; + case ProjectionKind::Access: + if (auto access = dyn_cast(I)) + return access->getOperand(); + break; case ProjectionKind::Class: case ProjectionKind::TailElems: case ProjectionKind::Box: @@ -892,6 +906,7 @@ static bool isSupportedProjection(const Projection &p) { switch (p.getKind()) { case ProjectionKind::Struct: case ProjectionKind::Tuple: + case ProjectionKind::Access: return true; case ProjectionKind::Class: case ProjectionKind::Enum: