Skip to content

Commit 0ff3672

Browse files
committed
SILOptimizer: fix a stupid bug in StackNesting which can cause a miscompile in functions with unreachable blocks.
rdar://problem/47973577
1 parent 9f3db6d commit 0ff3672

File tree

5 files changed

+46
-36
lines changed

5 files changed

+46
-36
lines changed

lib/SILOptimizer/Utils/StackNesting.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ bool StackNesting::solve() {
9797
bool initVal = false;
9898
for (BlockInfo &BI : BlockInfos) {
9999
BI.AliveStackLocsAtEntry.resize(StackLocs.size(), initVal);
100-
initVal = false;
100+
initVal = true;
101101
}
102102

103103
// First step: do a forward dataflow analysis to get the live stack locations

test/SILOptimizer/allocbox_to_stack.sil

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -819,8 +819,6 @@ bb0(%0 : $Int):
819819
// CHECK-NEXT: [[STACK1:%[0-9]+]] = alloc_stack $Bool
820820
// CHECK-NEXT: [[BOX:%[0-9]+]] = alloc_stack $Int
821821
// CHECK: bb1:
822-
// CHECK-NEXT: dealloc_stack [[BOX]]
823-
// CHECK-NEXT: dealloc_stack [[STACK1]]
824822
// CHECK-NEXT: [[STACK2:%[0-9]+]] = alloc_stack $Bool
825823
// CHECK-NEXT: dealloc_stack [[STACK2]]
826824
// CHECK-NEXT: unreachable
@@ -859,7 +857,6 @@ bb2:
859857
// CHECK-NEXT: [[STACK2:%[0-9]+]] = alloc_stack $Bool
860858
// CHECK-NEXT: dealloc_stack [[STACK2]]
861859
// CHECK-NEXT: dealloc_stack [[BOX]]
862-
// CHECK-NEXT: dealloc_stack [[STACK1]]
863860
// CHECK-NEXT: unreachable
864861
// CHECK: bb2:
865862
// CHECK: store
@@ -894,8 +891,6 @@ bb2:
894891
// CHECK-NEXT: [[BOX:%[0-9]+]] = alloc_stack $Int
895892
// CHECK-NEXT: [[STACK:%[0-9]+]] = alloc_stack $Bool
896893
// CHECK: bb1:
897-
// CHECK-NEXT: dealloc_stack [[STACK]]
898-
// CHECK-NEXT: dealloc_stack [[BOX]]
899894
// CHECK-NEXT: unreachable
900895
// CHECK: bb2:
901896
// CHECK: store
@@ -954,7 +949,6 @@ bb2:
954949
// CHECK: bb0(%0 : $Int):
955950
// CHECK-NEXT: [[BOX:%[0-9]+]] = alloc_stack $Int
956951
// CHECK: bb1:
957-
// CHECK-NEXT: dealloc_stack [[BOX]]
958952
// CHECK-NEXT: {{.*}} = alloc_stack $Bool
959953
// CHECK-NEXT: {{.*}} = alloc_stack $Bool
960954
// CHECK-NEXT: unreachable
@@ -1014,30 +1008,60 @@ bb3:
10141008
return %3 : $Int
10151009
}
10161010

1011+
// CHECK-LABEL: sil @nesting_and_unreachable7
1012+
// CHECK: bb0(%0 : $Bool):
1013+
// CHECK-NEXT: [[AB:%[0-9]+]] = alloc_stack $Bool
1014+
// CHECK-NEXT: [[AI:%[0-9]+]] = alloc_stack $Int
1015+
// CHECK-NEXT: cond_br
1016+
// CHECK: bb1:
1017+
// CHECK-NEXT: dealloc_stack [[AI]]
1018+
// CHECK-NEXT: br bb3
1019+
// CHECK: bb2:
1020+
// CHECK-NEXT: dealloc_stack [[AI]]
1021+
// CHECK-NEXT: br bb3
1022+
// CHECK: bb3:
1023+
// CHECK-NEXT: store
1024+
// CHECK-NEXT: load
1025+
// CHECK-NEXT: unreachable
1026+
sil @nesting_and_unreachable7 : $@convention(thin) (Bool) -> Bool {
1027+
bb0(%0 : $Bool):
1028+
%as1 = alloc_stack $Bool
1029+
%1 = alloc_box ${ var Int }
1030+
%1a = project_box %1 : ${ var Int }, 0
1031+
cond_br undef, bb1, bb2
1032+
1033+
bb1:
1034+
strong_release %1 : ${ var Int }
1035+
br bb3
1036+
1037+
bb2:
1038+
strong_release %1 : ${ var Int }
1039+
br bb3
1040+
1041+
bb3:
1042+
store %0 to %as1 : $*Bool
1043+
%3 = load %as1 : $*Bool
1044+
unreachable
1045+
}
10171046
// CHECK-LABEL: sil @nesting_and_unreachable_critical_edge
10181047
// CHECK: bb0(%0 : $Int):
10191048
// CHECK-NEXT: [[BOX:%[0-9]+]] = alloc_stack $Int
10201049
// CHECK-NEXT: [[STACK1:%[0-9]+]] = alloc_stack $Bool
10211050
// CHECK-NEXT: cond_br
10221051
// CHECK: bb1:
1023-
// CHECK-NEXT: dealloc_stack [[STACK1]]
1024-
// CHECK-NEXT: br bb5
1025-
// CHECK: bb2:
10261052
// CHECK-NEXT: [[STACK2:%[0-9]+]] = alloc_stack $Bool
10271053
// CHECK-NEXT: cond_br
1028-
// CHECK: bb3:
1054+
// CHECK: bb2:
10291055
// CHECK-NEXT: dealloc_stack [[STACK2]]
1030-
// CHECK-NEXT: dealloc_stack [[STACK1]]
1031-
// CHECK-NEXT: br bb5
1032-
// CHECK: bb4:
1056+
// CHECK-NEXT: br bb4
1057+
// CHECK: bb3:
10331058
// CHECK: store
10341059
// CHECK: dealloc_stack [[STACK2]]
10351060
// CHECK-NEXT: dealloc_stack [[STACK1]]
10361061
// CHECK-NEXT: dealloc_stack [[BOX]]
10371062
// CHECK-NEXT: tuple
10381063
// CHECK-NEXT: return
1039-
// CHECK: bb5:
1040-
// CHECK-NEXT: dealloc_stack [[BOX]]
1064+
// CHECK: bb4:
10411065
// CHECK-NEXT: unreachable
10421066
sil @nesting_and_unreachable_critical_edge : $(Int) -> () {
10431067
bb0(%0 : $Int):

test/SILOptimizer/allocbox_to_stack_ownership.sil

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -814,8 +814,6 @@ bb0(%0 : $Int):
814814
// CHECK-NEXT: [[STACK1:%[0-9]+]] = alloc_stack $Bool
815815
// CHECK-NEXT: [[BOX:%[0-9]+]] = alloc_stack $Int
816816
// CHECK: bb1:
817-
// CHECK-NEXT: dealloc_stack [[BOX]]
818-
// CHECK-NEXT: dealloc_stack [[STACK1]]
819817
// CHECK-NEXT: [[STACK2:%[0-9]+]] = alloc_stack $Bool
820818
// CHECK-NEXT: dealloc_stack [[STACK2]]
821819
// CHECK-NEXT: unreachable
@@ -854,7 +852,6 @@ bb2:
854852
// CHECK-NEXT: [[STACK2:%[0-9]+]] = alloc_stack $Bool
855853
// CHECK-NEXT: dealloc_stack [[STACK2]]
856854
// CHECK-NEXT: dealloc_stack [[BOX]]
857-
// CHECK-NEXT: dealloc_stack [[STACK1]]
858855
// CHECK-NEXT: unreachable
859856
// CHECK: bb2:
860857
// CHECK: store
@@ -889,8 +886,6 @@ bb2:
889886
// CHECK-NEXT: [[BOX:%[0-9]+]] = alloc_stack $Int
890887
// CHECK-NEXT: [[STACK:%[0-9]+]] = alloc_stack $Bool
891888
// CHECK: bb1:
892-
// CHECK-NEXT: dealloc_stack [[STACK]]
893-
// CHECK-NEXT: dealloc_stack [[BOX]]
894889
// CHECK-NEXT: unreachable
895890
// CHECK: bb2:
896891
// CHECK: store
@@ -949,7 +944,6 @@ bb2:
949944
// CHECK: bb0(%0 : $Int):
950945
// CHECK-NEXT: [[BOX:%[0-9]+]] = alloc_stack $Int
951946
// CHECK: bb1:
952-
// CHECK-NEXT: dealloc_stack [[BOX]]
953947
// CHECK-NEXT: {{.*}} = alloc_stack $Bool
954948
// CHECK-NEXT: {{.*}} = alloc_stack $Bool
955949
// CHECK-NEXT: unreachable
@@ -983,24 +977,19 @@ bb2:
983977
// CHECK-NEXT: [[STACK1:%[0-9]+]] = alloc_stack $Bool
984978
// CHECK-NEXT: cond_br
985979
// CHECK: bb1:
986-
// CHECK-NEXT: dealloc_stack [[STACK1]]
987-
// CHECK-NEXT: br bb5
988-
// CHECK: bb2:
989980
// CHECK-NEXT: [[STACK2:%[0-9]+]] = alloc_stack $Bool
990981
// CHECK-NEXT: cond_br
991-
// CHECK: bb3:
982+
// CHECK: bb2:
992983
// CHECK-NEXT: dealloc_stack [[STACK2]]
993-
// CHECK-NEXT: dealloc_stack [[STACK1]]
994-
// CHECK-NEXT: br bb5
995-
// CHECK: bb4:
984+
// CHECK-NEXT: br bb4
985+
// CHECK: bb3:
996986
// CHECK: store
997987
// CHECK: dealloc_stack [[STACK2]]
998988
// CHECK-NEXT: dealloc_stack [[STACK1]]
999989
// CHECK-NEXT: dealloc_stack [[BOX]]
1000990
// CHECK-NEXT: tuple
1001991
// CHECK-NEXT: return
1002-
// CHECK: bb5:
1003-
// CHECK-NEXT: dealloc_stack [[BOX]]
992+
// CHECK: bb4:
1004993
// CHECK-NEXT: unreachable
1005994
sil [ossa] @nesting_and_unreachable_critical_edge : $@convention(thin) (Int) -> () {
1006995
bb0(%0 : $Int):

test/SILOptimizer/inline_begin_apply.sil

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -494,8 +494,6 @@ bb0:
494494
// CHECK: dealloc_stack [[A32]] : $*Builtin.Int32
495495
// CHECK: unreachable
496496
// CHECK: bb2:
497-
// CHECK: dealloc_stack [[A32]] : $*Builtin.Int32
498-
// CHECK: dealloc_stack [[A16]] : $*Builtin.Int16
499497
// CHECK: unreachable
500498
// CHECK: bb3:
501499
// CHECK: dealloc_stack [[A32]] : $*Builtin.Int32

test/SILOptimizer/stack-nesting-wrong-scope.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
// RUN: -Xllvm -sil-print-debuginfo -o %t -module-name red 2>&1 | %FileCheck %s
55

66
// CHECK: bb5(%33 : @owned $Error):
7-
// CHECK: dealloc_stack %6 : $*ThrowAddrOnlyStruct<T>, loc {{.*}}:27:68, scope 2
8-
// CHECK: dealloc_stack %3 : $*ThrowAddrOnlyStruct<T>, loc {{.*}}:27:68, scope 2
9-
// CHECK: br bb4(%33 : $Error), loc {{.*}}:27:15, scope 2
7+
// CHECK: dealloc_stack %6 : $*ThrowAddrOnlyStruct<T>, loc {{.*}}:26:68, scope 2
8+
// CHECK: br bb4(%33 : $Error), loc {{.*}}:26:15, scope 2
109

1110
protocol Patatino {
1211
init()

0 commit comments

Comments
 (0)