[flang-commits] [PATCH] D157329: [flang] Fix crash in location reduction folding with DIM= and scalar MASK=

Peter Klausler via Phabricator via flang-commits flang-commits at lists.llvm.org
Mon Aug 7 14:13:42 PDT 2023


klausler created this revision.
klausler added a reviewer: vdonaldson.
klausler added a project: Flang.
Herald added a subscriber: jdoerfert.
Herald added a project: All.
klausler requested review of this revision.

The shape of an expanded scalar MASK= was incorrect in the template
code that folds FINDLOC/MAXLOC/MINLOC, leading to a vector indexing
crash when a DIM= argument is also present.

Fixes https://github.com/llvm/llvm-project/issues/64286.


https://reviews.llvm.org/D157329

Files:
  flang/lib/Evaluate/fold-integer.cpp
  flang/test/Evaluate/fold-findloc.f90


Index: flang/test/Evaluate/fold-findloc.f90
===================================================================
--- flang/test/Evaluate/fold-findloc.f90
+++ flang/test/Evaluate/fold-findloc.f90
@@ -74,6 +74,8 @@
   logical, parameter:: test_xia1_mtd = all(maxloc(ia1, mask=.true., dim=1) == [3])
   logical, parameter:: test_fia1_mt  = all(findloc(ia1, 1, mask=.true.) == 1)
   logical, parameter:: test_fia1_mtd = all(findloc(ia1, 1, mask=.true., dim=1) == [1])
+  logical, parameter:: test_fia2_mtd1 = all(findloc(ia2, 1, dim=1, mask=.true.) == [1, 0, 2])
+  logical, parameter:: test_fia2_mtd2 = all(findloc(ia2, 1, dim=2, mask=.true.) == [1, 3])
 
   logical, parameter:: test_mia1_mf  = all(minloc(ia1, mask=.false.) == 0)
   logical, parameter:: test_mia1_mfd = all(minloc(ia1, mask=.false., dim=1) == [0])
@@ -81,4 +83,6 @@
   logical, parameter:: test_xia1_mfd = all(maxloc(ia1, mask=.false., dim=1) == [0])
   logical, parameter:: test_fia1_mf  = all(findloc(ia1, 1, mask=.false.) == 0)
   logical, parameter:: test_fia1_mfd = all(findloc(ia1, 1, mask=.false., dim=1) == [0])
+  logical, parameter:: test_fia2_mfd1 = all(findloc(ia2, 1, dim=1, mask=.false.) == [0, 0, 0])
+  logical, parameter:: test_fia2_mfd2 = all(findloc(ia2, 1, dim=2, mask=.false.) == [0, 0])
 end module
Index: flang/lib/Evaluate/fold-integer.cpp
===================================================================
--- flang/lib/Evaluate/fold-integer.cpp
+++ flang/lib/Evaluate/fold-integer.cpp
@@ -352,12 +352,12 @@
     if (mask) {
       if (auto scalarMask{mask->GetScalarValue()}) {
         // Convert into array in case of scalar MASK= (for
-        // MAXLOC/MINLOC/FINDLOC mask should be be conformable)
+        // MAXLOC/MINLOC/FINDLOC mask should be conformable)
         ConstantSubscript n{GetSize(array->shape())};
         std::vector<Scalar<LogicalResult>> mask_elements(
             n, Scalar<LogicalResult>{scalarMask.value()});
         *mask = Constant<LogicalResult>{
-            std::move(mask_elements), ConstantSubscripts{n}};
+            std::move(mask_elements), ConstantSubscripts{array->shape()}};
       }
       mask->SetLowerBoundsToOne();
       maskAt = mask->lbounds();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D157329.547944.patch
Type: text/x-patch
Size: 2190 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20230807/f0037a28/attachment-0001.bin>


More information about the flang-commits mailing list