Skip to content

Commit 9cb83c3

Browse files
committed
Update ConditionForwarding for @guaranteed forwarding phi support
1 parent 7cc35a1 commit 9cb83c3

File tree

2 files changed

+14
-12
lines changed

2 files changed

+14
-12
lines changed

lib/SILOptimizer/Transforms/ConditionForwarding.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,14 @@ bool ConditionForwarding::tryOptimize(SwitchEnumInst *SEI) {
202202
if (!EI)
203203
return false;
204204

205+
if (getFunction()->hasOwnership() && EI->hasOperand()) {
206+
auto some = EI->getOperand();
207+
if (some->getOwnershipKind() == OwnershipKind::Guaranteed &&
208+
isa<SILFunctionArgument>(some)) {
209+
return false;
210+
}
211+
}
212+
205213
if (CommonBranchBlock && PredPred != CommonBranchBlock)
206214
return false;
207215
CommonBranchBlock = PredPred;

test/SILOptimizer/conditionforwarding_nontrivial_ossa.sil

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ bb6:
7171
return %r : $()
7272
}
7373

74-
// Currently, this is not optimized away because memory behavior of begin_borrow is conservative
74+
// Currently, this is not optimized away because enum has @guaranteed function argument, which
75+
// will need a borrow scope before being forwarded
7576
// CHECK-LABEL: sil [ossa] @simple_forwarding2 :
7677
// CHECK: switch_enum
7778
// CHECK-LABEL: } // end sil function 'simple_forwarding2'
@@ -81,13 +82,11 @@ bb0(%0 : $Builtin.Int1, %1 : @guaranteed $Klass):
8182

8283
bb1:
8384
%2 = enum $E, #E.A!enumelt, %1 : $Klass
84-
%borrow2 = begin_borrow %2 : $E
85-
br bb3(%borrow2 : $E)
85+
br bb3(%2 : $E)
8686

8787
bb2:
8888
%3 = enum $E, #E.B!enumelt, %1 : $Klass
89-
%borrow3 = begin_borrow %3 : $E
90-
br bb3(%borrow3 : $E)
89+
br bb3(%3 : $E)
9190

9291
bb3(%14 : @guaranteed $E):
9392
%15 = function_ref @callee : $@convention(thin) () -> ()
@@ -101,7 +100,6 @@ bb5(%18 : @guaranteed $Klass):
101100
br bb6
102101

103102
bb6:
104-
end_borrow %14 : $E
105103
%r = tuple ()
106104
return %r : $()
107105
}
@@ -187,22 +185,19 @@ bb6:
187185

188186
// CHECK-LABEL: sil [ossa] @simple_switch_enum_forwarding2 :
189187
// CHECK: switch_enum
190-
// CHECK: switch_enum
191188
// CHECK-LABEL: } // end sil function 'simple_switch_enum_forwarding2'
192189
sil [ossa] @simple_switch_enum_forwarding2 : $@convention(thin) (@guaranteed E3) -> () {
193190
bb0(%0 : @guaranteed $E3):
194191
switch_enum %0 : $E3, case #E3.A!enumelt: bb1, default bb2
195192

196193
bb1(%1 : @guaranteed $Klass):
197194
%2 = enum $E, #E.A!enumelt, %1 : $Klass
198-
%borrow2 = begin_borrow %2 : $E
199-
br bb3(%borrow2 : $E)
195+
br bb3(%2 : $E)
200196

201197
bb2(%defaultenum : @guaranteed $E3):
202198
%defaultklass = unchecked_enum_data %defaultenum : $E3, #E3.B!enumelt
203199
%3 = enum $E, #E.B!enumelt, %defaultklass : $Klass
204-
%borrow3 = begin_borrow %3 : $E
205-
br bb3(%borrow3 : $E)
200+
br bb3(%3 : $E)
206201

207202
bb3(%14 : @guaranteed $E):
208203
%15 = function_ref @callee : $@convention(thin) () -> ()
@@ -216,7 +211,6 @@ bb5(%5 : @guaranteed $Klass):
216211
br bb6
217212

218213
bb6:
219-
end_borrow %14 : $E
220214
%r = tuple ()
221215
return %r : $()
222216
}

0 commit comments

Comments
 (0)