mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
463 lines
26 KiB
Plaintext
463 lines
26 KiB
Plaintext
// RUN: %target-swift-frontend %s -emit-sil -O -o - -verify | %FileCheck %s
|
|
|
|
sil_stage canonical
|
|
|
|
import Builtin
|
|
import Swift
|
|
import SwiftShims
|
|
|
|
// top_level_code
|
|
sil private @top_level_code : $@convention(thin) () -> () {
|
|
bb0:
|
|
%0 = tuple () // user: %1
|
|
return %0 : $() // id: %1
|
|
}
|
|
|
|
struct BuiltinWord {
|
|
var value: Builtin.Word
|
|
}
|
|
|
|
struct BuiltinUWord {
|
|
var value: Builtin.Word
|
|
}
|
|
|
|
// peephole: Word(Int64(x >> 1)) -> (x >> 1)
|
|
// CHECK-LABEL: sil @_TF4test29test_trunc_u_to_s_zext_lshr_1FSuSi : $@convention(thin) (BuiltinUWord) -> BuiltinWord
|
|
// CHECK: builtin "lshr_Word"
|
|
// CHECK-NOT: builtin "zextOrBitCast_Word_Int64"
|
|
// CHECK-NOT: builtin "u_to_s_checked_conversion_Int64"
|
|
// CHECK-NOT: builtin "truncOrBitCast_Int64_Word"
|
|
// CHECK: return
|
|
// test.test_trunc_u_to_s_zext_lshr_1 (BuiltinUWord) -> Swift.BuiltinWord
|
|
sil @_TF4test29test_trunc_u_to_s_zext_lshr_1FSuSi : $@convention(thin) (BuiltinUWord) -> BuiltinWord {
|
|
bb0(%0 : $BuiltinUWord):
|
|
debug_value %0 : $BuiltinUWord, let, name "x" // id: %1
|
|
%2 = integer_literal $Builtin.Word, 1 // user: %7
|
|
br bb1 // id: %3
|
|
|
|
bb1: // Preds: bb0
|
|
br bb2 // id: %4
|
|
|
|
bb2: // Preds: bb1
|
|
%6 = struct_extract %0 : $BuiltinUWord, #BuiltinUWord.value // user: %7
|
|
%7 = builtin "lshr_Word"(%6 : $Builtin.Word, %2 : $Builtin.Word) : $Builtin.Word // user: %8
|
|
%8 = struct $BuiltinUWord (%7 : $Builtin.Word) // user: %11
|
|
br bb3 // id: %9
|
|
|
|
bb3: // Preds: bb2
|
|
%11 = struct_extract %8 : $BuiltinUWord, #BuiltinUWord.value // user: %12
|
|
%12 = builtin "zextOrBitCast_Word_Int64"(%11 : $Builtin.Word) : $Builtin.Int64 // user: %14
|
|
%14 = builtin "u_to_s_checked_conversion_Int64"(%12 : $Builtin.Int64) : $(Builtin.Int64, Builtin.Int1) // users: %15, %16
|
|
%15 = tuple_extract %14 : $(Builtin.Int64, Builtin.Int1), 0 // user: %18
|
|
%16 = tuple_extract %14 : $(Builtin.Int64, Builtin.Int1), 1 // user: %17
|
|
cond_fail %16 : $Builtin.Int1 // id: %17
|
|
%18 = struct $Int64 (%15 : $Builtin.Int64) // user: %19
|
|
%19 = struct_extract %18 : $Int64, #Int64._value // user: %21
|
|
%21 = builtin "truncOrBitCast_Int64_Word"(%19 : $Builtin.Int64) : $Builtin.Word // user: %22
|
|
%22 = struct $BuiltinWord (%21 : $Builtin.Word) // users: %23, %24
|
|
debug_value %22 : $BuiltinWord, let, name "v1" // id: %23
|
|
return %22 : $BuiltinWord // id: %24
|
|
}
|
|
|
|
|
|
// peephole: Word(Int64(x >> 10)) -> (x >> 1)
|
|
// CHECK-LABEL: sil @_TF4test30test_trunc_u_to_s_zext_lshr_10FSuSi : $@convention(thin) (BuiltinUWord) -> BuiltinWord
|
|
// CHECK: builtin "lshr_Word"
|
|
// CHECK-NOT: builtin "zextOrBitCast_Word_Int64"
|
|
// CHECK-NOT: builtin "u_to_s_checked_conversion_Int64"
|
|
// CHECK-NOT: builtin "truncOrBitCast_Int64_Word"
|
|
// CHECK: return
|
|
// test.test_trunc_u_to_s_zext_lshr_10 (Swift.BuiltinUWord) -> Swift.BuiltinWord
|
|
sil @_TF4test30test_trunc_u_to_s_zext_lshr_10FSuSi : $@convention(thin) (BuiltinUWord) -> BuiltinWord {
|
|
bb0(%0 : $BuiltinUWord):
|
|
debug_value %0 : $BuiltinUWord, let, name "x" // id: %1
|
|
%2 = integer_literal $Builtin.Word, 10 // user: %7
|
|
br bb1 // id: %3
|
|
|
|
bb1: // Preds: bb0
|
|
br bb2 // id: %4
|
|
|
|
bb2: // Preds: bb1
|
|
%6 = struct_extract %0 : $BuiltinUWord, #BuiltinUWord.value // user: %7
|
|
%7 = builtin "lshr_Word"(%6 : $Builtin.Word, %2 : $Builtin.Word) : $Builtin.Word // user: %8
|
|
%8 = struct $BuiltinUWord (%7 : $Builtin.Word) // user: %11
|
|
br bb3 // id: %9
|
|
|
|
bb3: // Preds: bb2
|
|
%11 = struct_extract %8 : $BuiltinUWord, #BuiltinUWord.value // user: %12
|
|
%12 = builtin "zextOrBitCast_Word_Int64"(%11 : $Builtin.Word) : $Builtin.Int64 // user: %14
|
|
%14 = builtin "u_to_s_checked_conversion_Int64"(%12 : $Builtin.Int64) : $(Builtin.Int64, Builtin.Int1) // users: %15, %16
|
|
%15 = tuple_extract %14 : $(Builtin.Int64, Builtin.Int1), 0 // user: %18
|
|
%16 = tuple_extract %14 : $(Builtin.Int64, Builtin.Int1), 1 // user: %17
|
|
cond_fail %16 : $Builtin.Int1 // id: %17
|
|
%18 = struct $Int64 (%15 : $Builtin.Int64) // user: %19
|
|
%19 = struct_extract %18 : $Int64, #Int64._value // user: %21
|
|
%21 = builtin "truncOrBitCast_Int64_Word"(%19 : $Builtin.Int64) : $Builtin.Word // user: %22
|
|
%22 = struct $BuiltinWord (%21 : $Builtin.Word) // users: %23, %24
|
|
debug_value %22 : $BuiltinWord, let, name "v1" // id: %23
|
|
return %22 : $BuiltinWord // id: %24
|
|
}
|
|
|
|
// no peephole: Word(Int64(x >> c)), where c is a variable
|
|
// This should not trigger the optimization as it is not known if c > 0
|
|
// CHECK-LABEL: sil @_TF4test31test_trunc_u_to_s_zext_lshr_varFTSuSu_Si : $@convention(thin) (BuiltinUWord, BuiltinUWord) -> BuiltinWord
|
|
// CHECK: builtin "u_to_s_checked_conversion_Int64"
|
|
// CHECK: builtin "truncOrBitCast_Int64_Word"
|
|
// CHECK: return
|
|
// test.test_trunc_u_to_s_zext_lshr_var (Swift.BuiltinUWord, Swift.BuiltinUWord) -> Swift.BuiltinWord
|
|
sil @_TF4test31test_trunc_u_to_s_zext_lshr_varFTSuSu_Si : $@convention(thin) (BuiltinUWord, BuiltinUWord) -> BuiltinWord {
|
|
bb0(%0 : $BuiltinUWord, %1 : $BuiltinUWord):
|
|
debug_value %0 : $BuiltinUWord, let, name "x" // id: %2
|
|
debug_value %1 : $BuiltinUWord, let, name "c" // id: %3
|
|
%4 = tuple ()
|
|
%5 = tuple ()
|
|
%6 = tuple ()
|
|
%7 = tuple ()
|
|
%8 = tuple ()
|
|
%9 = tuple ()
|
|
%10 = tuple ()
|
|
%11 = tuple ()
|
|
%12 = tuple ()
|
|
br bb1 // id: %13
|
|
|
|
bb1: // Preds: bb0
|
|
%14 = integer_literal $Builtin.Word, 64 // user: %17
|
|
%16 = struct_extract %1 : $BuiltinUWord, #BuiltinUWord.value // user: %17
|
|
%17 = builtin "cmp_ult_Word"(%16 : $Builtin.Word, %14 : $Builtin.Word) : $Builtin.Int1 // user: %20
|
|
%18 = integer_literal $Builtin.Int1, -1 // user: %20
|
|
%20 = builtin "int_expect_Int1"(%17 : $Builtin.Int1, %18 : $Builtin.Int1) : $Builtin.Int1 // user: %21
|
|
cond_br %20, bb2, bb3 // id: %21
|
|
|
|
bb2: // Preds: bb1
|
|
%23 = struct_extract %0 : $BuiltinUWord, #BuiltinUWord.value // user: %25
|
|
%24 = struct_extract %1 : $BuiltinUWord, #BuiltinUWord.value // user: %25
|
|
%25 = builtin "lshr_Word"(%23 : $Builtin.Word, %24 : $Builtin.Word) : $Builtin.Word // user: %26
|
|
%26 = struct $BuiltinUWord (%25 : $Builtin.Word) // user: %35
|
|
br bb4 // id: %27
|
|
|
|
bb3: // Preds: bb1
|
|
%28 = function_ref @fatalError : $@convention(thin) () -> Never // user: %32
|
|
%29 = tuple ()
|
|
%30 = tuple ()
|
|
%31 = tuple ()
|
|
%32 = apply %28() : $@convention(thin) () -> Never
|
|
unreachable // id: %33
|
|
|
|
bb4: // Preds: bb2
|
|
%35 = struct_extract %26 : $BuiltinUWord, #BuiltinUWord.value // user: %36
|
|
%36 = builtin "zextOrBitCast_Word_Int64"(%35 : $Builtin.Word) : $Builtin.Int64 // user: %38
|
|
%38 = builtin "u_to_s_checked_conversion_Int64"(%36 : $Builtin.Int64) : $(Builtin.Int64, Builtin.Int1) // users: %39, %40
|
|
%39 = tuple_extract %38 : $(Builtin.Int64, Builtin.Int1), 0 // user: %42
|
|
%40 = tuple_extract %38 : $(Builtin.Int64, Builtin.Int1), 1 // user: %41
|
|
cond_fail %40 : $Builtin.Int1 // id: %41
|
|
%42 = struct $Int64 (%39 : $Builtin.Int64) // user: %43
|
|
%43 = struct_extract %42 : $Int64, #Int64._value // user: %45
|
|
%45 = builtin "truncOrBitCast_Int64_Word"(%43 : $Builtin.Int64) : $Builtin.Word // user: %46
|
|
%46 = struct $BuiltinWord (%45 : $Builtin.Word) // users: %47, %48
|
|
debug_value %46 : $BuiltinWord, let, name "v1" // id: %47
|
|
return %46 : $BuiltinWord // id: %48
|
|
}
|
|
|
|
// peephole: UInt16(Int32(x >> 1)) -> (x >> 1)
|
|
// CHECK-LABEL: sil @_TF4test36test_uint16_trunc_u_to_s_zext_lshr_1FVs6UInt16S0_ : $@convention(thin) (UInt16) -> UInt16
|
|
// CHECK: builtin "lshr_Int16"
|
|
// CHECK-NOT: builtin "zext_Int16_Int32"
|
|
// CHECK-NOT: builtin "s_to_u_checked_trunc_Int32_Int16"
|
|
// CHECK-NOT: tuple_extract
|
|
// CHECK: return
|
|
// test.test_uint16_trunc_u_to_s_zext_lshr_1 (Swift.UInt16) -> Swift.UInt16
|
|
sil @_TF4test36test_uint16_trunc_u_to_s_zext_lshr_1FVs6UInt16S0_ : $@convention(thin) (UInt16) -> UInt16 {
|
|
bb0(%0 : $UInt16):
|
|
debug_value %0 : $UInt16, let, name "x" // id: %1
|
|
%2 = integer_literal $Builtin.Int16, 1 // user: %7
|
|
br bb1 // id: %3
|
|
|
|
bb1: // Preds: bb0
|
|
br bb2 // id: %4
|
|
|
|
bb2: // Preds: bb1
|
|
%6 = struct_extract %0 : $UInt16, #UInt16._value // user: %7
|
|
%7 = builtin "lshr_Int16"(%6 : $Builtin.Int16, %2 : $Builtin.Int16) : $Builtin.Int16 // user: %8
|
|
%8 = struct $UInt16 (%7 : $Builtin.Int16) // user: %10
|
|
br bb3 // id: %9
|
|
|
|
bb3: // Preds: bb2
|
|
%10 = struct_extract %8 : $UInt16, #UInt16._value // user: %12
|
|
%12 = builtin "zext_Int16_Int32"(%10 : $Builtin.Int16) : $Builtin.Int32 // user: %13
|
|
%13 = struct $Int32 (%12 : $Builtin.Int32) // user: %14
|
|
%14 = struct_extract %13 : $Int32, #Int32._value // user: %16
|
|
%16 = builtin "s_to_u_checked_trunc_Int32_Int16"(%14 : $Builtin.Int32) : $(Builtin.Int16, Builtin.Int1) // users: %17, %18
|
|
%17 = tuple_extract %16 : $(Builtin.Int16, Builtin.Int1), 0 // user: %20
|
|
%18 = tuple_extract %16 : $(Builtin.Int16, Builtin.Int1), 1 // user: %19
|
|
cond_fail %18 : $Builtin.Int1 // id: %19
|
|
%20 = struct $UInt16 (%17 : $Builtin.Int16) // users: %21, %22
|
|
debug_value %20 : $UInt16, let, name "v1" // id: %21
|
|
return %20 : $UInt16 // id: %22
|
|
}
|
|
|
|
|
|
// peephole: Int16(Int32(x >> 1)) -> (x >> 1)
|
|
// CHECK-LABEL: sil @_TF4test35test_int16_trunc_u_to_s_zext_lshr_1FVs6UInt16Vs5Int16 : $@convention(thin) (UInt16) -> Int16
|
|
// CHECK: builtin "lshr_Int16"
|
|
// CHECK-NOT: builtin "zext_Int16_Int32"
|
|
// CHECK-NOT: builtin "s_to_u_checked_trunc_Int32_Int16"
|
|
// CHECK-NOT: tuple_extract
|
|
// CHECK: return
|
|
// test.test_int16_trunc_u_to_s_zext_lshr_1 (Swift.UInt16) -> Swift.Int16
|
|
sil @_TF4test35test_int16_trunc_u_to_s_zext_lshr_1FVs6UInt16Vs5Int16 : $@convention(thin) (UInt16) -> Int16 {
|
|
bb0(%0 : $UInt16):
|
|
debug_value %0 : $UInt16, let, name "x" // id: %1
|
|
%2 = integer_literal $Builtin.Int16, 1 // user: %7
|
|
br bb1 // id: %3
|
|
|
|
bb1: // Preds: bb0
|
|
br bb2 // id: %4
|
|
|
|
bb2: // Preds: bb1
|
|
%6 = struct_extract %0 : $UInt16, #UInt16._value // user: %7
|
|
%7 = builtin "lshr_Int16"(%6 : $Builtin.Int16, %2 : $Builtin.Int16) : $Builtin.Int16 // user: %8
|
|
%8 = struct $UInt16 (%7 : $Builtin.Int16) // user: %10
|
|
br bb3 // id: %9
|
|
|
|
bb3: // Preds: bb2
|
|
%10 = struct_extract %8 : $UInt16, #UInt16._value // user: %12
|
|
%12 = builtin "zext_Int16_Int32"(%10 : $Builtin.Int16) : $Builtin.Int32 // user: %13
|
|
%13 = struct $Int32 (%12 : $Builtin.Int32) // user: %14
|
|
%14 = struct_extract %13 : $Int32, #Int32._value // user: %16
|
|
%16 = builtin "s_to_s_checked_trunc_Int32_Int16"(%14 : $Builtin.Int32) : $(Builtin.Int16, Builtin.Int1) // users: %17, %18
|
|
%17 = tuple_extract %16 : $(Builtin.Int16, Builtin.Int1), 0 // user: %20
|
|
%18 = tuple_extract %16 : $(Builtin.Int16, Builtin.Int1), 1 // user: %19
|
|
cond_fail %18 : $Builtin.Int1 // id: %19
|
|
%20 = struct $Int16 (%17 : $Builtin.Int16) // users: %21, %22
|
|
debug_value %20 : $Int16, let, name "v1" // id: %21
|
|
return %20 : $Int16 // id: %22
|
|
}
|
|
|
|
// No peephole for UWord(UInt64(x)), because it is not known if top bit of x is set
|
|
// CHECK-LABEL: sil @_TF4test26test_trunc_s_to_u_zext_varFSiSu : $@convention(thin) (BuiltinWord) -> BuiltinUWord
|
|
// This should not trigger the optimization as it is not known if top bit of x is set
|
|
// CHECK: builtin "zextOrBitCast_Word_Int64"
|
|
// CHECK: builtin "s_to_u_checked_conversion_Int64"
|
|
// CHECK: builtin "truncOrBitCast_Int64_Word"
|
|
// CHECK: return
|
|
// test.test_trunc_s_to_u_zext_var (Swift.BuiltinWord) -> Swift.BuiltinUWord
|
|
sil @_TF4test26test_trunc_s_to_u_zext_varFSiSu : $@convention(thin) (BuiltinWord) -> BuiltinUWord {
|
|
bb0(%0 : $BuiltinWord):
|
|
debug_value %0 : $BuiltinWord, let, name "x" // id: %1
|
|
%3 = struct_extract %0 : $BuiltinWord, #BuiltinWord.value // user: %4
|
|
%4 = builtin "zextOrBitCast_Word_Int64"(%3 : $Builtin.Word) : $Builtin.Int64 // user: %6
|
|
%6 = builtin "s_to_u_checked_conversion_Int64"(%4 : $Builtin.Int64) : $(Builtin.Int64, Builtin.Int1) // users: %7, %8
|
|
%7 = tuple_extract %6 : $(Builtin.Int64, Builtin.Int1), 0 // user: %10
|
|
%8 = tuple_extract %6 : $(Builtin.Int64, Builtin.Int1), 1 // user: %9
|
|
cond_fail %8 : $Builtin.Int1 // id: %9
|
|
%10 = struct $UInt64 (%7 : $Builtin.Int64) // user: %11
|
|
%11 = struct_extract %10 : $UInt64, #UInt64._value // user: %13
|
|
%13 = builtin "truncOrBitCast_Int64_Word"(%11 : $Builtin.Int64) : $Builtin.Word // user: %14
|
|
%14 = struct $BuiltinUWord (%13 : $Builtin.Word) // user: %15
|
|
return %14 : $BuiltinUWord // id: %15
|
|
}
|
|
|
|
|
|
// sizeof is known to return strictly positive values
|
|
// peephole: UWord(UInt64(sizeof(Int.self))) -> sizeof(Int.self)
|
|
// CHECK-LABEL: sil @_TF4test29test_trunc_s_to_u_zext_sizeofFT_Su : $@convention(thin) () -> BuiltinUWord
|
|
// CHECK: builtin "sizeof"
|
|
// CHECK-NOT: builtin "zextOrBitCast_Word_Int64"
|
|
// CHECK-NOT: builtin "s_to_u_checked_conversion_Int64"
|
|
// CHECK-NOT: builtin "truncOrBitCast_Int64_Word"
|
|
// CHECK: return
|
|
// test.test_trunc_s_to_u_zext_sizeof () -> Swift.BuiltinUWord
|
|
sil @_TF4test29test_trunc_s_to_u_zext_sizeofFT_Su : $@convention(thin) () -> BuiltinUWord {
|
|
bb0:
|
|
%0 = metatype $@thin BuiltinWord.Type
|
|
%2 = metatype $@thick BuiltinWord.Type // user: %3
|
|
%3 = builtin "sizeof"<(BuiltinWord)>(%2 : $@thick (BuiltinWord).Type) : $Builtin.Word // user: %4
|
|
%4 = struct $BuiltinWord (%3 : $Builtin.Word) // user: %6
|
|
%6 = struct_extract %4 : $BuiltinWord, #BuiltinWord.value // user: %7
|
|
%7 = builtin "zextOrBitCast_Word_Int64"(%6 : $Builtin.Word) : $Builtin.Int64 // user: %9
|
|
%9 = builtin "s_to_u_checked_conversion_Int64"(%7 : $Builtin.Int64) : $(Builtin.Int64, Builtin.Int1) // users: %10, %11
|
|
%10 = tuple_extract %9 : $(Builtin.Int64, Builtin.Int1), 0 // user: %13
|
|
%11 = tuple_extract %9 : $(Builtin.Int64, Builtin.Int1), 1 // user: %12
|
|
cond_fail %11 : $Builtin.Int1 // id: %12
|
|
%13 = struct $UInt64 (%10 : $Builtin.Int64) // user: %14
|
|
%14 = struct_extract %13 : $UInt64, #UInt64._value // user: %16
|
|
%16 = builtin "truncOrBitCast_Int64_Word"(%14 : $Builtin.Int64) : $Builtin.Word // user: %17
|
|
%17 = struct $BuiltinUWord (%16 : $Builtin.Word) // user: %18
|
|
return %17 : $BuiltinUWord // id: %18
|
|
}
|
|
|
|
|
|
// sizeof is known to return strictly positive values
|
|
// But Word ->Int64 is not a safe conversion
|
|
// No peephole for UInt16(UInt32(sizeof(Int.self)))
|
|
// CHECK-LABEL: sil @_TF4test35test_int16_trunc_s_to_u_zext_sizeofFT_Vs6UInt16 : $@convention(thin) () -> UInt16
|
|
// CHECK: builtin "zextOrBitCast_Word_Int64"
|
|
// CHECK: builtin "s_to_u_checked_trunc_Int64_Int32"
|
|
// CHECK: builtin "u_to_u_checked_trunc_Int32_Int16"
|
|
// CHECK: return
|
|
// test.test_int16_trunc_s_to_u_zext_sizeof () -> Swift.UInt16
|
|
sil @_TF4test35test_int16_trunc_s_to_u_zext_sizeofFT_Vs6UInt16 : $@convention(thin) () -> UInt16 {
|
|
bb0:
|
|
%0 = metatype $@thin Int.Type
|
|
%2 = metatype $@thick Int.Type // user: %3
|
|
%3 = builtin "sizeof"<(Int)>(%2 : $@thick (Int).Type) : $Builtin.Word // user: %4
|
|
%4 = tuple ()
|
|
%6 = tuple ()
|
|
%7 = builtin "zextOrBitCast_Word_Int64"(%3 : $Builtin.Word) : $Builtin.Int64 // user: %9
|
|
%9 = builtin "s_to_u_checked_trunc_Int64_Int32"(%7 : $Builtin.Int64) : $(Builtin.Int32, Builtin.Int1) // users: %10, %11
|
|
%10 = tuple_extract %9 : $(Builtin.Int32, Builtin.Int1), 0 // user: %13
|
|
%11 = tuple_extract %9 : $(Builtin.Int32, Builtin.Int1), 1 // user: %12
|
|
cond_fail %11 : $Builtin.Int1 // id: %12
|
|
%13 = struct $UInt32 (%10 : $Builtin.Int32) // user: %14
|
|
%14 = struct_extract %13 : $UInt32, #UInt32._value // user: %16
|
|
%16 = builtin "u_to_u_checked_trunc_Int32_Int16"(%14 : $Builtin.Int32) : $(Builtin.Int16, Builtin.Int1) // users: %17, %18
|
|
%17 = tuple_extract %16 : $(Builtin.Int16, Builtin.Int1), 0 // user: %20
|
|
%18 = tuple_extract %16 : $(Builtin.Int16, Builtin.Int1), 1 // user: %19
|
|
cond_fail %18 : $Builtin.Int1 // id: %19
|
|
%20 = struct $UInt16 (%17 : $Builtin.Int16) // user: %21
|
|
return %20 : $UInt16 // id: %21
|
|
}
|
|
|
|
|
|
// peephole: UInt16(UInt32(Int16(x>>1))) -> x>>1
|
|
// CHECK-LABEL: sil @_TF4test34test_int16_trunc_s_to_u_zext_int16FVs6UInt16S0_ : $@convention(thin) (UInt16) -> UInt16
|
|
// CHECK: builtin "lshr_Int16"
|
|
// CHECK-NOT: builtin "u_to_s_checked_conversion_Int16"
|
|
// CHECK-NOT: builtin "s_to_u_checked_conversion_Int16"
|
|
// CHECK-NOT: builtin "sext_Int16_Int32"
|
|
// CHECK-NOT: builtin "u_to_u_checked_trunc_Int32_Int16"
|
|
// CHECK-NOT: tuple_extract
|
|
// CHECK: return
|
|
// test.test_int16_trunc_s_to_u_zext_int16 (Swift.UInt16) -> Swift.UInt16
|
|
sil @_TF4test34test_int16_trunc_s_to_u_zext_int16FVs6UInt16S0_ : $@convention(thin) (UInt16) -> UInt16 {
|
|
bb0(%0 : $UInt16):
|
|
debug_value %0 : $UInt16, let, name "x" // id: %1
|
|
%2 = integer_literal $Builtin.Int16, 1 // user: %7
|
|
br bb1 // id: %3
|
|
|
|
bb1: // Preds: bb0
|
|
br bb2 // id: %4
|
|
|
|
bb2: // Preds: bb1
|
|
%6 = struct_extract %0 : $UInt16, #UInt16._value // user: %7
|
|
%7 = builtin "lshr_Int16"(%6 : $Builtin.Int16, %2 : $Builtin.Int16) : $Builtin.Int16 // user: %8
|
|
%8 = struct $UInt16 (%7 : $Builtin.Int16) // user: %10
|
|
br bb3 // id: %9
|
|
|
|
bb3: // Preds: bb2
|
|
%10 = struct_extract %8 : $UInt16, #UInt16._value // user: %12
|
|
%12 = builtin "u_to_s_checked_conversion_Int16"(%10 : $Builtin.Int16) : $(Builtin.Int16, Builtin.Int1) // users: %13, %14
|
|
%13 = tuple_extract %12 : $(Builtin.Int16, Builtin.Int1), 0 // user: %16
|
|
%14 = tuple_extract %12 : $(Builtin.Int16, Builtin.Int1), 1 // user: %15
|
|
cond_fail %14 : $Builtin.Int1 // id: %15
|
|
%16 = struct $Int16 (%13 : $Builtin.Int16) // user: %17
|
|
%17 = struct_extract %16 : $Int16, #Int16._value // user: %19
|
|
%19 = builtin "s_to_u_checked_conversion_Int16"(%17 : $Builtin.Int16) : $(Builtin.Int16, Builtin.Int1) // users: %20, %21
|
|
%20 = tuple_extract %19 : $(Builtin.Int16, Builtin.Int1), 0 // user: %24
|
|
%21 = tuple_extract %19 : $(Builtin.Int16, Builtin.Int1), 1 // user: %22
|
|
cond_fail %21 : $Builtin.Int1 // id: %22
|
|
%24 = builtin "sext_Int16_Int32"(%20 : $Builtin.Int16) : $Builtin.Int32 // user: %25
|
|
%25 = struct $UInt32 (%24 : $Builtin.Int32) // user: %26
|
|
%26 = struct_extract %25 : $UInt32, #UInt32._value // user: %28
|
|
%28 = builtin "u_to_u_checked_trunc_Int32_Int16"(%26 : $Builtin.Int32) : $(Builtin.Int16, Builtin.Int1) // users: %29, %30
|
|
%29 = tuple_extract %28 : $(Builtin.Int16, Builtin.Int1), 0 // user: %32
|
|
%30 = tuple_extract %28 : $(Builtin.Int16, Builtin.Int1), 1 // user: %31
|
|
cond_fail %30 : $Builtin.Int1 // id: %31
|
|
%32 = struct $UInt16 (%29 : $Builtin.Int16) // user: %33
|
|
return %32 : $UInt16 // id: %33
|
|
}
|
|
|
|
// peephole: Int8(x & 127) -> remove overflow check
|
|
// CHECK-LABEL: sil @_TF22peephole_trunc_and_ext32test_s_to_s_checked_trunc_of_andFVs5Int32Vs4Int8 : $@convention(thin) (Int32) -> Int8
|
|
// CHECK: builtin "and_Int32"
|
|
// CHECK: builtin "s_to_s_checked_trunc_Int32_Int8"
|
|
// CHECK-NOT: cond_fail
|
|
// CHECK: return
|
|
// peephole_trunc_and_ext.test_s_to_s_checked_trunc_of_and (Swift.Int32) -> Swift.Int8
|
|
sil @_TF22peephole_trunc_and_ext32test_s_to_s_checked_trunc_of_andFVs5Int32Vs4Int8 : $@convention(thin) (Int32) -> Int8 {
|
|
bb0(%0 : $Int32):
|
|
debug_value %0 : $Int32, let, name "x" // id: %1
|
|
%2 = integer_literal $Builtin.Int32, 127 // user: %5
|
|
%4 = struct_extract %0 : $Int32, #Int32._value // user: %5
|
|
%5 = builtin "and_Int32"(%4 : $Builtin.Int32, %2 : $Builtin.Int32) : $Builtin.Int32 // user: %6
|
|
%6 = struct $Int32 (%5 : $Builtin.Int32) // user: %7
|
|
%7 = struct_extract %6 : $Int32, #Int32._value // user: %9
|
|
%9 = builtin "s_to_s_checked_trunc_Int32_Int8"(%7 : $Builtin.Int32) : $(Builtin.Int8, Builtin.Int1) // users: %10, %11
|
|
%10 = tuple_extract %9 : $(Builtin.Int8, Builtin.Int1), 0 // user: %13
|
|
%11 = tuple_extract %9 : $(Builtin.Int8, Builtin.Int1), 1 // user: %12
|
|
cond_fail %11 : $Builtin.Int1 // id: %12
|
|
%13 = struct $Int8 (%10 : $Builtin.Int8) // user: %14
|
|
return %13 : $Int8 // id: %14
|
|
}
|
|
|
|
// peephole: UInt8(x & 255) -> remove overflow check
|
|
// CHECK-LABEL: sil @_TF22peephole_trunc_and_ext32test_s_to_u_checked_trunc_of_andFVs5Int32Vs5UInt8 : $@convention(thin) (Int32) -> UInt8
|
|
// CHECK: builtin "and_Int32"
|
|
// CHECK: builtin "s_to_u_checked_trunc_Int32_Int8"
|
|
// CHECK-NOT: cond_fail
|
|
// CHECK: return
|
|
// peephole_trunc_and_ext.test_s_to_u_checked_trunc_of_and (Swift.Int32) -> Swift.UInt8
|
|
sil @_TF22peephole_trunc_and_ext32test_s_to_u_checked_trunc_of_andFVs5Int32Vs5UInt8 : $@convention(thin) (Int32) -> UInt8 {
|
|
bb0(%0 : $Int32):
|
|
debug_value %0 : $Int32, let, name "x" // id: %1
|
|
%2 = integer_literal $Builtin.Int32, 255 // user: %5
|
|
%4 = struct_extract %0 : $Int32, #Int32._value // user: %5
|
|
%5 = builtin "and_Int32"(%4 : $Builtin.Int32, %2 : $Builtin.Int32) : $Builtin.Int32 // user: %6
|
|
%6 = struct $Int32 (%5 : $Builtin.Int32) // user: %7
|
|
%7 = struct_extract %6 : $Int32, #Int32._value // user: %9
|
|
%9 = builtin "s_to_u_checked_trunc_Int32_Int8"(%7 : $Builtin.Int32) : $(Builtin.Int8, Builtin.Int1) // users: %10, %11
|
|
%10 = tuple_extract %9 : $(Builtin.Int8, Builtin.Int1), 0 // user: %13
|
|
%11 = tuple_extract %9 : $(Builtin.Int8, Builtin.Int1), 1 // user: %12
|
|
cond_fail %11 : $Builtin.Int1 // id: %12
|
|
%13 = struct $UInt8 (%10 : $Builtin.Int8) // user: %14
|
|
return %13 : $UInt8 // id: %14
|
|
}
|
|
|
|
// peephole: UInt8(x & 255) -> remove overflow check
|
|
// CHECK-LABEL: sil @_TF22peephole_trunc_and_ext32test_u_to_u_checked_trunc_of_andFVs6UInt32Vs5UInt8 : $@convention(thin) (UInt32) -> UInt8
|
|
// CHECK: builtin "and_Int32"
|
|
// CHECK: builtin "u_to_u_checked_trunc_Int32_Int8"
|
|
// CHECK-NOT: cond_fail
|
|
// CHECK: return
|
|
// peephole_trunc_and_ext.test_u_to_u_checked_trunc_of_and (Swift.UInt32) -> Swift.UInt8
|
|
sil @_TF22peephole_trunc_and_ext32test_u_to_u_checked_trunc_of_andFVs6UInt32Vs5UInt8 : $@convention(thin) (UInt32) -> UInt8 {
|
|
bb0(%0 : $UInt32):
|
|
debug_value %0 : $UInt32, let, name "x" // id: %1
|
|
%2 = integer_literal $Builtin.Int32, 255 // user: %5
|
|
%4 = struct_extract %0 : $UInt32, #UInt32._value // user: %5
|
|
%5 = builtin "and_Int32"(%4 : $Builtin.Int32, %2 : $Builtin.Int32) : $Builtin.Int32 // user: %6
|
|
%6 = struct $UInt32 (%5 : $Builtin.Int32) // user: %7
|
|
%7 = struct_extract %6 : $UInt32, #UInt32._value // user: %9
|
|
%9 = builtin "u_to_u_checked_trunc_Int32_Int8"(%7 : $Builtin.Int32) : $(Builtin.Int8, Builtin.Int1) // users: %10, %11
|
|
%10 = tuple_extract %9 : $(Builtin.Int8, Builtin.Int1), 0 // user: %13
|
|
%11 = tuple_extract %9 : $(Builtin.Int8, Builtin.Int1), 1 // user: %12
|
|
cond_fail %11 : $Builtin.Int1 // id: %12
|
|
%13 = struct $UInt8 (%10 : $Builtin.Int8) // user: %14
|
|
return %13 : $UInt8 // id: %14
|
|
}
|
|
|
|
// peephole: Int8(x & 127) -> remove overflow check
|
|
// CHECK-LABEL: sil @_TF22peephole_trunc_and_ext32test_u_to_s_checked_trunc_of_andFVs6UInt32Vs4Int8 : $@convention(thin) (UInt32) -> Int8
|
|
// CHECK: builtin "and_Int32"
|
|
// CHECK: builtin "u_to_s_checked_trunc_Int32_Int8"
|
|
// CHECK-NOT: cond_fail
|
|
// CHECK: return
|
|
// peephole_trunc_and_ext.test_u_to_s_checked_trunc_of_and (Swift.UInt32) -> Swift.Int8
|
|
sil @_TF22peephole_trunc_and_ext32test_u_to_s_checked_trunc_of_andFVs6UInt32Vs4Int8 : $@convention(thin) (UInt32) -> Int8 {
|
|
bb0(%0 : $UInt32):
|
|
debug_value %0 : $UInt32, let, name "x" // id: %1
|
|
%2 = integer_literal $Builtin.Int32, 127 // user: %5
|
|
%4 = struct_extract %0 : $UInt32, #UInt32._value // user: %5
|
|
%5 = builtin "and_Int32"(%4 : $Builtin.Int32, %2 : $Builtin.Int32) : $Builtin.Int32 // user: %6
|
|
%6 = struct $UInt32 (%5 : $Builtin.Int32) // user: %7
|
|
%7 = struct_extract %6 : $UInt32, #UInt32._value // user: %9
|
|
%9 = builtin "u_to_s_checked_trunc_Int32_Int8"(%7 : $Builtin.Int32) : $(Builtin.Int8, Builtin.Int1) // users: %10, %11
|
|
%10 = tuple_extract %9 : $(Builtin.Int8, Builtin.Int1), 0 // user: %13
|
|
%11 = tuple_extract %9 : $(Builtin.Int8, Builtin.Int1), 1 // user: %12
|
|
cond_fail %11 : $Builtin.Int1 // id: %12
|
|
%13 = struct $Int8 (%10 : $Builtin.Int8) // user: %14
|
|
return %13 : $Int8 // id: %14
|
|
}
|
|
|
|
sil [noinline] @fatalError : $@convention(thin) () -> Never
|