mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Type annotations for instruction operands are omitted, e.g. ``` %3 = struct $S(%1, %2) ``` Operand types are redundant anyway and were only used for sanity checking in the SIL parser. But: operand types _are_ printed if the definition of the operand value was not printed yet. This happens: * if the block with the definition appears after the block where the operand's instruction is located * if a block or instruction is printed in isolation, e.g. in a debugger The old behavior can be restored with `-Xllvm -sil-print-types`. This option is added to many existing test files which check for operand types in their check-lines.
88 lines
4.1 KiB
Plaintext
88 lines
4.1 KiB
Plaintext
// RUN: %target-sil-opt -sil-print-types %s -performance-constant-propagation | %FileCheck %s
|
|
|
|
sil_stage canonical
|
|
|
|
import Builtin
|
|
import Swift
|
|
|
|
struct Wrapper {
|
|
let bytes: UInt64
|
|
private func pop(numBits: UInt64) -> Wrapper
|
|
public static func maker(bits: UInt64) -> Wrapper
|
|
}
|
|
|
|
sil_scope 3 { loc "e.swift":6:16 parent @pop : $@convention(method) (UInt64, Wrapper) -> Wrapper }
|
|
sil_scope 4 { loc "e.swift":8:12 parent 3 }
|
|
|
|
// Wrapper.pop(numBits:), scope 3
|
|
sil private @pop : $@convention(method) (UInt64, Wrapper) -> Wrapper {
|
|
[global: ]
|
|
bb0(%0 : $UInt64, %1 : $Wrapper):
|
|
debug_value %0 : $UInt64, let, name "numBits", argno 1, scope 3
|
|
debug_value %1 : $Wrapper, let, name "self", argno 2, scope 3
|
|
%4 = struct_extract %1 : $Wrapper, #Wrapper.bytes, scope 3
|
|
%5 = struct_extract %4 : $UInt64, #UInt64._value, scope 3
|
|
%6 = struct_extract %0 : $UInt64, #UInt64._value, scope 3
|
|
%7 = integer_literal $Builtin.Int1, -1, scope 3
|
|
%8 = builtin "usub_with_overflow_Int64"(%5 : $Builtin.Int64, %6 : $Builtin.Int64, %7 : $Builtin.Int1) : $(Builtin.Int64, Builtin.Int1), scope 3
|
|
%9 = tuple_extract %8 : $(Builtin.Int64, Builtin.Int1), 0, scope 3
|
|
%10 = tuple_extract %8 : $(Builtin.Int64, Builtin.Int1), 1, scope 3
|
|
cond_fail %10 : $Builtin.Int1, "arithmetic overflow", scope 3
|
|
%12 = struct $UInt64 (%9 : $Builtin.Int64), scope 3
|
|
%13 = struct $Wrapper (%12 : $UInt64), loc * "e.swift":3:8
|
|
return %13 : $Wrapper, scope 3
|
|
} // end sil function 'pop'
|
|
|
|
sil_scope 7 { loc "e.swift":12:22 parent @maker : $@convention(method) (UInt64, @thin Wrapper.Type) -> Wrapper }
|
|
sil_scope 8 { loc "e.swift":17:12 parent 7 }
|
|
sil_scope 10 { loc "e.swift":17:39 parent 7 }
|
|
sil_scope 11 { loc "e.swift":6:16 parent @pop : $@convention(method) (UInt64, Wrapper) -> Wrapper inlined_at 10 }
|
|
sil_scope 12 { loc "e.swift":8:12 parent 11 inlined_at 10 }
|
|
|
|
// static Wrapper.maker(bits:), scope 7
|
|
// CHECK-LABEL: sil {{.*}} @maker
|
|
sil hidden @maker : $@convention(method) (UInt64, @thin Wrapper.Type) -> Wrapper {
|
|
[global: ]
|
|
bb0(%0 : $UInt64, %1 : $@thin Wrapper.Type):
|
|
// CHECK: debug_value %0 : $UInt64, let, name "bits", argno 1
|
|
debug_value %0 : $UInt64, let, name "bits", argno 1, scope 7
|
|
// CHECK: debug_value %1 : $@thin Wrapper.Type, let, name "self", argno 2
|
|
debug_value %1 : $@thin Wrapper.Type, let, name "self", argno 2, scope 7
|
|
%4 = integer_literal $Builtin.Int64, 3735928559, scope 7
|
|
%5 = struct $UInt64 (%4 : $Builtin.Int64), scope 7
|
|
%6 = struct $Wrapper (%5 : $UInt64), loc * "e.swift":3:8
|
|
// CHECK-DAG: debug_value %0 : $UInt64, let, name "numBits", argno 1
|
|
debug_value %0 : $UInt64, let, name "numBits", argno 1, scope 11
|
|
// CHECK-DAG: debug_value %{{.*}} : $Builtin.Int64, let, name "self", {{.*}}, type $Wrapper, expr op_fragment:#Wrapper.bytes:op_fragment:#UInt64._value
|
|
debug_value %6 : $Wrapper, let, name "self", argno 2, scope 11
|
|
%9 = struct_extract %6 : $Wrapper, #Wrapper.bytes, scope 11
|
|
%10 = struct_extract %9 : $UInt64, #UInt64._value, scope 11
|
|
%11 = struct_extract %0 : $UInt64, #UInt64._value, scope 11
|
|
%12 = integer_literal $Builtin.Int1, -1, scope 11
|
|
%13 = builtin "usub_with_overflow_Int64"(%10 : $Builtin.Int64, %11 : $Builtin.Int64, %12 : $Builtin.Int1) : $(Builtin.Int64, Builtin.Int1), scope 11
|
|
%14 = tuple_extract %13 : $(Builtin.Int64, Builtin.Int1), 0, scope 11
|
|
%15 = tuple_extract %13 : $(Builtin.Int64, Builtin.Int1), 1, scope 11
|
|
cond_fail %15 : $Builtin.Int1, "arithmetic overflow", scope 11
|
|
%17 = struct $UInt64 (%14 : $Builtin.Int64), scope 11
|
|
%18 = struct $Wrapper (%17 : $UInt64), loc * "e.swift":3:8
|
|
return %18 : $Wrapper, scope 7
|
|
} // end sil function 'maker'
|
|
|
|
|
|
// Generated and adapted from this Swift source code:
|
|
// ```swift
|
|
// struct Wrapper {
|
|
// let bytes: UInt64
|
|
//
|
|
// private func pop(numBits: UInt64) -> Wrapper {
|
|
// // `self` in here is a nested fragment. It should be salvaged, when inlined in `maker(bits:)`
|
|
// return Self(bytes: bytes - numBits)
|
|
// }
|
|
//
|
|
// public static func maker(bits: UInt64) -> Wrapper {
|
|
// // This function is static, but `pop`'s self should be inlined in here
|
|
// return Wrapper(bytes: 0xDEADBEEF).pop(numBits: bits)
|
|
// }
|
|
// }
|
|
// ```
|