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:
Jordan Rose
2016-04-20 16:13:47 -07:00
parent af874abdbf
commit e1126b36e5
2 changed files with 40 additions and 3 deletions

View File

@@ -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");

View 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_()