Skip to content

Commit 6659491

Browse files
committed
Enable SimplifyCFG::simplifySwitchEnumUnreachableBlocks for OSSA
1 parent 2361270 commit 6659491

File tree

3 files changed

+163
-6
lines changed

3 files changed

+163
-6
lines changed

lib/SILOptimizer/Transforms/SimplifyCFG.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1715,10 +1715,6 @@ static bool isOnlyUnreachable(SILBasicBlock *BB) {
17151715
/// switch_enum where all but one block consists of just an
17161716
/// "unreachable" with an unchecked_enum_data and branch.
17171717
bool SimplifyCFG::simplifySwitchEnumUnreachableBlocks(SwitchEnumInst *SEI) {
1718-
if (!EnableOSSARewriteTerminator && Fn.hasOwnership()) {
1719-
if (!SEI->getOperand()->getType().isTrivial(Fn))
1720-
return false;
1721-
}
17221718
auto Count = SEI->getNumCases();
17231719

17241720
SILBasicBlock *Dest = nullptr;

lib/SILOptimizer/UtilityPasses/UnitTestRunner.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,20 @@ struct SimplifyCFGSimplifySwitchEnumBlock : UnitTest {
295295
}
296296
};
297297

298+
struct SimplifyCFGSimplifySwitchEnumUnreachableBlocks : UnitTest {
299+
SimplifyCFGSimplifySwitchEnumUnreachableBlocks(UnitTestRunner *pass)
300+
: UnitTest(pass) {}
301+
void invoke(Arguments &arguments) override {
302+
auto *passToRun = cast<SILFunctionTransform>(createSimplifyCFG());
303+
passToRun->injectPassManager(getPass()->getPassManager());
304+
passToRun->injectFunction(getFunction());
305+
SimplifyCFG(*getFunction(), *passToRun, /*VerifyAll=*/false,
306+
/*EnableJumpThread=*/false)
307+
.simplifySwitchEnumUnreachableBlocks(
308+
cast<SwitchEnumInst>(arguments.takeInstruction()));
309+
}
310+
};
311+
298312
// Arguments:
299313
// - string: list of characters, each of which specifies subsequent arguments
300314
// - A: (block) argument
@@ -415,9 +429,16 @@ void UnitTestRunner::withTest(StringRef name, Doit doit) {
415429
ADD_UNIT_TEST_SUBCLASS("is-deinit-barrier", IsDeinitBarrierTest)
416430
ADD_UNIT_TEST_SUBCLASS("pruned-liveness-boundary-with-list-of-last-users-insertion-points", PrunedLivenessBoundaryWithListOfLastUsersInsertionPointsTest)
417431
ADD_UNIT_TEST_SUBCLASS("shrink-borrow-scope", ShrinkBorrowScopeTest)
418-
ADD_UNIT_TEST_SUBCLASS("simplify-cfg-canonicalize-switch-enum", SimplifyCFGCanonicalizeSwitchEnum)
432+
433+
// SimplifyCFG unit tests
434+
ADD_UNIT_TEST_SUBCLASS("simplify-cfg-canonicalize-switch-enum",
435+
SimplifyCFGCanonicalizeSwitchEnum)
419436
ADD_UNIT_TEST_SUBCLASS("simplify-cfg-simplify-switch-enum-block",
420437
SimplifyCFGSimplifySwitchEnumBlock)
438+
ADD_UNIT_TEST_SUBCLASS(
439+
"simplify-cfg-simplify-switch-enum-unreachable-blocks",
440+
SimplifyCFGSimplifySwitchEnumUnreachableBlocks)
441+
421442
ADD_UNIT_TEST_SUBCLASS("test-specification-parsing", TestSpecificationTest)
422443
ADD_UNIT_TEST_SUBCLASS("visit-adjacent-reborrows-of-phi", VisitAdjacentReborrowsOfPhiTest)
423444
/// [new_tests] Add the new mapping from string to subclass above this line.

test/SILOptimizer/simplify_cfg_ossa_switch_enum.sil

Lines changed: 141 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ bb2:
211211
br bb3(%4 : $FakeOptional<Klass>)
212212

213213
bb3(%6 :@owned $FakeOptional<Klass>):
214-
test_specification "simplify-cfg-simplify-switch-enum-block @instruction[7]"
214+
test_specification "simplify-cfg-simplify-switch-enum-block @instruction[5]"
215215
switch_enum %6 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb4, case #FakeOptional.none!enumelt: bb5
216216

217217
bb4(%8 : @owned $Klass):
@@ -226,3 +226,143 @@ bb6:
226226
return %t : $()
227227
}
228228

229+
sil [ossa] @test_simplify_switch_enum_unreachable1 : $@convention(thin) (@owned Klass) -> () {
230+
bb0(%0 : @owned $Klass):
231+
test_specification "simplify-cfg-simplify-switch-enum-unreachable-blocks @instruction[1]"
232+
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %0 : $Klass
233+
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
234+
235+
bb2:
236+
unreachable
237+
238+
bb1(%3 : @owned $Klass):
239+
destroy_value %3 : $Klass
240+
unreachable
241+
242+
bb3:
243+
%t = tuple ()
244+
return %t : $()
245+
}
246+
247+
sil [ossa] @test_simplify_switch_enum_unreachable2 : $@convention(thin) (@owned Klass) -> () {
248+
bb0(%0 : @owned $Klass):
249+
test_specification "simplify-cfg-simplify-switch-enum-unreachable-blocks @instruction[1]"
250+
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %0 : $Klass
251+
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
252+
253+
bb2:
254+
unreachable
255+
256+
bb1(%3 : @owned $Klass):
257+
destroy_value %3 : $Klass
258+
br bb3
259+
260+
bb3:
261+
%t = tuple ()
262+
return %t : $()
263+
}
264+
265+
sil [ossa] @test_simplify_switch_enum_unreachable3 : $@convention(thin) (@owned Klass) -> () {
266+
bb0(%0 : @owned $Klass):
267+
test_specification "simplify-cfg-simplify-switch-enum-unreachable-blocks @instruction[1]"
268+
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %0 : $Klass
269+
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
270+
271+
bb2:
272+
br bb3
273+
274+
bb1(%3 : @owned $Klass):
275+
destroy_value %3 : $Klass
276+
unreachable
277+
278+
bb3:
279+
%t = tuple ()
280+
return %t : $()
281+
}
282+
283+
// CHECK-LABEL: sil [ossa] @test_simplify_switch_enum_unreachable4 :
284+
// CHECK-NOT: switch_enum
285+
// CHECK-LABEL: } // end sil function 'test_simplify_switch_enum_unreachable4'
286+
sil [ossa] @test_simplify_switch_enum_unreachable4 : $@convention(thin) (@guaranteed Klass) -> () {
287+
bb0(%0 : @guaranteed $Klass):
288+
test_specification "simplify-cfg-simplify-switch-enum-unreachable-blocks @instruction[1]"
289+
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %0 : $Klass
290+
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
291+
292+
bb2:
293+
unreachable
294+
295+
bb1(%3 : @guaranteed $Klass):
296+
unreachable
297+
298+
bb3:
299+
%t = tuple ()
300+
return %t : $()
301+
}
302+
303+
// CHECK-LABEL: sil [ossa] @test_simplify_switch_enum_unreachable5 :
304+
// CHECK-NOT: switch_enum
305+
// CHECK-LABEL: } // end sil function 'test_simplify_switch_enum_unreachable5'
306+
sil [ossa] @test_simplify_switch_enum_unreachable5 : $@convention(thin) (@owned Klass) -> () {
307+
bb0(%0 : @owned $Klass):
308+
test_specification "simplify-cfg-simplify-switch-enum-unreachable-blocks @instruction[2]"
309+
%b = begin_borrow %0 : $Klass
310+
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %b : $Klass
311+
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
312+
313+
bb2:
314+
unreachable
315+
316+
bb1(%3 : @guaranteed $Klass):
317+
unreachable
318+
319+
bb3:
320+
end_borrow %b : $Klass
321+
destroy_value %0 : $Klass
322+
%t = tuple ()
323+
return %t : $()
324+
}
325+
326+
// CHECK-LABEL: sil [ossa] @test_simplify_switch_enum_unreachable6 :
327+
// CHECK-NOT: switch_enum
328+
// CHECK-LABEL: } // end sil function 'test_simplify_switch_enum_unreachable6'
329+
sil [ossa] @test_simplify_switch_enum_unreachable6 : $@convention(thin) (@guaranteed Klass) -> () {
330+
bb0(%0 : @guaranteed $Klass):
331+
test_specification "simplify-cfg-simplify-switch-enum-unreachable-blocks @instruction[1]"
332+
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %0 : $Klass
333+
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
334+
335+
bb2:
336+
unreachable
337+
338+
bb1(%3 : @guaranteed $Klass):
339+
br bb3
340+
341+
bb3:
342+
%t = tuple ()
343+
return %t : $()
344+
}
345+
346+
// CHECK-LABEL: sil [ossa] @test_simplify_switch_enum_unreachable7 :
347+
// CHECK-NOT: switch_enum
348+
// CHECK-LABEL: } // end sil function 'test_simplify_switch_enum_unreachable7'
349+
sil [ossa] @test_simplify_switch_enum_unreachable7 : $@convention(thin) (@owned Klass) -> () {
350+
bb0(%0 : @owned $Klass):
351+
test_specification "simplify-cfg-simplify-switch-enum-unreachable-blocks @instruction[2]"
352+
%b = begin_borrow %0 : $Klass
353+
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %b : $Klass
354+
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
355+
356+
bb2:
357+
unreachable
358+
359+
bb1(%3 : @guaranteed $Klass):
360+
br bb3
361+
362+
bb3:
363+
end_borrow %b : $Klass
364+
destroy_value %0 : $Klass
365+
%t = tuple ()
366+
return %t : $()
367+
}
368+

0 commit comments

Comments
 (0)