diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp index 970fb2b1c2f70..a6a77dd58677b 100644 --- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp +++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp @@ -6366,10 +6366,12 @@ mlir::Value IntrinsicLibrary::genNearest(mlir::Type resultType, mlir::FloatType xType = mlir::dyn_cast(x.getType()); const unsigned xBitWidth = xType.getWidth(); mlir::Type i1Ty = builder.getI1Type(); - if constexpr (proc == NearestProc::NextAfter) + if constexpr (proc == NearestProc::NextAfter) { // If isNan(Y), set X to a qNaN that will propagate to the resultIsX result. - x = builder.create( - loc, genIsFPClass(i1Ty, args[1], nanTest), genQNan(xType), x); + mlir::Value qNan = genQNan(xType); + mlir::Value isFPClass = genIsFPClass(i1Ty, args[1], nanTest); + x = builder.create(loc, isFPClass, qNan, x); + } mlir::Value resultIsX = genIsFPClass(i1Ty, x, nanTest); mlir::Type intType = builder.getIntegerType(xBitWidth); mlir::Value one = builder.createIntegerConstant(loc, intType, 1); @@ -6489,12 +6491,11 @@ mlir::Value IntrinsicLibrary::genNearest(mlir::Type resultType, } else { // Kind 2, 3, 4, 8, 16. Increment or decrement X cast to integer. mlir::Value intX = builder.create(loc, intType, x); + mlir::Value add = builder.create(loc, intX, one); + mlir::Value sub = builder.create(loc, intX, one); result = builder.create( loc, resultType, - builder.create( - loc, magnitudeUp, - builder.create(loc, intX, one), - builder.create(loc, intX, one))); + builder.create(loc, magnitudeUp, add, sub)); if constexpr (proc == NearestProc::Nearest || proc == NearestProc::NextAfter) { genRaiseExcept(_FORTRAN_RUNTIME_IEEE_OVERFLOW |