Index: llvm/trunk/docs/LangRef.rst =================================================================== --- llvm/trunk/docs/LangRef.rst +++ llvm/trunk/docs/LangRef.rst @@ -3288,14 +3288,12 @@ Convert an unsigned integer constant to the corresponding floating-point constant. TYPE must be a scalar or vector floating-point type. CST must be of scalar or vector integer type. Both CST and TYPE must - be scalars, or vectors of the same number of elements. If the value - won't fit in the floating-point type, the results are undefined. + be scalars, or vectors of the same number of elements. ``sitofp (CST to TYPE)`` Convert a signed integer constant to the corresponding floating-point constant. TYPE must be a scalar or vector floating-point type. CST must be of scalar or vector integer type. Both CST and TYPE must - be scalars, or vectors of the same number of elements. If the value - won't fit in the floating-point type, the results are undefined. + be scalars, or vectors of the same number of elements. ``ptrtoint (CST to TYPE)`` Perform the :ref:`ptrtoint operation ` on constants. ``inttoptr (CST to TYPE)`` @@ -8851,8 +8849,9 @@ The '``uitofp``' instruction interprets its operand as an unsigned integer quantity and converts it to the corresponding floating-point -value. If the value cannot fit in the floating-point value, the results -are undefined. +value. If the value cannot be exactly represented, it is rounded using +the default rounding mode. + Example: """""""" @@ -8891,9 +8890,9 @@ """""""""" The '``sitofp``' instruction interprets its operand as a signed integer -quantity and converts it to the corresponding floating-point value. If -the value cannot fit in the floating-point value, the results are -undefined. +quantity and converts it to the corresponding floating-point value. If the +value cannot be exactly represented, it is rounded using the default rounding +mode. Example: """""""" Index: llvm/trunk/lib/IR/ConstantFold.cpp =================================================================== --- llvm/trunk/lib/IR/ConstantFold.cpp +++ llvm/trunk/lib/IR/ConstantFold.cpp @@ -682,13 +682,8 @@ const APInt &api = CI->getValue(); APFloat apf(DestTy->getFltSemantics(), APInt::getNullValue(DestTy->getPrimitiveSizeInBits())); - if (APFloat::opOverflow & - apf.convertFromAPInt(api, opc==Instruction::SIToFP, - APFloat::rmNearestTiesToEven)) { - // Undefined behavior invoked - the destination type can't represent - // the input constant. - return UndefValue::get(DestTy); - } + apf.convertFromAPInt(api, opc==Instruction::SIToFP, + APFloat::rmNearestTiesToEven); return ConstantFP::get(V->getContext(), apf); } return nullptr; Index: llvm/trunk/test/Transforms/ConstProp/cast.ll =================================================================== --- llvm/trunk/test/Transforms/ConstProp/cast.ll +++ llvm/trunk/test/Transforms/ConstProp/cast.ll @@ -24,7 +24,7 @@ define float @overflow_uitofp() { ; CHECK-LABEL: @overflow_uitofp( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float 0x7FF0000000000000 ; %i = uitofp i130 400000000000000000000000000000000000000 to float ret float %i @@ -32,7 +32,7 @@ define float @overflow_sitofp() { ; CHECK-LABEL: @overflow_sitofp( -; CHECK-NEXT: ret float undef +; CHECK-NEXT: ret float 0x7FF0000000000000 ; %i = sitofp i130 400000000000000000000000000000000000000 to float ret float %i