[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