Skip to content

Commit 422fe83

Browse files
aslclackary
authored andcommitted
Ensure we are using mapped SIL type for switch_enum case and not the original lowered one (#73385)
Fixes #73018 (cherry picked from commit e7e2ad1)
1 parent db4aa81 commit 422fe83

File tree

2 files changed

+89
-2
lines changed

2 files changed

+89
-2
lines changed

lib/IRGen/LoadableByAddress.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4044,8 +4044,8 @@ class RewriteUser : SILInstructionVisitor<RewriteUser> {
40444044

40454045
SILBuilder caseBuilder = assignment.getBuilder(caseBB->begin());
40464046
auto *caseAddr =
4047-
caseBuilder.createUncheckedTakeEnumDataAddr(loc, opdAddr, caseDecl);
4048-
4047+
caseBuilder.createUncheckedTakeEnumDataAddr(loc, opdAddr, caseDecl,
4048+
caseArg->getType().getAddressType());
40494049
if (assignment.isLargeLoadableType(caseArg->getType())) {
40504050
assignment.mapValueToAddress(caseArg, caseAddr);
40514051
assignment.markBlockArgumentForDeletion(caseBB);
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// RUN: %target-swift-frontend %s -Xllvm -sil-print-after=loadable-address -Xllvm -verify-continue-on-failure -c -o %t/t.o 2>&1 | %FileCheck %s
2+
3+
// This used to trigger an assertion due to LoadableByAddress not doing proper mapping of
4+
// switch_enum arguments during rewriting
5+
6+
import Builtin
7+
import Swift
8+
9+
typealias X = Int
10+
typealias LargeX = (() -> X, () -> X, () -> X, () -> X, () -> X, () -> X, () -> X, () -> X, () -> X)
11+
12+
enum enum1 {
13+
case bb0(LargeX)
14+
}
15+
16+
enum enum2 {
17+
case bb0(LargeX)
18+
}
19+
20+
enum large_enum {
21+
case bb1((enum1, X))
22+
case bb2((enum2, X))
23+
}
24+
25+
sil @test1 : $@convention(thin) (@guaranteed large_enum) -> () {
26+
// CHECK-LABEL: sil @test1
27+
bb0(%arg : $large_enum):
28+
%loc = alloc_stack $(@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
29+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
30+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
31+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
32+
@callee_guaranteed () -> @owned X)
33+
switch_enum %arg : $large_enum, case #large_enum.bb1!enumelt: bb1, case #large_enum.bb2!enumelt: bb2
34+
35+
bb1(%e1 : $(enum1, X)):
36+
// CHECK: %[[ADDR1:.*]] = unchecked_take_enum_data_addr %{{.*}} : $*enum1, #enum1.bb0!enumelt
37+
// CHECK: copy_addr [take] %[[ADDR1]] to [init] %1 : $*(@callee_guaranteed () -> @owned Int, @callee_guaranteed () -> @owned Int, @callee_guaranteed () -> @owned Int, @callee_guaranteed () -> @owned Int, @callee_guaranteed () -> @owned Int, @callee_guaranteed () -> @owned Int, @callee_guaranteed () -> @owned Int, @callee_guaranteed () -> @owned Int, @callee_guaranteed () -> @owned Int)
38+
%e11 = tuple_extract %e1 : $(enum1, X), 0
39+
switch_enum %e11 : $enum1, case #enum1.bb0!enumelt: bb11
40+
41+
bb11(%p1 : $((@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
42+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
43+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
44+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
45+
@callee_guaranteed () -> @owned X))):
46+
br bb3(%p1 : $((@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
47+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
48+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
49+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
50+
@callee_guaranteed () -> @owned X)))
51+
52+
bb2(%e2 : $(enum2, X)):
53+
// CHECK: %[[ADDR2:.*]] = unchecked_take_enum_data_addr %{{.*}} : $*enum2, #enum2.bb0!enumelt
54+
// CHECK: copy_addr [take] %[[ADDR2]] to [init] %1 : $*(@callee_guaranteed () -> @owned Int, @callee_guaranteed () -> @owned Int, @callee_guaranteed () -> @owned Int, @callee_guaranteed () -> @owned Int, @callee_guaranteed () -> @owned Int, @callee_guaranteed () -> @owned Int, @callee_guaranteed () -> @owned Int, @callee_guaranteed () -> @owned Int, @callee_guaranteed () -> @owned Int)
55+
%e22 = tuple_extract %e2 : $(enum2, X), 0
56+
switch_enum %e22 : $enum2, case #enum2.bb0!enumelt: bb22
57+
58+
bb22(%p2 : $((@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
59+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
60+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
61+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
62+
@callee_guaranteed () -> @owned X))):
63+
br bb3(%p2 : $((@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
64+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
65+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
66+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
67+
@callee_guaranteed () -> @owned X)))
68+
69+
bb3(%p3 : $((@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
70+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
71+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
72+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
73+
@callee_guaranteed () -> @owned X))):
74+
store %p3 to %loc : $*(@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
75+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
76+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
77+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
78+
@callee_guaranteed () -> @owned X)
79+
80+
dealloc_stack %loc : $*(@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
81+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
82+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
83+
@callee_guaranteed () -> @owned X, @callee_guaranteed () -> @owned X,
84+
@callee_guaranteed () -> @owned X)
85+
%t = tuple ()
86+
return %t : $()
87+
}

0 commit comments

Comments
 (0)