From 9f98662b5f4828e337b8c5278e9d1b427692e06e Mon Sep 17 00:00:00 2001 From: Jean Perier Date: Thu, 28 Mar 2019 08:18:42 -0700 Subject: [PATCH] [flang] Fix F18 scalar integer power algorithm Original-commit: flang-compiler/f18@f0609e7ace60d6272285eda9d57e4052632b0e3c --- flang/lib/evaluate/integer.h | 6 +++--- flang/test/evaluate/folding01.f90 | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/flang/lib/evaluate/integer.h b/flang/lib/evaluate/integer.h index eef6e3d1c356..e6be82971056 100644 --- a/flang/lib/evaluate/integer.h +++ b/flang/lib/evaluate/integer.h @@ -953,9 +953,9 @@ public: result.overflow |= product.SignedMultiplicationOverflowed(); } if (j + 1 < nbits) { - ValueWithOverflow doubled{shifted.AddSigned(shifted)}; - result.overflow |= doubled.overflow; - shifted = doubled.value; + Product squared{shifted.MultiplySigned(shifted)}; + result.overflow |= squared.SignedMultiplicationOverflowed(); + shifted = squared.lower; } } } diff --git a/flang/test/evaluate/folding01.f90 b/flang/test/evaluate/folding01.f90 index 2c32be683bd7..0b989e034464 100644 --- a/flang/test/evaluate/folding01.f90 +++ b/flang/test/evaluate/folding01.f90 @@ -95,5 +95,9 @@ module m logical, parameter :: test_divide_i3 = ((-7)/2).EQ.(-3) logical, parameter :: test_divide_i4 = (0/127).EQ.(0) + logical, parameter :: test_pow1 = (2**0).EQ.(1) + logical, parameter :: test_pow2 = (1**100).EQ.(1) + logical, parameter :: test_pow3 = (2**4).EQ.(16) + logical, parameter :: test_pow4 = (7**5).EQ.(16807) end module