From 92afe8021352ef33a282046d404a1f14140f96f9 Mon Sep 17 00:00:00 2001 From: Peter Klausler Date: Fri, 12 Aug 2022 13:20:08 -0700 Subject: [PATCH] [flang] Fold SPACING() correctly when result is subnormal The intrinsic function SPACING() was being folded to the smallest normal number (TINY(x)) rather than to a smaller subnormal result when that result really was subnormal. Differential Revision: https://reviews.llvm.org/D132155 --- flang/lib/Evaluate/real.cpp | 3 +-- flang/test/Evaluate/fold-spacing.f90 | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/flang/lib/Evaluate/real.cpp b/flang/lib/Evaluate/real.cpp index 0af0ef2..ca0f4fd 100644 --- a/flang/lib/Evaluate/real.cpp +++ b/flang/lib/Evaluate/real.cpp @@ -749,8 +749,7 @@ template Real Real::SPACING() const { return TINY(); } else { Real result; - result.Normalize( - false, Exponent() - binaryPrecision + 1, Fraction::MASKL(1)); + result.Normalize(false, Exponent(), Fraction::MASKR(1)); return result; } } diff --git a/flang/test/Evaluate/fold-spacing.f90 b/flang/test/Evaluate/fold-spacing.f90 index d802f17..27834da 100644 --- a/flang/test/Evaluate/fold-spacing.f90 +++ b/flang/test/Evaluate/fold-spacing.f90 @@ -5,6 +5,8 @@ module m logical, parameter :: test_2 = spacing(-3.0) == scale(1.0, -22) logical, parameter :: test_3 = spacing(3.0d0) == scale(1.0, -51) logical, parameter :: test_4 = spacing(0.) == tiny(0.) + logical, parameter :: test_5 = spacing(tiny(0.)) == 1.e-45 + logical, parameter :: test_6 = spacing(8388608.) == 1. logical, parameter :: test_11 = rrspacing(3.0) == scale(0.75, 24) logical, parameter :: test_12 = rrspacing(-3.0) == scale(0.75, 24) logical, parameter :: test_13 = rrspacing(3.0d0) == scale(0.75, 53) -- 2.7.4