Merge pull request #68659 from kubamracek/embedded-ispod

[embedded] Handle thick->thin metatype conversion on IsPOD builtin too
This commit is contained in:
Kuba (Brecka) Mracek
2023-09-21 06:50:29 -07:00
committed by GitHub
2 changed files with 38 additions and 3 deletions

View File

@@ -40,8 +40,9 @@ extension BuiltinInst : OnoneSimplifyable {
.AssignCopyArrayNoAlias,
.AssignCopyArrayFrontToBack,
.AssignCopyArrayBackToFront,
.AssignTakeArray:
optimizeArrayBuiltin(context)
.AssignTakeArray,
.IsPOD:
optimizeFirstArgumentToThinMetatype(context)
default:
if let literal = constantFold(context) {
uses.replaceAll(with: literal, context)
@@ -173,7 +174,7 @@ private extension BuiltinInst {
context.erase(instruction: self)
}
func optimizeArrayBuiltin(_ context: SimplifyContext) {
func optimizeFirstArgumentToThinMetatype(_ context: SimplifyContext) {
guard let metatypeInst = operands[0].value as? MetatypeInst,
metatypeInst.type.representationOfMetatype(in: parentFunction) == .Thick else {
return

View File

@@ -0,0 +1,34 @@
// RUN: %target-swift-emit-ir %s -parse-stdlib -module-name Swift -enable-experimental-feature Embedded -wmo -target arm64e-apple-none | %FileCheck %s
// REQUIRES: swift_in_compiler
class MyClass {}
struct MyStruct {
var c: MyClass
}
public func foo() -> Builtin.Int1 {
return Builtin.ispod(MyStruct.self)
}
// CHECK: define {{.*}}i1 @"$ss3fooBi1_yF"()
// CHECK-NEXT: entry:
// CHECK-NEXT: ret i1 false
// CHECK-NEXT: }
public func bar() -> Builtin.Int1 {
var s = MyGenericStruct<MyStruct>()
return s.foo()
}
public struct MyGenericStruct<T> {
public func foo() -> Builtin.Int1 {
return Builtin.ispod(T.self)
}
}
// CHECK: define {{.*}}i1 @"$ss15MyGenericStructV3fooBi1_yFs0aC0V_Tg5"()
// CHECK-NEXT: entry:
// CHECK-NEXT: ret i1 false
// CHECK-NEXT: }