[flang-commits] [PATCH] D143798: [flang] Warn on overflow folding DIM()
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Sun Feb 12 17:23:37 PST 2023
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG9f8ee610beb1: [flang] Warn on overflow folding DIM() (authored by klausler).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D143798/new/
https://reviews.llvm.org/D143798
Files:
flang/include/flang/Evaluate/integer.h
flang/lib/Evaluate/fold-integer.cpp
flang/lib/Evaluate/fold-real.cpp
flang/test/Evaluate/errors01.f90
Index: flang/test/Evaluate/errors01.f90
===================================================================
--- flang/test/Evaluate/errors01.f90
+++ flang/test/Evaluate/errors01.f90
@@ -156,6 +156,10 @@
real, parameter :: bad1 = scale(1.0, 99999)
!CHECK: complex ABS intrinsic folding overflow
real, parameter :: bad2 = abs(cmplx(huge(0.),huge(0.)))
+ !CHECK: warning: DIM intrinsic folding overflow
+ real, parameter :: bad3 = dim(huge(1.),-.5*huge(1.))
+ !CHECK: warning: DIM intrinsic folding overflow
+ integer, parameter :: bad4 = dim(huge(1),-1)
!CHECK: warning: overflow on REAL(8) to REAL(4) conversion
x = 1.D40
end subroutine
Index: flang/lib/Evaluate/fold-real.cpp
===================================================================
--- flang/lib/Evaluate/fold-real.cpp
+++ flang/lib/Evaluate/fold-real.cpp
@@ -138,10 +138,14 @@
}));
} else if (name == "dim") {
return FoldElementalIntrinsic<T, T, T>(context, std::move(funcRef),
- ScalarFunc<T, T, T>(
- [](const Scalar<T> &x, const Scalar<T> &y) -> Scalar<T> {
- return x.DIM(y).value;
- }));
+ ScalarFunc<T, T, T>([&context](const Scalar<T> &x,
+ const Scalar<T> &y) -> Scalar<T> {
+ ValueWithRealFlags<Scalar<T>> result{x.DIM(y)};
+ if (result.flags.test(RealFlag::Overflow)) {
+ context.messages().Say("DIM intrinsic folding overflow"_warn_en_US);
+ }
+ return result.value;
+ }));
} else if (name == "dot_product") {
return FoldDotProduct<T>(context, std::move(funcRef));
} else if (name == "dprod") {
Index: flang/lib/Evaluate/fold-integer.cpp
===================================================================
--- flang/lib/Evaluate/fold-integer.cpp
+++ flang/lib/Evaluate/fold-integer.cpp
@@ -568,8 +568,15 @@
cx->u)};
}
} else if (name == "dim") {
- return FoldElementalIntrinsic<T, T, T>(
- context, std::move(funcRef), &Scalar<T>::DIM);
+ return FoldElementalIntrinsic<T, T, T>(context, std::move(funcRef),
+ ScalarFunc<T, T, T>([&context](const Scalar<T> &x,
+ const Scalar<T> &y) -> Scalar<T> {
+ auto result{x.DIM(y)};
+ if (result.overflow) {
+ context.messages().Say("DIM intrinsic folding overflow"_warn_en_US);
+ }
+ return result.value;
+ }));
} else if (name == "dot_product") {
return FoldDotProduct<T>(context, std::move(funcRef));
} else if (name == "dshiftl" || name == "dshiftr") {
Index: flang/include/flang/Evaluate/integer.h
===================================================================
--- flang/include/flang/Evaluate/integer.h
+++ flang/include/flang/Evaluate/integer.h
@@ -784,12 +784,12 @@
return {diff.value, overflow};
}
- // MAX(X-Y, 0)
- constexpr Integer DIM(const Integer &y) const {
+ // DIM(X,Y)=MAX(X-Y, 0)
+ constexpr ValueWithOverflow DIM(const Integer &y) const {
if (CompareSigned(y) != Ordering::Greater) {
return {};
} else {
- return SubtractSigned(y).value;
+ return SubtractSigned(y);
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D143798.496817.patch
Type: text/x-patch
Size: 3201 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20230213/116732fd/attachment-0001.bin>
More information about the flang-commits
mailing list