Skip to content

Commit 4e3a010

Browse files
committed
[SILGen] Update the maximum value in a find-index-with-largest-value loop.
This is a loop that attempts to find the index of something with the longest prefix, but wasn't actually saving the new longest length when finding something with a longer length, meaning the loop always chose the last index. The update was accidentally lost in f40e9ef.
1 parent 61b3bff commit 4e3a010

File tree

3 files changed

+23
-22
lines changed

3 files changed

+23
-22
lines changed

lib/SILGen/SILGenPattern.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -947,6 +947,7 @@ chooseNecessaryColumn(const ClauseMatrix &matrix, unsigned firstRow) {
947947
for (unsigned c = 0; c != numColumns; ++c) {
948948
unsigned constructorPrefix = getConstructorPrefix(matrix, firstRow, c);
949949
if (constructorPrefix > longestConstructorPrefix) {
950+
longestConstructorPrefix = constructorPrefix;
950951
bestColumn = c;
951952
}
952953
}

test/SILGen/indirect_enum.swift

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -199,29 +199,29 @@ func switchTreeA<T>(_ x: TreeA<T>) {
199199
// CHECK: [[TUPLE:%.*]] = load_borrow [[TUPLE_ADDR]]
200200
// CHECK: [[LEFT:%.*]] = tuple_extract [[TUPLE]] {{.*}}, 0
201201
// CHECK: [[RIGHT:%.*]] = tuple_extract [[TUPLE]] {{.*}}, 1
202+
// CHECK: switch_enum [[LEFT]] : $TreeA<T>,
203+
// CHECK: case #TreeA.Leaf!enumelt.1: [[LEAF_CASE_LEFT:bb[0-9]+]],
204+
// CHECK: default [[FAIL_LEFT:bb[0-9]+]]
205+
206+
// CHECK: [[LEAF_CASE_LEFT]]([[LEFT_LEAF_BOX:%.*]] : $<τ_0_0> { var τ_0_0 } <T>):
207+
// CHECK: [[LEFT_LEAF_VALUE:%.*]] = project_box [[LEFT_LEAF_BOX]]
202208
// CHECK: switch_enum [[RIGHT]] : $TreeA<T>,
203209
// CHECK: case #TreeA.Leaf!enumelt.1: [[LEAF_CASE_RIGHT:bb[0-9]+]],
204210
// CHECK: default [[FAIL_RIGHT:bb[0-9]+]]
205211

206212
// CHECK: [[LEAF_CASE_RIGHT]]([[RIGHT_LEAF_BOX:%.*]] : $<τ_0_0> { var τ_0_0 } <T>):
207213
// CHECK: [[RIGHT_LEAF_VALUE:%.*]] = project_box [[RIGHT_LEAF_BOX]]
208-
// CHECK: switch_enum [[LEFT]] : $TreeA<T>,
209-
// CHECK: case #TreeA.Leaf!enumelt.1: [[LEAF_CASE_LEFT:bb[0-9]+]],
210-
// CHECK: default [[FAIL_LEFT:bb[0-9]+]]
211-
212-
// CHECK: [[LEAF_CASE_LEFT]]([[LEFT_LEAF_BOX:%.*]] : $<τ_0_0> { var τ_0_0 } <T>):
213-
// CHECK: [[LEFT_LEAF_VALUE:%.*]] = project_box [[LEFT_LEAF_BOX]]
214214
// CHECK: copy_addr [[LEFT_LEAF_VALUE]]
215215
// CHECK: copy_addr [[RIGHT_LEAF_VALUE]]
216216
// -- x +1
217217
// CHECK: destroy_value [[NODE_BOX]]
218218
// CHECK: end_borrow [[BORROWED_ARG]] from [[ARG]]
219219
// CHECK: br [[OUTER_CONT]]
220220

221-
// CHECK: [[FAIL_LEFT]]:
221+
// CHECK: [[FAIL_RIGHT]]:
222222
// CHECK: br [[DEFAULT:bb[0-9]+]]
223223

224-
// CHECK: [[FAIL_RIGHT]]:
224+
// CHECK: [[FAIL_LEFT]]:
225225
// CHECK: br [[DEFAULT]]
226226

227227
case .Branch(.Leaf(let x), .Leaf(let y)):
@@ -278,27 +278,27 @@ func switchTreeB<T>(_ x: TreeB<T>) {
278278
// CHECK: [[TUPLE:%.*]] = project_box [[BOX]]
279279
// CHECK: [[LEFT:%.*]] = tuple_element_addr [[TUPLE]]
280280
// CHECK: [[RIGHT:%.*]] = tuple_element_addr [[TUPLE]]
281-
// CHECK: switch_enum_addr [[RIGHT]] {{.*}}, default [[RIGHT_FAIL:bb[0-9]+]]
282-
283-
// CHECK: bb{{.*}}:
284-
// CHECK: copy_addr [[RIGHT]] to [initialization] [[RIGHT_COPY:%.*]] :
285-
// CHECK: [[RIGHT_LEAF:%.*]] = unchecked_take_enum_data_addr [[RIGHT_COPY]] : $*TreeB<T>, #TreeB.Leaf
286281
// CHECK: switch_enum_addr [[LEFT]] {{.*}}, default [[LEFT_FAIL:bb[0-9]+]]
287282

288283
// CHECK: bb{{.*}}:
289284
// CHECK: copy_addr [[LEFT]] to [initialization] [[LEFT_COPY:%.*]] :
290285
// CHECK: [[LEFT_LEAF:%.*]] = unchecked_take_enum_data_addr [[LEFT_COPY]] : $*TreeB<T>, #TreeB.Leaf
286+
// CHECK: switch_enum_addr [[RIGHT]] {{.*}}, default [[RIGHT_FAIL:bb[0-9]+]]
287+
288+
// CHECK: bb{{.*}}:
289+
// CHECK: copy_addr [[RIGHT]] to [initialization] [[RIGHT_COPY:%.*]] :
290+
// CHECK: [[RIGHT_LEAF:%.*]] = unchecked_take_enum_data_addr [[RIGHT_COPY]] : $*TreeB<T>, #TreeB.Leaf
291291
// CHECK: copy_addr [take] [[LEFT_LEAF]] to [initialization] [[X:%.*]] :
292292
// CHECK: copy_addr [take] [[RIGHT_LEAF]] to [initialization] [[Y:%.*]] :
293293
// CHECK: function_ref @_T013indirect_enum1c{{[_0-9a-zA-Z]*}}F
294294
// CHECK: destroy_addr [[Y]]
295295
// CHECK: dealloc_stack [[Y]]
296296
// CHECK: destroy_addr [[X]]
297297
// CHECK: dealloc_stack [[X]]
298-
// CHECK-NOT: destroy_addr [[LEFT_COPY]]
299-
// CHECK: dealloc_stack [[LEFT_COPY]]
300298
// CHECK-NOT: destroy_addr [[RIGHT_COPY]]
301299
// CHECK: dealloc_stack [[RIGHT_COPY]]
300+
// CHECK-NOT: destroy_addr [[LEFT_COPY]]
301+
// CHECK: dealloc_stack [[LEFT_COPY]]
302302
// -- box +0
303303
// CHECK: destroy_value [[BOX]]
304304
// CHECK-NOT: destroy_addr [[TREE_COPY]]
@@ -308,16 +308,16 @@ func switchTreeB<T>(_ x: TreeB<T>) {
308308
case .Branch(.Leaf(let x), .Leaf(let y)):
309309
c(x, y)
310310

311-
// CHECK: [[LEFT_FAIL]]:
312-
// CHECK: destroy_addr [[RIGHT_LEAF]]
313-
// CHECK-NOT: destroy_addr [[RIGHT_COPY]]
314-
// CHECK: dealloc_stack [[RIGHT_COPY]]
311+
// CHECK: [[RIGHT_FAIL]]:
312+
// CHECK: destroy_addr [[LEFT_LEAF]]
313+
// CHECK-NOT: destroy_addr [[LEFT_COPY]]
314+
// CHECK: dealloc_stack [[LEFT_COPY]]
315315
// CHECK: destroy_value [[BOX]]
316316
// CHECK-NOT: destroy_addr [[TREE_COPY]]
317317
// CHECK: dealloc_stack [[TREE_COPY]]
318318
// CHECK: br [[INNER_CONT:bb[0-9]+]]
319319

320-
// CHECK: [[RIGHT_FAIL]]:
320+
// CHECK: [[LEFT_FAIL]]:
321321
// CHECK: destroy_value [[BOX]]
322322
// CHECK-NOT: destroy_addr [[TREE_COPY]]
323323
// CHECK: dealloc_stack [[TREE_COPY]]

test/SILGen/switch.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1071,8 +1071,8 @@ func testMultiPatternsWithOuterScopeSameNamedVar(base: Int?, filter: Int?) {
10711071

10721072
case (.some(let base), .some(let filter)):
10731073
// CHECK: bb2(%10 : $Int):
1074-
// CHECK-NEXT: debug_value %10 : $Int, let, name "base"
1075-
// CHECK-NEXT: debug_value %8 : $Int, let, name "filter"
1074+
// CHECK-NEXT: debug_value %8 : $Int, let, name "base"
1075+
// CHECK-NEXT: debug_value %10 : $Int, let, name "filter"
10761076
print("both: \(base), \(filter)")
10771077
case (.some(let base), .none), (.none, .some(let base)):
10781078
// CHECK: bb3:

0 commit comments

Comments
 (0)