@@ -798,6 +798,8 @@ static Operand *getProjectedDefOperand(SILValue value) {
798
798
// / is address-only, then the operand must be address-only and therefore must
799
799
// / mapped to ValueStorage.
800
800
// /
801
+ // / If \p value is an unchecked_bitwise_cast, then return the cast operand.
802
+ // /
801
803
// / open_existential_value must reuse storage because the boxed value is shared
802
804
// / with other instances of the existential. An explicit copy is needed to
803
805
// / obtain an owned value.
@@ -812,6 +814,7 @@ static Operand *getReusedStorageOperand(SILValue value) {
812
814
case ValueKind::OpenExistentialValueInst:
813
815
case ValueKind::OpenExistentialBoxValueInst:
814
816
case ValueKind::UncheckedEnumDataInst:
817
+ case ValueKind::UncheckedBitwiseCastInst:
815
818
return &cast<SingleValueInstruction>(value)->getOperandRef (0 );
816
819
817
820
case ValueKind::SILPhiArgument: {
@@ -2551,9 +2554,16 @@ class UseRewriter : SILInstructionVisitor<UseRewriter> {
2551
2554
// Extract from an opaque tuple.
2552
2555
void visitTupleExtractInst (TupleExtractInst *extractInst);
2553
2556
2554
- void visitUncheckedBitwiseCast (UncheckedBitwiseCastInst *uncheckedCastInst) {
2555
- // FIXME: Unimplemented
2556
- llvm::report_fatal_error (" Unimplemented UncheckedBitwiseCast use." );
2557
+ void
2558
+ visitUncheckedBitwiseCastInst (UncheckedBitwiseCastInst *uncheckedCastInst) {
2559
+ SILValue srcVal = uncheckedCastInst->getOperand ();
2560
+ SILValue srcAddr = pass.valueStorageMap .getStorage (srcVal).storageAddress ;
2561
+
2562
+ auto destAddr = builder.createUncheckedAddrCast (
2563
+ uncheckedCastInst->getLoc (), srcAddr,
2564
+ uncheckedCastInst->getType ().getAddressType ());
2565
+
2566
+ markRewritten (uncheckedCastInst, destAddr);
2557
2567
}
2558
2568
2559
2569
void visitUncheckedEnumDataInst (UncheckedEnumDataInst *enumDataInst);
0 commit comments