Files
swift-mirror/test/SILOptimizer/inline_arrays.swift
Erik Eckstein 2b9b2d243c Optimizer: improve TempLValueOpt
* re-implement the pass in swift
* support alloc_stack liveranges which span over multiple basic blocks
* support `load`-`store` pairs, copying from the alloc_stack (in addition to `copy_addr`)

Those improvements help to reduce temporary stack allocations, especially for InlineArrays.

rdar://151606382
2025-06-05 06:45:18 +02:00

67 lines
2.7 KiB
Swift

// RUN: %target-swift-frontend -primary-file %s -O -disable-availability-checking -module-name=test -emit-sil | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-OPT
// REQUIRES: swift_stdlib_no_asserts, optimized_stdlib
// CHECK-LABEL: sil @$s4test0A9Subscriptys5UInt8Vs11InlineArrayVy$255_ADGz_SitF :
// CHECK-OPT: [[S:%.*]] = struct_element_addr %0, #InlineArray._storage
// CHECK-ONONE: [[ACC:%.*]] = begin_access [read] [static] %0
// CHECK-ONONE: [[S:%.*]] = struct_element_addr [[ACC]], #InlineArray._storage
// CHECK: [[BA:%.*]] = vector_base_addr [[S]]
// CHECK: [[EA:%.*]] = index_addr [stack_protection] [[BA]],
// CHECK-OPT: [[E:%.*]] = load [[EA]]
// CHECK-ONONE: [[ACC2:%.*]] = begin_access [read] [unsafe] [[EA]]
// CHECK-ONONE: [[E:%.*]] = load [[ACC2]]
// CHECK: return [[E]]
// CHECK: } // end sil function '$s4test0A9Subscriptys5UInt8Vs11InlineArrayVy$255_ADGz_SitF'
public func testSubscript(_ a: inout InlineArray<256, UInt8>, _ i: Int) -> UInt8 {
return a[i]
}
public final class C {
let a: InlineArray<256, UInt8>
init(_ a: InlineArray<256, UInt8>) {
self.a = a
}
// CHECK-LABEL: sil @$s4test1CC1iACs5UInt8V_tcfc
// CHECK-OPT-NOT: alloc_stack
// CHECK: } // end sil function '$s4test1CC1iACs5UInt8V_tcfc'
public init(i: UInt8) {
self.a = .init(repeating: i)
}
// CHECK-LABEL: sil @$s4test1CC0A9Subscriptys5UInt8VSiF :
// CHECK: [[CA:%.*]] = ref_element_addr [immutable] %1, #C.a
// CHECK: [[S:%.*]] = struct_element_addr [[CA]], #InlineArray._storage
// CHECK: [[BA:%.*]] = vector_base_addr [[S]]
// CHECK: [[EA:%.*]] = index_addr [stack_protection] [[BA]],
// CHECK-OPT: [[E:%.*]] = load [[EA]]
// CHECK-ONONE: [[ACC2:%.*]] = begin_access [read] [unsafe] [[EA]]
// CHECK-ONONE: [[E:%.*]] = load [[ACC2]]
// CHECK: return [[E]]
// CHECK: } // end sil function '$s4test1CC0A9Subscriptys5UInt8VSiF'
public func testSubscript(_ i: Int) -> UInt8 {
return a[i]
}
}
public struct S {
let a: InlineArray<7000, UInt8>
// CHECK-LABEL: sil @$s4test1SV0A9Subscriptys5UInt8VSiF :
// CHECK: [[A:%.*]] = struct_element_addr %1, #S.a
// CHECK: [[S:%.*]] = struct_element_addr [[A]], #InlineArray._storage
// CHECK: [[BA:%.*]] = vector_base_addr [[S]]
// CHECK: [[EA:%.*]] = index_addr [stack_protection] [[BA]],
// CHECK-OPT: [[E:%.*]] = load [[EA]]
// CHECK-ONONE: [[ACC2:%.*]] = begin_access [read] [unsafe] [[EA]]
// CHECK-ONONE: [[E:%.*]] = load [[ACC2]]
// CHECK: return [[E]]
// CHECK: } // end sil function '$s4test1SV0A9Subscriptys5UInt8VSiF'
public func testSubscript(_ i: Int) -> UInt8 {
return a[i]
}
}