blob: 36c372c58b28fe9d110aed9d68f3c6fa4fba9ddf [file] [log] [blame]
// RUN: %target-sil-opt %s -diagnostic-constant-propagation -o /dev/null -verify
//
// REQUIRES: CPU=i386 || CPU=x86_64
//
// Tests for checking floating-point diagnostics produced by constant
// propagation phase on SIL inputs.
// This file tests to make sure that diagnostics are correctly emitted when
// AST information is not available.
sil_stage raw
import Builtin
import Swift
sil @testFPToUInt8ViaDouble : $@convention(thin) () -> UInt8 {
bb0:
%0 = float_literal $Builtin.FPIEEE80, 0x4007FF00000000000000 // 510
%1 = builtin "fptrunc_FPIEEE80_FPIEEE64"(%0 : $Builtin.FPIEEE80) : $Builtin.FPIEEE64
%2 = struct $Double (%1 : $Builtin.FPIEEE64)
%3 = struct_extract %2 : $Double, #Double._value
%4 = builtin "fptoui_FPIEEE64_Int8"(%3 : $Builtin.FPIEEE64) : $Builtin.Int8 // expected-error {{invalid conversion: '510' overflows 'Builtin.Int8'}}
%5 = struct $UInt8 (%4 : $Builtin.Int8)
return %5 : $UInt8
}
sil @testFPToInt64 : $@convention(thin) () -> Builtin.Int64 {
bb0:
%0 = float_literal $Builtin.FPIEEE80, 0x403DFFFFFFFFFFFFFFFE // 9223372036854775807
%1 = builtin "fptosi_FPIEEE80_Int64"(%0 : $Builtin.FPIEEE80) : $Builtin.Int64
%2 = float_literal $Builtin.FPIEEE80, 0xC03E8000000000000000 // -9223372036854775808
%3 = builtin "fptosi_FPIEEE80_Int64"(%2 : $Builtin.FPIEEE80) : $Builtin.Int64
%4 = float_literal $Builtin.FPIEEE80, 0x403E8000000000000000 // 9223372036854775808
%5 = builtin "fptosi_FPIEEE80_Int64"(%4 : $Builtin.FPIEEE80) : $Builtin.Int64 // expected-error {{invalid conversion: '9223372036854775808' overflows 'Builtin.Int64'}}
return %1 : $Builtin.Int64
}
sil @testFPToUInt64 : $@convention(thin) () -> Builtin.Int64 {
bb0:
%0 = float_literal $Builtin.FPIEEE80, 0x403EFFFFFFFFFFFFFFFF // 18446744073709551615
%1 = builtin "fptoui_FPIEEE80_Int64"(%0 : $Builtin.FPIEEE80) : $Builtin.Int64
%2 = float_literal $Builtin.FPIEEE80, 0x403F8000000000000000 // 18446744073709551616
%3 = builtin "fptoui_FPIEEE80_Int64"(%2 : $Builtin.FPIEEE80) : $Builtin.Int64 // expected-error {{invalid conversion: '18446744073709551616' overflows 'Builtin.Int64'}}
%4 = float_literal $Builtin.FPIEEE80, 0xC03EFFFFFFFFFFFFFFFF // -18446744073709551615
%5 = builtin "fptoui_FPIEEE80_Int64"(%4 : $Builtin.FPIEEE80) : $Builtin.Int64 // expected-error {{negative literal '-18446744073709551615' cannot be converted to unsigned 'Builtin.Int64'}}
return %1 : $Builtin.Int64
}
sil @testFPToInt64ViaDouble : $@convention(thin) () -> Builtin.Int64 {
bb0:
// A case where implicit conversion of the float literal to 'Double'
// results in an overflow during conversion to 'Int64''
%0 = float_literal $Builtin.FPIEEE80, 0x403DFFFFFFFFFFFFFFFE // 9223372036854775807
%1 = builtin "fptrunc_FPIEEE80_FPIEEE64"(%0 : $Builtin.FPIEEE80) : $Builtin.FPIEEE64
%2 = struct $Double (%1 : $Builtin.FPIEEE64)
%3 = struct_extract %2 : $Double, #Double._value
%4 = builtin "fptosi_FPIEEE64_Int64"(%3 : $Builtin.FPIEEE64) : $Builtin.Int64 // expected-error {{invalid conversion: '9.2233720368547758E+18' overflows 'Builtin.Int64'}}
// A similar case for 'UInt64'.
%5 = float_literal $Builtin.FPIEEE80, 0x403EFFFFFFFFFFFFFFFF // 18446744073709551615
%6 = builtin "fptrunc_FPIEEE80_FPIEEE64"(%5 : $Builtin.FPIEEE80) : $Builtin.FPIEEE64
%7 = struct $Double (%6 : $Builtin.FPIEEE64)
%8 = struct_extract %7 : $Double, #Double._value
%9 = builtin "fptoui_FPIEEE64_Int64"(%8 : $Builtin.FPIEEE64) : $Builtin.Int64 // expected-error {{invalid conversion: '1.8446744073709552E+19' overflows 'Builtin.Int64'}}
// A case where implicit conversion of the float literal to 'Double'
// elides an overflow that one would expect during conversion to 'Int64'.
%10 = float_literal $Builtin.FPIEEE80, 0xC03E8000000000000001 // -9223372036854775809
%11 = builtin "fptrunc_FPIEEE80_FPIEEE64"(%10 : $Builtin.FPIEEE80) : $Builtin.FPIEEE64
%12 = struct $Double (%11 : $Builtin.FPIEEE64)
%13 = struct_extract %12 : $Double, #Double._value
%14 = builtin "fptosi_FPIEEE64_Int64"(%13 : $Builtin.FPIEEE64) : $Builtin.Int64
return %14 : $Builtin.Int64
}