From 660263cf2ccb9982cb52a4b51e0a87e6080d3587 Mon Sep 17 00:00:00 2001 From: stzn Date: Sun, 18 May 2025 19:01:50 +0900 Subject: [PATCH] [region-isolation] Fix crash due to missing visitVectorBaseAddrInst case Credit to https://github.com/stzn for initial work on the patch. rdar://151401230 --- lib/SILOptimizer/Analysis/RegionAnalysis.cpp | 12 +++++- .../regionanalysis_trackable_value.sil | 43 ++++++++++++++++++- .../transfernonsendable_rbi_result.swift | 7 ++- 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/lib/SILOptimizer/Analysis/RegionAnalysis.cpp b/lib/SILOptimizer/Analysis/RegionAnalysis.cpp index 417ab6f2e2dce..00c5af065716b 100644 --- a/lib/SILOptimizer/Analysis/RegionAnalysis.cpp +++ b/lib/SILOptimizer/Analysis/RegionAnalysis.cpp @@ -141,7 +141,16 @@ struct AddressBaseComputingVisitor return SILValue(); } - SILValue visitNonAccess(SILValue) { return SILValue(); } + SILValue visitNonAccess(SILValue value) { + // For now since it is late in 6.2, work around vector base addr not being + // treated as a projection. + if (auto *v = dyn_cast(value)) { + isProjectedFromAggregate = true; + return v->getOperand(); + } + + return SILValue(); + } SILValue visitPhi(SILPhiArgument *phi) { llvm_unreachable("Should never hit this"); @@ -312,6 +321,7 @@ static bool isStaticallyLookThroughInst(SILInstruction *inst) { case SILInstructionKind::UncheckedEnumDataInst: case SILInstructionKind::StructElementAddrInst: case SILInstructionKind::TupleElementAddrInst: + case SILInstructionKind::VectorBaseAddrInst: return true; case SILInstructionKind::MoveValueInst: // Look through if it isn't from a var decl. diff --git a/test/Concurrency/regionanalysis_trackable_value.sil b/test/Concurrency/regionanalysis_trackable_value.sil index 7ae742e0a3d05..ec8c9bd0cf5f5 100644 --- a/test/Concurrency/regionanalysis_trackable_value.sil +++ b/test/Concurrency/regionanalysis_trackable_value.sil @@ -681,4 +681,45 @@ bb2: bb3: %9999 = tuple () return %9999 : $() -} \ No newline at end of file +} + +// CHECK-LABEL: begin running test 1 of 1 on alloc_stack_inline_array_sendable: sil_regionanalysis_underlying_tracked_value with: @trace[0] +// CHECK: TrackableValue. State: TrackableValueState[id: 0][is_no_alias: no][is_sendable: yes][region_value_kind: disconnected]. +// CHECK: Rep Value: %2 = vector_base_addr %1 +// CHECK: end running test 1 of 1 on alloc_stack_inline_array_sendable: sil_regionanalysis_underlying_tracked_value with: @trace[0] +sil [ossa] @alloc_stack_inline_array_sendable : $@convention(thin) () -> () { +bb0: + specify_test "sil_regionanalysis_underlying_tracked_value @trace[0]" + %0 = alloc_stack $InlineArray<1, UInt8> + %1 = struct_element_addr %0: $*InlineArray<1, UInt8>, #InlineArray._storage + %2 = vector_base_addr %1 : $*Builtin.FixedArray<1, UInt8> + %3 = integer_literal $Builtin.Int8, 0 + %4 = struct $UInt8 (%3) + store %4 to [trivial] %2 + %6 = load [trivial] %0 + dealloc_stack %0 + debug_value [trace] %2 + + %7 = tuple () + return %7 : $() +} + +// CHECK-LABEL: begin running test 1 of 1 on alloc_stack_inline_array_nonsendable: sil_regionanalysis_underlying_tracked_value with: @trace[0] +// CHECK: TrackableValue. State: TrackableValueState[id: 0][is_no_alias: yes][is_sendable: no][region_value_kind: disconnected]. +// CHECK: Rep Value: %1 = alloc_stack $InlineArray +// CHECK: end running test 1 of 1 on alloc_stack_inline_array_nonsendable: sil_regionanalysis_underlying_tracked_value with: @trace[0] +sil [ossa] @alloc_stack_inline_array_nonsendable : $@convention(thin) (@owned NonSendableKlass) -> () { +bb0(%arg : @owned $NonSendableKlass): + specify_test "sil_regionanalysis_underlying_tracked_value @trace[0]" + %0 = alloc_stack $InlineArray<1, NonSendableKlass> + %1 = struct_element_addr %0: $*InlineArray<1, NonSendableKlass>, #InlineArray._storage + %2 = vector_base_addr %1 : $*Builtin.FixedArray<1, NonSendableKlass> + store %arg to [init] %2 + %6 = load [take] %0 + destroy_value %6 + dealloc_stack %0 + debug_value [trace] %2 + + %7 = tuple () + return %7 : $() +} diff --git a/test/Concurrency/transfernonsendable_rbi_result.swift b/test/Concurrency/transfernonsendable_rbi_result.swift index ea730c83b2d92..305aba5172f5a 100644 --- a/test/Concurrency/transfernonsendable_rbi_result.swift +++ b/test/Concurrency/transfernonsendable_rbi_result.swift @@ -1,4 +1,4 @@ -// RUN: %target-swift-frontend -target %target-swift-5.1-abi-triple -swift-version 6 -parse-as-library %s -emit-sil -o /dev/null -verify +// RUN: %target-swift-frontend -target %target-swift-5.1-abi-triple -swift-version 6 -disable-availability-checking -parse-as-library %s -emit-sil -o /dev/null -verify // REQUIRES: asserts // REQUIRES: concurrency @@ -135,3 +135,8 @@ func testGenericResults() async { let _: NonSendable = await mainActorGenericReturnNonSendable() // expected-error @-1 {{non-Sendable 'NonSendable'-typed result can not be returned from main actor-isolated global function 'mainActorGenericReturnNonSendable()' to nonisolated context}} } + +// https://github.com/swiftlang/swift/issues/81534 +func testInlineArray() { + let _: InlineArray<_, UInt8> = [0] +}