@@ -27,6 +27,11 @@ struct FakeBool {
27
27
28
28
class Klass {}
29
29
30
+ struct F {
31
+ let a: Int?
32
+ let e: String
33
+ }
34
+
30
35
sil @external_f : $@convention(thin) () -> ()
31
36
// func testThread3(a : Int32) -> Int32 {
32
37
// (enum b, val) = (a ? (_true, 16) : (_false, 17))
@@ -886,3 +891,44 @@ bb10:
886
891
return %21 : $()
887
892
}
888
893
894
+ // CHECK-LABEL: sil [ossa] @jump_thread_new_phi_arg
895
+ // CHECK: switch_enum %0 : $Optional<F>
896
+ // CHECK: switch_enum {{%[0-9]+}} : $Optional<Int>
897
+ // CHECK-NOT: switch_enum
898
+ // CHECK: } // end sil function 'jump_thread_new_phi_arg'
899
+ sil [ossa] @jump_thread_new_phi_arg : $@convention(thin) (@guaranteed Optional<F>) -> Optional<Int> {
900
+ bb0(%0 : @guaranteed $Optional<F>):
901
+ switch_enum %0 : $Optional<F>, case #Optional.some!enumelt: bb2, case #Optional.none!enumelt: bb1
902
+
903
+ bb1:
904
+ %4 = enum $Optional<Int>, #Optional.none!enumelt
905
+ br bb3(%4 : $Optional<Int>)
906
+
907
+
908
+ bb2(%6 : @guaranteed $F):
909
+ %7 = struct_extract %6 : $F, #F.a
910
+ br bb3(%7 : $Optional<Int>)
911
+
912
+
913
+ bb3(%9 : $Optional<Int>):
914
+ switch_enum %9 : $Optional<Int>, case #Optional.some!enumelt: bb4, case #Optional.none!enumelt: bb5
915
+
916
+ bb4(%11 : $Int):
917
+ br bb8(%9 : $Optional<Int>)
918
+
919
+ bb5:
920
+ switch_enum %0 : $Optional<F>, case #Optional.some!enumelt: bb6, case #Optional.none!enumelt: bb7
921
+
922
+
923
+ bb6(%14 : @guaranteed $F):
924
+ %15 = struct_extract %14 : $F, #F.a
925
+ br bb8(%15 : $Optional<Int>)
926
+
927
+ bb7:
928
+ %17 = enum $Optional<Int>, #Optional.none!enumelt
929
+ br bb8(%17 : $Optional<Int>)
930
+
931
+
932
+ bb8(%19 : $Optional<Int>):
933
+ return %19 : $Optional<Int>
934
+ }
0 commit comments