mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Prespecialization: reduce the strength of an assertion.
If we find a specialization within the current module, it's okay if it has a body. This can come up if we compile something with optimizations and then compile the resulting SIL (or SIB) without optimizations.
This commit is contained in:
@@ -135,15 +135,14 @@ bool UsePrespecialized::replaceByPrespecialized(SILFunction &F) {
|
||||
<< PrevF << "\n");
|
||||
if (!PrevF)
|
||||
continue;
|
||||
assert(PrevF->isExternalDeclaration() &&
|
||||
"Prespecialized function should be an external declaration");
|
||||
NewF = PrevF;
|
||||
}
|
||||
|
||||
if (!NewF)
|
||||
continue;
|
||||
|
||||
assert(NewF->isExternalDeclaration() &&
|
||||
"Prespecialized function should be an external declaration");
|
||||
|
||||
// An existing specialization was found.
|
||||
DEBUG(llvm::dbgs() << "Found a specialization of " << ReferencedF->getName()
|
||||
<< " : " << NewF->getName() << "\n");
|
||||
|
||||
38
test/SILOptimizer/prespecialization_with_definition.sil
Normal file
38
test/SILOptimizer/prespecialization_with_definition.sil
Normal file
@@ -0,0 +1,38 @@
|
||||
// RUN: %target-swift-frontend -emit-ir %s -module-name main | FileCheck %s
|
||||
|
||||
sil_stage canonical
|
||||
|
||||
struct Box<T> {
|
||||
@inline(never)
|
||||
static func foo() {}
|
||||
}
|
||||
|
||||
// Reference a function in a way that will be specialized.
|
||||
sil @test : $@convention(thin) () -> () {
|
||||
bb0:
|
||||
// function_ref static Box.foo() -> ()
|
||||
%0 = function_ref @_TZFV4main3Box3foofT_T_ : $@convention(thin) <τ_0_0> (@thin Box<τ_0_0>.Type) -> () // user: %2
|
||||
%1 = metatype $@thin Box<()>.Type // user: %2
|
||||
%2 = apply %0<()>(%1) : $@convention(thin) <τ_0_0> (@thin Box<τ_0_0>.Type) -> ()
|
||||
%3 = tuple () // user: %4
|
||||
return %3 : $() // id: %4
|
||||
}
|
||||
|
||||
// This is the unspecialized form.
|
||||
sil hidden @_TZFV4main3Box3foofT_T_ : $@convention(thin) <T> (@thin Box<T>.Type) -> () {
|
||||
bb0(%0 : $@thin Box<T>.Type):
|
||||
%1 = tuple ()
|
||||
return %1 : $()
|
||||
}
|
||||
|
||||
// generic specialization <()> of static main.Box.foo () -> ()
|
||||
// This specialization is one that would be matched by the prespecialization
|
||||
// pass.
|
||||
sil shared @_TTSg5T____TZFV4main3Box3foofT_T_ : $@convention(thin) (@thin Box<()>.Type) -> () {
|
||||
bb0(%0 : $@thin Box<()>.Type):
|
||||
%1 = tuple ()
|
||||
return %1 : $()
|
||||
}
|
||||
|
||||
// CHECK-DAG: define linkonce_odr hidden void @_TTSg5T____TZFV4main3Box3foofT_T_() {{.*}}{
|
||||
// CHECK-DAG: call void @_TTSg5T____TZFV4main3Box3foofT_T_()
|
||||
Reference in New Issue
Block a user