[flang-commits] [flang] e7f78fb - [flang] Implement constant folding for the NOT intrinsic

Peter Steinfeld via flang-commits flang-commits at lists.llvm.org
Sun Jun 20 07:28:16 PDT 2021


Author: Peter Steinfeld
Date: 2021-06-20T07:25:05-07:00
New Revision: e7f78fb9171768a514611304caf42eb034ec9247

URL: https://github.com/llvm/llvm-project/commit/e7f78fb9171768a514611304caf42eb034ec9247
DIFF: https://github.com/llvm/llvm-project/commit/e7f78fb9171768a514611304caf42eb034ec9247.diff

LOG: [flang] Implement constant folding for the NOT intrinsic

I implemented constant folding for the NOT intrinsic and added some tests.

Differential Revision: https://reviews.llvm.org/D104587

Added: 
    

Modified: 
    flang/lib/Evaluate/fold-integer.cpp
    flang/test/Evaluate/folding01.f90

Removed: 
    


################################################################################
diff  --git a/flang/lib/Evaluate/fold-integer.cpp b/flang/lib/Evaluate/fold-integer.cpp
index 19b9f9293e519..01f30b085a56b 100644
--- a/flang/lib/Evaluate/fold-integer.cpp
+++ b/flang/lib/Evaluate/fold-integer.cpp
@@ -523,6 +523,9 @@ Expr<Type<TypeCategory::Integer, KIND>> FoldIntrinsicFunction(
               }
               return result.value;
             }));
+  } else if (name == "not") {
+    return FoldElementalIntrinsic<T, T>(
+        context, std::move(funcRef), &Scalar<T>::NOT);
   } else if (name == "precision") {
     if (const auto *cx{UnwrapExpr<Expr<SomeReal>>(args[0])}) {
       return Expr<T>{std::visit(
@@ -657,7 +660,7 @@ Expr<Type<TypeCategory::Integer, KIND>> FoldIntrinsicFunction(
   // TODO:
   // cshift, dot_product, eoshift,
   // findloc, iall, iany, iparity, ibits, image_status, ishftc,
-  // matmul, maxloc, minloc, not, pack, product, reduce,
+  // matmul, maxloc, minloc, pack, product, reduce,
   // sign, spread, sum, transfer, transpose, unpack
   return Expr<T>{std::move(funcRef)};
 }

diff  --git a/flang/test/Evaluate/folding01.f90 b/flang/test/Evaluate/folding01.f90
index 29708ce1195f1..fddc034165e12 100644
--- a/flang/test/Evaluate/folding01.f90
+++ b/flang/test/Evaluate/folding01.f90
@@ -135,4 +135,8 @@ module m
   logical, parameter :: test_max_a1 = all(max(x1a, x2a).EQ.[11, 12, 13, 14])
   logical, parameter :: test_min_a1 = all(min(x1a, x2a).EQ.[1, 2, 3, 4])
 
+  logical, parameter :: test_not_zero = not(0).EQ.-1
+  logical, parameter :: test_not_neg_one = not(-1).EQ.0
+  logical, parameter :: test_not_array = all(not([5, 6, 7]).EQ.[-6, -7, -8])
+ 
 end module


        


More information about the flang-commits mailing list