[flang-commits] [flang] b5e94d5 - [flang][MIF] Fix lowering sub argument in IMAGE_INDEX #208318 (#208544)

via flang-commits flang-commits at lists.llvm.org
Mon Jul 13 02:15:34 PDT 2026


Author: Jean-Didier PAILLEUX
Date: 2026-07-13T11:15:30+02:00
New Revision: b5e94d5ffca8fe3d7b063af48d9535d7b13af66a

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

LOG: [flang][MIF] Fix lowering sub argument in IMAGE_INDEX #208318 (#208544)

This PR fixes issue #208318, which did not correctly prepare the SUB
argument for IMAGE_INDEX in the correct type.

Added: 
    

Modified: 
    flang/include/flang/Optimizer/Builder/MIFCommon.h
    flang/lib/Optimizer/Builder/IntrinsicCall.cpp
    flang/lib/Optimizer/Builder/MIFCommon.cpp
    flang/lib/Optimizer/Dialect/MIF/MIFOps.cpp
    flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
    flang/test/Lower/MIF/image_index.f90

Removed: 
    


################################################################################
diff  --git a/flang/include/flang/Optimizer/Builder/MIFCommon.h b/flang/include/flang/Optimizer/Builder/MIFCommon.h
index e93c45e18f04c..91b8a037e2801 100644
--- a/flang/include/flang/Optimizer/Builder/MIFCommon.h
+++ b/flang/include/flang/Optimizer/Builder/MIFCommon.h
@@ -9,6 +9,7 @@
 #ifndef FORTRAN_OPTIMIZER_TRANSFORMS_MIFCOMMON_H_
 #define FORTRAN_OPTIMIZER_TRANSFORMS_MIFCOMMON_H_
 
+#include "flang/Optimizer/Builder/FIRBuilder.h"
 #include "flang/Optimizer/Dialect/MIF/MIFOps.h"
 
 static constexpr llvm::StringRef coarrayHandleSuffix = "_coarray_handle";
@@ -17,6 +18,10 @@ namespace mif {
 
 std::string getFullUniqName(mlir::Value addr);
 
+mlir::Value genImageIndex(fir::FirOpBuilder &, mlir::Location loc,
+                          mlir::Value coarray, mlir::Value sub,
+                          mlir::Value team);
+
 } // namespace mif
 
 #endif // FORTRAN_OPTIMIZER_TRANSFORMS_MIFCOMMON_H_

diff  --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
index 2fe81d63f8e49..9ec64844cf6d6 100644
--- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
+++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
@@ -21,6 +21,7 @@
 #include "flang/Optimizer/Builder/Character.h"
 #include "flang/Optimizer/Builder/Complex.h"
 #include "flang/Optimizer/Builder/FIRBuilder.h"
+#include "flang/Optimizer/Builder/MIFCommon.h"
 #include "flang/Optimizer/Builder/MutableBox.h"
 #include "flang/Optimizer/Builder/OpenACCIntrinsicCall.h"
 #include "flang/Optimizer/Builder/PPCIntrinsicCall.h"
@@ -6332,9 +6333,8 @@ IntrinsicLibrary::genImageIndex(mlir::Type resultType,
     if (fir::isa_integer(fir::unwrapRefType(team.getType())))
       team = fir::LoadOp::create(builder, loc, team);
   }
-  return mif::ImageIndexOp::create(builder, loc,
-                                   /*coarray*/ fir::getBase(args[0]),
-                                   /*sub*/ fir::getBase(args[1]), team);
+  return mif::genImageIndex(builder, loc, fir::getBase(args[0]),
+                            fir::getBase(args[1]), team);
 }
 
 // INDEX

diff  --git a/flang/lib/Optimizer/Builder/MIFCommon.cpp b/flang/lib/Optimizer/Builder/MIFCommon.cpp
index 21667122d0a90..8f08ce4573bbf 100644
--- a/flang/lib/Optimizer/Builder/MIFCommon.cpp
+++ b/flang/lib/Optimizer/Builder/MIFCommon.cpp
@@ -7,6 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "flang/Optimizer/Builder/MIFCommon.h"
+#include "flang/Optimizer/Builder/FIRBuilder.h"
+#include "flang/Optimizer/Builder/HLFIRTools.h"
+#include "flang/Optimizer/Dialect/MIF/MIFOps.h"
 #include "flang/Optimizer/HLFIR/HLFIROps.h"
 #include "llvm/ADT/TypeSwitch.h"
 
@@ -57,3 +60,23 @@ std::string mif::getFullUniqName(mlir::Value addr) {
   }
   return "";
 }
+
+mlir::Value mif::genImageIndex(fir::FirOpBuilder &builder, mlir::Location loc,
+                               mlir::Value coarray, mlir::Value sub,
+                               mlir::Value team) {
+  mlir::Type newSubType =
+      fir::changeElementType(sub.getType(), builder.getI64Type(), false);
+  if (newSubType == sub.getType())
+    return mif::ImageIndexOp::create(builder, loc, coarray, sub, team);
+  auto subCastAndCleanup = hlfir::genTypeAndKindConvert(
+      loc, builder, hlfir::Entity{sub}, newSubType, true);
+  auto [exv, cleanup] =
+      hlfir::convertToBox(loc, builder, subCastAndCleanup.first, newSubType);
+  auto imageIndex =
+      mif::ImageIndexOp::create(builder, loc, coarray, fir::getBase(exv), team);
+  if (cleanup)
+    (*cleanup)();
+  if (subCastAndCleanup.second)
+    (*subCastAndCleanup.second)();
+  return imageIndex;
+}

diff  --git a/flang/lib/Optimizer/Dialect/MIF/MIFOps.cpp b/flang/lib/Optimizer/Dialect/MIF/MIFOps.cpp
index 7d75fee47a224..2bafc33450392 100644
--- a/flang/lib/Optimizer/Dialect/MIF/MIFOps.cpp
+++ b/flang/lib/Optimizer/Dialect/MIF/MIFOps.cpp
@@ -345,6 +345,9 @@ void mif::ImageIndexOp::build(mlir::OpBuilder &builder,
 llvm::LogicalResult mif::ImageIndexOp::verify() {
   if (getCoarray())
     return checkCorank(*this);
+  mlir::Type subTy = getSub().getType();
+  if (!fir::getFortranElementType(subTy).isInteger(64))
+    return emitOpError("sub should be a boxed array of I64 elements.");
   return mlir::success();
 }
 

diff  --git a/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp b/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
index 1ceac427818df..77dfb5ac957ea 100644
--- a/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
+++ b/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
@@ -9,6 +9,7 @@
 #include "flang/Optimizer/Transforms/MIFOpConversion.h"
 #include "flang/Optimizer/Builder/BoxValue.h"
 #include "flang/Optimizer/Builder/Character.h"
+#include "flang/Optimizer/Builder/HLFIRTools.h"
 #include "flang/Optimizer/Builder/MIFCommon.h"
 #include "flang/Optimizer/Builder/MutableBox.h"
 #include "flang/Optimizer/Builder/Runtime/Inquiry.h"

diff  --git a/flang/test/Lower/MIF/image_index.f90 b/flang/test/Lower/MIF/image_index.f90
index a3dff822a0636..4da1452fcfa1c 100644
--- a/flang/test/Lower/MIF/image_index.f90
+++ b/flang/test/Lower/MIF/image_index.f90
@@ -8,17 +8,17 @@ program test
   type(team_type) :: team
   integer :: team_number
 
-  ! CHECK: mif.image_index coarray %[[COARRAY:.*]] sub %[[SUB:.*]] : (!fir.box<i32, corank:3>, !fir.box<!fir.array<3xi32>>) -> i32
+  ! CHECK: mif.image_index coarray %[[COARRAY:.*]] sub %[[SUB:.*]] : (!fir.box<i32, corank:3>, !fir.box<!fir.array<3xi64>>) -> i32
   idx = image_index(a, SUB=sub)
 
   ! CHECK: mif.image_index coarray %[[COARRAY:.*]] sub %[[SUB2:.*]] : (!fir.box<i32, corank:3>, !fir.box<!fir.array<3xi64>>) -> i32
   idx = image_index(a, SUB=sub2)
 
   ! CHECK: mif.image_index coarray %[[COARRAY:.*]] sub %[[SUB:.*]] team %[[TEAM:.*]]#0 : (!fir.box<i32, corank:3>,
-  ! !fir.box<!fir.array<3xi32>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{{.*}}>>) -> i32
+  ! !fir.box<!fir.array<3xi64>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{{.*}}>>) -> i32
   idx = image_index(a, SUB=sub, TEAM=team)
 
-  ! CHECK: mif.image_index coarray %[[COARRAY:.*]] sub %[[SUB:.*]] team_number %[[TEAM_NUMBER:.*]]: (!fir.box<i32, corank:3>, !fir.box<!fir.array<3xi32>>, i32) -> i32
+  ! CHECK: mif.image_index coarray %[[COARRAY:.*]] sub %[[SUB:.*]] team_number %[[TEAM_NUMBER:.*]]: (!fir.box<i32, corank:3>, !fir.box<!fir.array<3xi64>>, i32) -> i32
   idx = image_index(a, SUB=sub, TEAM_NUMBER=team_number)
 
 end program


        


More information about the flang-commits mailing list