Merge pull request #85334 from eeckstein/mandatory-destroy-hoisting

Optimizer: make destroy hoisting a mandatory pass
This commit is contained in:
eeckstein
2025-11-07 06:45:03 +01:00
committed by GitHub
31 changed files with 809 additions and 79 deletions

View File

@@ -20,8 +20,8 @@ import Foundation
// CHECK-NEXT: %._value = getelementptr inbounds{{.*}} %TSi, ptr %[[T2]], i32 0, i32 0
// CHECK: %[[T7:.+]] = call swiftcc ptr @"$ss27_finalizeUninitializedArrayySayxGABnlF"(ptr %[[T1]], ptr @"$sSiN")
// CHECK: %[[T4:.+]] = call swiftcc ptr @"$sSa10FoundationE19_bridgeToObjectiveCSo7NSArrayCyF"(ptr %[[T7]], ptr @"$sSiN")
// CHECK-NEXT: store ptr %[[T4]]
// CHECK-NEXT: call void @swift_bridgeObjectRelease(ptr %{{[0-9]+}}) #{{[0-9]+}}
// CHECK-NEXT: store ptr %[[T4]]
// CHECK-NEXT: call void @llvm.objc.release(ptr %[[T4]])
// CHECK-NEXT: ret ptr %[[T4]]
let arr = [1] as CFArray
@@ -37,12 +37,14 @@ import Foundation
// CHECK: [[L2]]: ; preds = %entry
// CHECK-NEXT: %[[T4:.+]] = phi ptr [ %[[T0]], %entry ]
// CHECK-NEXT: call void @llvm.objc.release(ptr %{{.+}})
// CHECK-NEXT: %[[T5:.+]] = ptrtoint ptr %[[T4]] to i{{32|64}}
// CHECK-NEXT: br label %[[L3:.+]]
// CHECK: [[L1]]: ; preds = %entry
// CHECK-NEXT: %[[T6:.+]] = phi ptr [ %[[T2]], %entry ]
// CHECK-NEXT: store ptr null, ptr %swifterror, align {{[0-9]+}}
// CHECK-NEXT: call void @llvm.objc.release(ptr %{{.+}})
// CHECK-NEXT: %[[T7:.+]] = icmp eq i{{32|64}} %{{.+}}, 0
// CHECK-NEXT: br i1 %[[T7]], label %[[L4:.+]], label %[[L5:.+]]
@@ -54,8 +56,7 @@ import Foundation
// CHECK-NEXT: %[[T9:.+]] = phi ptr [ %[[T8]], %[[L5]] ]
// CHECK-NEXT: %[[T10:.+]] = call swiftcc ptr @"$s10Foundation22_convertErrorToNSErrorySo0E0Cs0C0_pF"(ptr %[[T6]]) #{{[0-9]+}}
// CHECK: call swiftcc void @"$sSA7pointeexvs"(ptr noalias %{{.+}}, ptr %[[T9]], ptr %{{.+}}) #{{[0-9]+}}
// CHECK: call void @swift_errorRelease(ptr %[[T6]]) #{{[0-9]+}}
// CHECK-NEXT: br label %[[L7:.+]]
// CHECK: br label %[[L7:.+]]
// CHECK: [[L4]]: ; preds = %[[L1]]
// CHECK-NEXT: call void @swift_errorRelease(ptr %[[T6]]) #{{[0-9]+}}
@@ -66,6 +67,5 @@ import Foundation
// CHECK: [[L3]]: ; preds = %[[L2]], %[[L7]]
// CHECK-NEXT: %[[T12:.+]] = phi i{{32|64}} [ 0, %[[L7]] ], [ %[[T5]], %[[L2]] ]
// CHECK-NEXT: call void @llvm.objc.release(ptr %{{.+}})
// CHECK-NEXT: %[[T14:.+]] = inttoptr i{{32|64}} %[[T12]] to ptr
// CHECK-NEXT: ret ptr %[[T14]]

View File

@@ -129,6 +129,14 @@ entry(%flag : $Builtin.Int1):
// CHECK-NEXT: [[R6:%.*]] = load ptr, ptr [[T0]], align
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds{{.*}} [[BIGSUB]], ptr [[PTR]], i32 0, i32 7
// CHECK-NEXT: [[R7:%.*]] = load ptr, ptr [[T0]], align
// CHECK: call void @swift_release(ptr [[R0]])
// CHECK-NEXT: call void @swift_release(ptr [[R1]])
// CHECK-NEXT: call void @swift_release(ptr [[R2]])
// CHECK-NEXT: call void @swift_release(ptr [[R3]])
// CHECK: call void @swift_release(ptr [[R4]])
// CHECK-NEXT: call void @swift_release(ptr [[R5]])
// CHECK-NEXT: call void @swift_release(ptr [[R6]])
// CHECK-NEXT: call void @swift_release(ptr [[R7]])
// Branch.
// CHECK-NEXT: br i1 %0,
@@ -155,17 +163,9 @@ no:
br cont
cont:
// CHECK: call void @swift_release(ptr [[R0]])
// CHECK-NEXT: call void @swift_release(ptr [[R1]])
// CHECK-NEXT: call void @swift_release(ptr [[R2]])
// CHECK-NEXT: call void @swift_release(ptr [[R3]])
// CHECK: call void @swift_release(ptr [[R4]])
// CHECK-NEXT: call void @swift_release(ptr [[R5]])
// CHECK-NEXT: call void @swift_release(ptr [[R6]])
// CHECK-NEXT: call void @swift_release(ptr [[R7]])
destroy_value %value : $Big<SomeSubclass>
// CHECK-NEXT: ret void
// CHECK: ret void
%ret = tuple ()
return %ret : $()
}

View File

@@ -122,6 +122,10 @@ entry(%flag : $Builtin.Int1):
%0 = function_ref @test_simple : $@convention(thin) @yield_once <T: SomeClass> () -> (@yields @owned Biggish<T>)
(%value, %token) = begin_apply %0<SomeSubclass>() : $@convention(thin) @yield_once <T: SomeClass> () -> (@yields @owned Biggish<T>)
// CHECK: call void @swift_release(ptr [[R0_ORIG]])
// CHECK-NEXT: call void @swift_release(ptr [[R1_ORIG]])
// CHECK-NEXT: call void @swift_release(ptr [[R2_ORIG]])
// CHECK-NEXT: call void @swift_release(ptr [[R3_ORIG]])
// Branch.
// CHECK-NEXT: br i1 %0,
cond_br %flag, yes, no
@@ -147,13 +151,9 @@ no:
br cont
cont:
// CHECK: call void @swift_release(ptr [[R0_ORIG]])
// CHECK-NEXT: call void @swift_release(ptr [[R1_ORIG]])
// CHECK-NEXT: call void @swift_release(ptr [[R2_ORIG]])
// CHECK-NEXT: call void @swift_release(ptr [[R3_ORIG]])
destroy_value %value : $Biggish<SomeSubclass>
// CHECK-NEXT: ret void
// CHECK: ret void
%ret = tuple ()
return %ret : $()
}