diff --git a/lib/SILOptimizer/Mandatory/PredictableMemOpt.cpp b/lib/SILOptimizer/Mandatory/PredictableMemOpt.cpp index 83a5694214c89..e62307f89703c 100644 --- a/lib/SILOptimizer/Mandatory/PredictableMemOpt.cpp +++ b/lib/SILOptimizer/Mandatory/PredictableMemOpt.cpp @@ -2339,7 +2339,7 @@ SILValue OptimizeDeadAlloc::promoteMarkDepBase( } LLVM_DEBUG(llvm::dbgs() << " To value: " << dependentValue); md->replaceAllUsesWith(dependentValue); - deleter.deleteIfDead(md); + deleter.forceDelete(md); return dependentValue; } diff --git a/test/SILOptimizer/mandatory_performance_optimizations.sil b/test/SILOptimizer/mandatory_performance_optimizations.sil index 2561bbf28cd4b..2fc3d0d4334f3 100644 --- a/test/SILOptimizer/mandatory_performance_optimizations.sil +++ b/test/SILOptimizer/mandatory_performance_optimizations.sil @@ -9,6 +9,10 @@ import Builtin import Swift import SwiftShims +struct NonTrivialStruct { + var s: String +} + sil_global [let] @g1 : $Int32 sil_global [let] @g2 : $Int32 @@ -203,6 +207,27 @@ bb3: return %1 : $Int32 } +sil @createNonTrivialStruct : $@convention(thin) (Int) -> @owned NonTrivialStruct + +// CHECK-LABEL: sil [no_allocation] [perf_constraint] [ossa] @test_dead_alloc_elimination_with_mark_dependence : +// CHECK-NOT: alloc_stack +// CHECK: } // end sil function 'test_dead_alloc_elimination_with_mark_dependence' +sil [ossa] [no_allocation] @test_dead_alloc_elimination_with_mark_dependence : $@convention(thin) (Int) -> () { +bb0(%0 : $Int): + %1 = alloc_stack [lexical] $Int + store %0 to [trivial] %1 + %4 = load [trivial] %1 + %5 = function_ref @createNonTrivialStruct : $@convention(thin) (Int) -> @owned NonTrivialStruct + %6 = apply %5(%4) : $@convention(thin) (Int) -> @owned NonTrivialStruct + %7 = mark_dependence [nonescaping] %6 on %1 + %9 = mark_dependence [nonescaping] %7 on %1 + %10 = destructure_struct %9 + destroy_value %10 + %12 = tuple () + dealloc_stack %1 + return %12 +} + // CHECK-LABEL: sil [no_locks] [perf_constraint] [ossa] @remove_metatype_arg : // CHECK: [[F:%.*]] = function_ref @$s12metatype_argTf4ndn_n : $@convention(thin) (Int, @owned Builtin.NativeObject) -> @owned Builtin.NativeObject // CHECK: [[A:%.*]] = apply [[F]](%0, %1) : $@convention(thin) (Int, @owned Builtin.NativeObject) -> @owned Builtin.NativeObject