diff options
-rw-r--r-- | llvm/docs/LangRef.rst | 17 | ||||
-rw-r--r-- | llvm/lib/IR/ConstantFold.cpp | 9 | ||||
-rw-r--r-- | llvm/test/Transforms/ConstProp/cast.ll | 4 |
3 files changed, 12 insertions, 18 deletions
diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst index 3d252e39f17..c95fca85f70 100644 --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -3288,14 +3288,12 @@ The following is the syntax for constant expressions: 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 <i_ptrtoint>` on constants. ``inttoptr (CST to TYPE)`` @@ -8851,8 +8849,9 @@ Semantics: 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 @@ Semantics: """""""""" 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: """""""" diff --git a/llvm/lib/IR/ConstantFold.cpp b/llvm/lib/IR/ConstantFold.cpp index 218adb45d95..514a5344255 100644 --- a/llvm/lib/IR/ConstantFold.cpp +++ b/llvm/lib/IR/ConstantFold.cpp @@ -682,13 +682,8 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, Constant *V, 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; diff --git a/llvm/test/Transforms/ConstProp/cast.ll b/llvm/test/Transforms/ConstProp/cast.ll index 121246524fe..8377df17b3a 100644 --- a/llvm/test/Transforms/ConstProp/cast.ll +++ b/llvm/test/Transforms/ConstProp/cast.ll @@ -24,7 +24,7 @@ define i8 @overflow_fptoui() { 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_uitofp() { 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 |