@@ -1543,3 +1543,78 @@ bb6(%32 : $Builtin.Int32):
1543
1543
%33 = struct $Int32 (%32 : $Builtin.Int32)
1544
1544
return %33 : $Int32
1545
1545
}
1546
+
1547
+ struct Wrapper {
1548
+ let arr: ArrayInt
1549
+ }
1550
+
1551
+ // HOIST-LABEL: sil @hoist_array_in_struct :
1552
+ // HOIST: bb0
1553
+ // HOIST: [[END:%[0-9]+]] = struct_extract %0 : $Int32, #Int32._value
1554
+ // HOIST: [[ZERO:%[0-9]+]] = integer_literal $Builtin.Int32, 0
1555
+ // HOIST: [[SE:%[0-9]+]] = struct_element_addr %1 : $*Wrapper, #Wrapper.arr
1556
+ // HOIST: cond_br
1557
+
1558
+ // HOIST: bb1
1559
+ // HOIST: [[CB1:%[0-9]+]] = function_ref @checkbounds
1560
+ // Check start.
1561
+ // HOIST: [[S1:%[0-9]+]] = struct $Int32 ([[ZERO]] : $Builtin.Int32)
1562
+ // HOIST: [[L1:%[0-9]+]] = load [[SE]] : $*ArrayInt
1563
+ // HOIST: retain_value [[L1]]
1564
+ // HOIST: apply [[CB1]]([[S1]], {{.*}}[[L1]])
1565
+
1566
+ // Check end.
1567
+ // HOIST: [[ONE:%[0-9]+]] = integer_literal $Builtin.Int32, 1
1568
+ // HOIST: [[SUB1:%[0-9]+]] = builtin "ssub_with_overflow_Int32"([[END]] : ${{.*}}, [[ONE]]
1569
+ // HOIST: [[SUB2:%[0-9]+]] = tuple_extract [[SUB1]]
1570
+ // HOIST: [[SUB3:%[0-9]+]] = struct $Int32 ([[SUB2]]
1571
+ // HOIST: [[L2:%[0-9]+]] = load [[SE]] : $*ArrayInt
1572
+ // HOIST: retain_value [[L2]]
1573
+ // HOIST: apply [[CB1]]([[SUB3]], {{.*}}[[L2]])
1574
+ // HOIST: br bb3
1575
+
1576
+ // HOIST: bb3
1577
+ // HOIST-NOT: cond_fail
1578
+ // HOIST-NOT: @checkbounds
1579
+ // HOIST: builtin
1580
+ // HOIST: builtin
1581
+ // HOIST-NOT: builtin
1582
+ // HOIST: cond_br {{.*}}, {{.*}}, bb4
1583
+ // HOIST: bb4
1584
+ // HOIST: br bb3
1585
+
1586
+ // HOIST: return
1587
+ sil @hoist_array_in_struct : $@convention(thin) (Int32, @inout Wrapper) -> Int32 {
1588
+ bb0(%0 : $Int32, %1 : $*Wrapper):
1589
+ %2 = integer_literal $Builtin.Int1, -1
1590
+ %3 = struct $Bool (%2 : $Builtin.Int1)
1591
+ %4 = struct_extract %0 : $Int32, #Int32._value
1592
+ %5 = integer_literal $Builtin.Int32, 0
1593
+ br bb1(%5 : $Builtin.Int32)
1594
+
1595
+ bb1(%7 : $Builtin.Int32):
1596
+ %8 = builtin "cmp_eq_Int32"(%7 : $Builtin.Int32, %4 : $Builtin.Int32) : $Builtin.Int1
1597
+ %9 = struct_element_addr %1 : $*Wrapper, #Wrapper.arr
1598
+ cond_br %8, bb3, bb2
1599
+
1600
+ bb2:
1601
+ %11 = struct $Int32 (%7 : $Builtin.Int32)
1602
+ %12 = function_ref @checkbounds : $@convention(method) (Int32, Bool, @owned ArrayInt) -> _DependenceToken
1603
+ %13 = load %9 : $*ArrayInt
1604
+ %14 = struct_extract %13 : $ArrayInt, #ArrayInt.buffer
1605
+ %15 = struct_extract %14 : $ArrayIntBuffer, #ArrayIntBuffer.storage
1606
+ retain_value %15 : $Builtin.NativeObject
1607
+ %17 = apply %12(%11, %3, %13) : $@convention(method) (Int32, Bool, @owned ArrayInt) -> _DependenceToken
1608
+ %18 = integer_literal $Builtin.Int32, 1
1609
+ %19 = integer_literal $Builtin.Int1, -1
1610
+ %20 = builtin "sadd_with_overflow_Int32"(%7 : $Builtin.Int32, %18 : $Builtin.Int32, %19 : $Builtin.Int1) : $(Builtin.Int32, Builtin.Int1)
1611
+ %21 = tuple_extract %20 : $(Builtin.Int32, Builtin.Int1), 0
1612
+ %22 = tuple_extract %20 : $(Builtin.Int32, Builtin.Int1), 1
1613
+ cond_fail %22 : $Builtin.Int1, ""
1614
+ br bb1(%21 : $Builtin.Int32)
1615
+
1616
+ bb3:
1617
+ %25 = struct $Int32 (%7 : $Builtin.Int32)
1618
+ return %25 : $Int32
1619
+ }
1620
+
0 commit comments