// RUN: %target-swift-frontend %s -parse-as-library -O -emit-sil -save-optimization-record-path %t.opt.yaml | %FileCheck %s // RUN: %FileCheck -check-prefix=YAML -input-file=%t.opt.yaml %s // RUN: %target-swift-frontend %s -parse-as-library -Osize -emit-sil | %FileCheck %s --check-prefix=OSIZE // // Test speculative devirtualization. // Test MaxNumSpeculativeTargets. // rdar:23228386 public class Base { public init() {} public func foo() {} } class Sub1 : Base { override func foo() {} } class Sub2 : Base { override func foo() {} } class Sub3 : Base { override func foo() {} } class Sub4 : Base { override func foo() {} } class Sub5 : Base { override func foo() {} } class Sub6 : Base { override func foo() {} } class Sub7 : Base { override func foo() {} } // CHECK: @_T016devirt_speculate28testMaxNumSpeculativeTargetsyyAA4BaseCF // CHECK: checked_cast_br [exact] %0 : $Base to $Base // CHECK: checked_cast_br [exact] %0 : $Base to $Sub1 // CHECK: checked_cast_br [exact] %0 : $Base to $Sub2 // CHECK: checked_cast_br [exact] %0 : $Base to $Sub3 // CHECK: checked_cast_br [exact] %0 : $Base to $Sub4 // CHECK: checked_cast_br [exact] %0 : $Base to $Sub5 // CHECK: checked_cast_br [exact] %0 : $Base to $Sub6 // CHECK-NOT: checked_cast_br // CHECK: %[[CM:[0-9]+]] = class_method %0 : $Base, #Base.foo!1 : (Base) -> () -> (), $@convention(method) (@guaranteed Base) -> () // CHECK: apply %[[CM]](%0) : $@convention(method) (@guaranteed Base) -> () // YAML: Pass: sil-speculative-devirtualizer // YAML-NEXT: Name: sil.PartialSpecDevirt // YAML-NEXT: DebugLoc: // YAML-NEXT: File: {{.*}}/devirt_speculate.swift // YAML-NEXT: Line: 66 // YAML-NEXT: Column: 5 // YAML-NEXT: Function: 'testMaxNumSpeculativeTargets(_:)' // YAML-NEXT: Args: // YAML-NEXT: - String: 'Partially devirtualized call with run-time checks for ' // YAML-NEXT: - NumSubTypesChecked: '6' // YAML-NEXT: - String: ' subclasses of ' // YAML-NEXT: - ClassType: '$Base' // YAML-NEXT: - String: ', number of subclasses not devirtualized: ' // YAML-NEXT: - NotHandledSubsNum: '1' // YAML-NEXT: ... // OSIZE: @_T016devirt_speculate28testMaxNumSpeculativeTargetsyyAA4BaseCF // OSIZE-NOT: checked_cast_br [exact] %0 : $Base to $Base // OSIZE-NOT: checked_cast_br [exact] %0 : $Base to $Sub public func testMaxNumSpeculativeTargets(_ b: Base) { b.foo() }