Skip to content

Commit bb3a0e3

Browse files
authored
Fix SROA for alloc_stack [dynamic_lifetime] (#38793)
1 parent 8d5e67f commit bb3a0e3

File tree

2 files changed

+63
-2
lines changed

2 files changed

+63
-2
lines changed

lib/SILOptimizer/Transforms/SILSROA.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,8 @@ createAllocas(llvm::SmallVector<AllocStackInst *, 4> &NewAllocations) {
202202
// TODO: Add op_fragment support for tuple type
203203
for (unsigned EltNo : indices(TT->getElementTypes())) {
204204
SILType EltTy = Type.getTupleElementType(EltNo);
205-
NewAllocations.push_back(B.createAllocStack(Loc, EltTy, {}));
205+
NewAllocations.push_back(
206+
B.createAllocStack(Loc, EltTy, {}, AI->hasDynamicLifetime()));
206207
}
207208
} else {
208209
assert(SD && "SD should not be null since either it or TT must be set at "
@@ -217,7 +218,7 @@ createAllocas(llvm::SmallVector<AllocStackInst *, 4> &NewAllocations) {
217218

218219
NewAllocations.push_back(B.createAllocStack(
219220
Loc, Type.getFieldType(VD, M, TypeExpansionContext(B.getFunction())),
220-
NewDebugVarInfo));
221+
NewDebugVarInfo, AI->hasDynamicLifetime()));
221222
}
222223
}
223224
}

test/SILOptimizer/sroa_ossa.sil

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,3 +526,63 @@ bb0(%0 : @owned $NotTrivial, %1 : @owned $NotTrivial):
526526
%6 = tuple ()
527527
return %6 : $()
528528
}
529+
530+
class Klass {
531+
}
532+
533+
struct NonTrivialStruct {
534+
var x : Klass
535+
var y : Klass
536+
var z : Klass
537+
}
538+
539+
sil @get_klasstriple : $@convention(thin) () -> (@owned Klass, @owned Klass, @owned Klass)
540+
541+
// CHECK-LABEL: sil [ossa] @test_dynamiclifetime :
542+
// CHECK: alloc_stack [dynamic_lifetime] $Klass
543+
// CHECK: alloc_stack [dynamic_lifetime] $Klass
544+
// CHECK: alloc_stack [dynamic_lifetime] $Klass
545+
// CHECK-LABEL: } // end sil function 'test_dynamiclifetime'
546+
sil [ossa] @test_dynamiclifetime : $@convention(thin) () -> () {
547+
bb0:
548+
%2 = alloc_stack $Builtin.Int1
549+
%3 = alloc_stack [dynamic_lifetime] $NonTrivialStruct
550+
%4 = integer_literal $Builtin.Int1, 0
551+
store %4 to [trivial] %2 : $*Builtin.Int1
552+
cond_br undef, bb1, bb2
553+
554+
bb1:
555+
br bb3
556+
557+
bb2:
558+
%func = function_ref @get_klasstriple : $@convention(thin) () -> (@owned Klass, @owned Klass, @owned Klass)
559+
%r = apply %func() : $@convention(thin) () -> (@owned Klass, @owned Klass, @owned Klass)
560+
(%v1, %v2, %v3) = destructure_tuple %r : $(Klass, Klass, Klass)
561+
%27 = integer_literal $Builtin.Int1, -1
562+
store %27 to [trivial] %2 : $*Builtin.Int1
563+
%f1 = struct_element_addr %3 : $*NonTrivialStruct, #NonTrivialStruct.x
564+
store %v1 to [init] %f1 : $*Klass
565+
%f2 = struct_element_addr %3 : $*NonTrivialStruct, #NonTrivialStruct.y
566+
store %v2 to [init] %f2 : $*Klass
567+
%f3 = struct_element_addr %3 : $*NonTrivialStruct, #NonTrivialStruct.z
568+
store %v3 to [init] %f3 : $*Klass
569+
br bb3
570+
571+
bb3:
572+
%32 = load [trivial] %2 : $*Builtin.Int1
573+
cond_br %32, bb4, bb5
574+
575+
bb4:
576+
%34 = load [take] %3 : $*NonTrivialStruct
577+
destroy_value %34 : $NonTrivialStruct
578+
br bb6
579+
580+
bb5:
581+
br bb6
582+
583+
bb6:
584+
dealloc_stack %3 : $*NonTrivialStruct
585+
dealloc_stack %2 : $*Builtin.Int1
586+
%res = tuple ()
587+
return %res : $()
588+
}

0 commit comments

Comments
 (0)