Skip to content

Commit 9314f86

Browse files
committed
Enable inject_enum_addr silcombine in ossa
1 parent b21b912 commit 9314f86

File tree

2 files changed

+74
-61
lines changed

2 files changed

+74
-61
lines changed

lib/SILOptimizer/SILCombiner/SILCombinerMiscVisitors.cpp

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -945,9 +945,7 @@ static SILValue createValueFromAddr(SILValue addr, SILBuilder *builder,
945945
/// We leave the cleaning up to mem2reg.
946946
SILInstruction *
947947
SILCombiner::visitInjectEnumAddrInst(InjectEnumAddrInst *IEAI) {
948-
if (IEAI->getFunction()->hasOwnership())
949-
return nullptr;
950-
948+
auto *func = IEAI->getFunction();
951949
// Given an inject_enum_addr of a concrete type without payload, promote it to
952950
// a store of an enum. Mem2reg/load forwarding will clean things up for us. We
953951
// can't handle the payload case here due to the flow problems caused by the
@@ -1076,8 +1074,10 @@ SILCombiner::visitInjectEnumAddrInst(InjectEnumAddrInst *IEAI) {
10761074
EnumInst *E =
10771075
Builder.createEnum(IEAI->getLoc(), SILValue(), IEAI->getElement(),
10781076
IEAI->getOperand()->getType().getObjectType());
1079-
Builder.createStore(IEAI->getLoc(), E, IEAI->getOperand(),
1080-
StoreOwnershipQualifier::Unqualified);
1077+
auto storeQual = !func->hasOwnership()
1078+
? StoreOwnershipQualifier::Unqualified
1079+
: StoreOwnershipQualifier::Trivial;
1080+
Builder.createStore(IEAI->getLoc(), E, IEAI->getOperand(), storeQual);
10811081
return eraseInstFromFunction(*IEAI);
10821082
}
10831083

@@ -1194,8 +1194,13 @@ SILCombiner::visitInjectEnumAddrInst(InjectEnumAddrInst *IEAI) {
11941194
EnumInst *E = Builder.createEnum(
11951195
DataAddrInst->getLoc(), en, DataAddrInst->getElement(),
11961196
DataAddrInst->getOperand()->getType().getObjectType());
1197+
auto storeQual = !func->hasOwnership()
1198+
? StoreOwnershipQualifier::Unqualified
1199+
: DataAddrInst->getOperand()->getType().isTrivial(*func)
1200+
? StoreOwnershipQualifier::Trivial
1201+
: StoreOwnershipQualifier::Init;
11971202
Builder.createStore(DataAddrInst->getLoc(), E, DataAddrInst->getOperand(),
1198-
StoreOwnershipQualifier::Unqualified);
1203+
storeQual);
11991204
// Cleanup.
12001205
getInstModCallbacks().notifyWillBeDeleted(DataAddrInst);
12011206
deleter.forceDeleteWithUsers(DataAddrInst);
@@ -1265,14 +1270,22 @@ SILCombiner::visitInjectEnumAddrInst(InjectEnumAddrInst *IEAI) {
12651270
elemType.getObjectType(), &*Builder.getInsertionPoint(),
12661271
Builder.getBuilderContext(), /*noUndef*/ true);
12671272
} else {
1268-
enumValue = Builder.createLoad(DataAddrInst->getLoc(), AllocStack,
1269-
LoadOwnershipQualifier::Unqualified);
1273+
auto loadQual = !func->hasOwnership() ? LoadOwnershipQualifier::Unqualified
1274+
: DataAddrInst->getOperand()->getType().isTrivial(*func)
1275+
? LoadOwnershipQualifier::Trivial
1276+
: LoadOwnershipQualifier::Take;
1277+
enumValue =
1278+
Builder.createLoad(DataAddrInst->getLoc(), AllocStack, loadQual);
12701279
}
12711280
EnumInst *E = Builder.createEnum(
12721281
DataAddrInst->getLoc(), enumValue, DataAddrInst->getElement(),
12731282
DataAddrInst->getOperand()->getType().getObjectType());
1283+
auto storeQual = !func->hasOwnership() ? StoreOwnershipQualifier::Unqualified
1284+
: DataAddrInst->getOperand()->getType().isTrivial(*func)
1285+
? StoreOwnershipQualifier::Trivial
1286+
: StoreOwnershipQualifier::Init;
12741287
Builder.createStore(DataAddrInst->getLoc(), E, DataAddrInst->getOperand(),
1275-
StoreOwnershipQualifier::Unqualified);
1288+
storeQual);
12761289
Builder.createDeallocStack(DataAddrInst->getLoc(), AllocStack);
12771290
eraseInstFromFunction(*DataAddrInst);
12781291
return eraseInstFromFunction(*IEAI);

test/SILOptimizer/sil_combine_ossa.sil

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,20 +1347,20 @@ bb3(%16 : $Int32): // Preds: bb1 bb2
13471347
}
13481348

13491349
// CHECK-LABEL: sil [ossa] @enum_promotion_of_concrete_types
1350-
// XHECK: bb0([[INT_PTR:%[0-9]+]]
1351-
// XHECK-NEXT: [[ALLOCA1:%[0-9]+]] = alloc_stack $FakeOptional<Builtin.Int1>
1352-
// XHECK-NEXT: [[ENUM1:%[0-9]+]] = enum $FakeOptional<Builtin.Int1>, #FakeOptional.none!enumelt
1353-
// XHECK-NEXT: store [[ENUM1]] to [trivial] [[ALLOCA1]]
1354-
// XHECK-NEXT: [[ALLOCA2:%[0-9]+]] = alloc_stack $FakeOptional<Builtin.Int1>
1355-
// XHECK-NEXT: [[INT:%[0-9]+]] = load [trivial] [[INT_PTR]] : $*Builtin.Int1
1356-
// XHECK-NEXT: [[ENUM2:%[0-9]+]] = enum $FakeOptional<Builtin.Int1>, #FakeOptional.some!enumelt, [[INT]] : $Builtin.Int1
1357-
// XHECK-NEXT: store [[ENUM2]] to [trivial] [[ALLOCA2]] : $*FakeOptional<Builtin.Int1>
1358-
// XHECK-NEXT: [[RESULT1:%[0-9]+]] = load [trivial] [[ALLOCA1]]
1359-
// XHECK-NEXT: [[RESULT2:%[0-9]+]] = load [trivial] [[ALLOCA2]]
1360-
// XHECK-NEXT: [[RESULT:%[0-9]+]] = tuple ([[RESULT1]] : $FakeOptional<Builtin.Int1>, [[RESULT2]] : $FakeOptional<Builtin.Int1>)
1361-
// XHECK-NEXT: dealloc_stack
1362-
// XHECK-NEXT: dealloc_stack
1363-
// XHECK-NEXT: return [[RESULT]]
1350+
// CHECK: bb0([[INT_PTR:%[0-9]+]]
1351+
// CHECK-NEXT: [[ALLOCA1:%[0-9]+]] = alloc_stack $FakeOptional<Builtin.Int1>
1352+
// CHECK-NEXT: [[ENUM1:%[0-9]+]] = enum $FakeOptional<Builtin.Int1>, #FakeOptional.none!enumelt
1353+
// CHECK-NEXT: store [[ENUM1]] to [trivial] [[ALLOCA1]]
1354+
// CHECK-NEXT: [[ALLOCA2:%[0-9]+]] = alloc_stack $FakeOptional<Builtin.Int1>
1355+
// CHECK-NEXT: [[INT:%[0-9]+]] = load [trivial] [[INT_PTR]] : $*Builtin.Int1
1356+
// CHECK-NEXT: [[ENUM2:%[0-9]+]] = enum $FakeOptional<Builtin.Int1>, #FakeOptional.some!enumelt, [[INT]] : $Builtin.Int1
1357+
// CHECK-NEXT: store [[ENUM2]] to [trivial] [[ALLOCA2]] : $*FakeOptional<Builtin.Int1>
1358+
// CHECK-NEXT: [[RESULT1:%[0-9]+]] = load [trivial] [[ALLOCA1]]
1359+
// CHECK-NEXT: [[RESULT2:%[0-9]+]] = load [trivial] [[ALLOCA2]]
1360+
// CHECK-NEXT: [[RESULT:%[0-9]+]] = tuple ([[RESULT1]] : $FakeOptional<Builtin.Int1>, [[RESULT2]] : $FakeOptional<Builtin.Int1>)
1361+
// CHECK-NEXT: dealloc_stack
1362+
// CHECK-NEXT: dealloc_stack
1363+
// CHECK-NEXT: return [[RESULT]]
13641364
sil [ossa] @enum_promotion_of_concrete_types : $@convention(thin) (@in Builtin.Int1) -> (FakeOptional<Builtin.Int1>, FakeOptional<Builtin.Int1>) {
13651365
bb0(%0 : $*Builtin.Int1):
13661366
%1 = alloc_stack $FakeOptional<Builtin.Int1>
@@ -1384,24 +1384,24 @@ bb0(%0 : $*Builtin.Int1):
13841384
}
13851385

13861386
// CHECK-LABEL: sil [ossa] @enum_promotion_case2
1387-
// XHECK: bb0([[B_PTR:%[0-9]+]]
1388-
// XHECK-NEXT: [[ALLOCA:%[0-9]+]] = alloc_stack $FakeOptional<B>
1389-
// XHECK-NEXT: [[B_PTR_COPY_FOR_ENUM:%.*]] = copy_value [[B_PTR]]
1387+
// CHECK: bb0([[B_PTR:%[0-9]+]]
1388+
// CHECK-NEXT: [[ALLOCA:%[0-9]+]] = alloc_stack $FakeOptional<B>
1389+
// CHECK-NEXT: [[B_PTR_COPY_FOR_ENUM:%.*]] = copy_value [[B_PTR]]
13901390
// This copy is the copy that was between the init_enum_data_addr/inject_enum_addr
1391-
// XHECK-NEXT: [[B_PTR_COPY_NOT_OBSTRUCTING:%.*]] = copy_value [[B_PTR]]
1392-
// XHECK-NEXT: [[ENUM:%[0-9]+]] = enum $FakeOptional<B>, #FakeOptional.some!enumelt, [[B_PTR_COPY_FOR_ENUM]] : $B
1393-
// XHECK-NEXT: store [[ENUM]] to [init] [[ALLOCA]]
1394-
// XHECK-NEXT: [[RESULT:%[0-9]+]] = load [take] [[ALLOCA]]
1395-
// XHECK-NEXT: dealloc_stack
1396-
// XHECK-NEXT: destroy_value [[B_PTR]]
1397-
// XHECK-NEXT: br bb1
1398-
// XHECK: bb1:
1399-
// XHECK-NEXT: // function_ref
1400-
// XHECK-NEXT: function_ref
1401-
// XHECK-NEXT: apply
1402-
// XHECK-NEXT: destroy_value [[B_PTR_COPY_NOT_OBSTRUCTING]]
1403-
// XHECK-NEXT: return [[RESULT]]
1404-
// XHECK: } // end sil function 'enum_promotion_case2'
1391+
// CHECK-NEXT: [[B_PTR_COPY_NOT_OBSTRUCTING:%.*]] = copy_value [[B_PTR]]
1392+
// CHECK-NEXT: [[ENUM:%[0-9]+]] = enum $FakeOptional<B>, #FakeOptional.some!enumelt, [[B_PTR_COPY_FOR_ENUM]] : $B
1393+
// CHECK-NEXT: store [[ENUM]] to [init] [[ALLOCA]]
1394+
// CHECK-NEXT: [[RESULT:%[0-9]+]] = load [take] [[ALLOCA]]
1395+
// CHECK-NEXT: dealloc_stack
1396+
// CHECK-NEXT: destroy_value [[B_PTR]]
1397+
// CHECK-NEXT: br bb1
1398+
// CHECK: bb1:
1399+
// CHECK-NEXT: // function_ref
1400+
// CHECK-NEXT: function_ref
1401+
// CHECK-NEXT: apply
1402+
// CHECK-NEXT: destroy_value [[B_PTR_COPY_NOT_OBSTRUCTING]]
1403+
// CHECK-NEXT: return [[RESULT]]
1404+
// CHECK: } // end sil function 'enum_promotion_case2'
14051405
sil [ossa] @enum_promotion_case2 : $@convention(thin) (@owned B) -> @owned FakeOptional<B> {
14061406
bb0(%0 : @owned $B):
14071407
%2 = alloc_stack $FakeOptional<B>
@@ -1428,27 +1428,27 @@ bb1:
14281428

14291429
// Negative test corresponding to the previous test.
14301430
// CHECK-LABEL: sil [ossa] @no_enum_promotion_of_non_concrete_types
1431-
// XHECK: bb0
1432-
// XHECK-NEXT: alloc_stack $FakeOptional<T>
1433-
// XHECK-NEXT: inject_enum_addr {{%[0-9]+}} : $*FakeOptional<T>, #FakeOptional.none!enumelt
1434-
// XHECK-NEXT: alloc_stack $FakeOptional<T>
1435-
// XHECK-NEXT: init_enum_data_addr {{%[0-9]+}} : $*FakeOptional<T>, #FakeOptional.some!enumelt
1436-
// XHECK-NEXT: copy_addr
1437-
// XHECK-NEXT: inject_enum_addr
1438-
// XHECK-NEXT: cond_br
1439-
// XHECK: bb1:
1440-
// XHECK-NEXT: copy_addr
1441-
// XHECK-NEXT: destroy_addr
1442-
// XHECK-NEXT: br bb3
1443-
// XHECK: bb2:
1444-
// XHECK-NEXT: copy_addr
1445-
// XHECK-NEXT: destroy_addr
1446-
// XHECK-NEXT: br bb3
1447-
// XHECK: bb3
1448-
// XHECK-NEXT: tuple
1449-
// XHECK-NEXT: dealloc_stack
1450-
// XHECK-NEXT: dealloc_stack
1451-
// XHECK-NEXT: return
1431+
// CHECK: bb0
1432+
// CHECK-NEXT: alloc_stack $FakeOptional<T>
1433+
// CHECK-NEXT: inject_enum_addr {{%[0-9]+}} : $*FakeOptional<T>, #FakeOptional.none!enumelt
1434+
// CHECK-NEXT: alloc_stack $FakeOptional<T>
1435+
// CHECK-NEXT: init_enum_data_addr {{%[0-9]+}} : $*FakeOptional<T>, #FakeOptional.some!enumelt
1436+
// CHECK-NEXT: copy_addr
1437+
// CHECK-NEXT: inject_enum_addr
1438+
// CHECK-NEXT: cond_br
1439+
// CHECK: bb1:
1440+
// CHECK-NEXT: copy_addr
1441+
// CHECK-NEXT: destroy_addr
1442+
// CHECK-NEXT: br bb3
1443+
// CHECK: bb2:
1444+
// CHECK-NEXT: copy_addr
1445+
// CHECK-NEXT: destroy_addr
1446+
// CHECK-NEXT: br bb3
1447+
// CHECK: bb3
1448+
// CHECK-NEXT: tuple
1449+
// CHECK-NEXT: dealloc_stack
1450+
// CHECK-NEXT: dealloc_stack
1451+
// CHECK-NEXT: return
14521452
sil [ossa] @no_enum_promotion_of_non_concrete_types : $@convention(thin) <T> (@inout T, Builtin.Int1) -> @out FakeOptional<T> {
14531453
bb0(%0 : $*FakeOptional<T>, %1 : $*T, %2 : $Builtin.Int1):
14541454
%3 = alloc_stack $FakeOptional<T>

0 commit comments

Comments
 (0)