From 84bee8e24737e6bd782bdfcfe6de336208b29b9a Mon Sep 17 00:00:00 2001 From: Diego Caballero Date: Sat, 7 Jun 2025 13:58:50 +0000 Subject: [PATCH 1/2] [mlir][Flang][NFC] Replace use of `vector.insertelement/extractelement` This PR is part of the last step to remove `vector.extractelement` and `vector.insertelement` ops (RFC: https://discourse.llvm.org/t/rfc-psa-remove-vector-extractelement-and-vector-insertelement-ops-in-favor-of-vector-extract-and-vector-insert-ops) It replaces `vector.insertelement` and `vector.extractelement` with `vector.insert` and `vector.extract` in Flang. It looks like no lit tests are impacted. --- flang/lib/Optimizer/Builder/PPCIntrinsicCall.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flang/lib/Optimizer/Builder/PPCIntrinsicCall.cpp b/flang/lib/Optimizer/Builder/PPCIntrinsicCall.cpp index 0094ce892d61b..d6beb49863052 100644 --- a/flang/lib/Optimizer/Builder/PPCIntrinsicCall.cpp +++ b/flang/lib/Optimizer/Builder/PPCIntrinsicCall.cpp @@ -1685,7 +1685,7 @@ PPCIntrinsicLibrary::genVecExtract(mlir::Type resultType, if (!isNativeVecElemOrderOnLE()) uremOp = convertVectorElementOrder(builder, loc, vecTyInfo, uremOp); - return builder.create(loc, varg0, uremOp); + return builder.create(loc, varg0, uremOp); } // VEC_INSERT @@ -1706,8 +1706,8 @@ PPCIntrinsicLibrary::genVecInsert(mlir::Type resultType, if (!isNativeVecElemOrderOnLE()) uremOp = convertVectorElementOrder(builder, loc, vecTyInfo, uremOp); - auto res{builder.create(loc, argBases[0], - varg1, uremOp)}; + auto res{ + builder.create(loc, argBases[0], varg1, uremOp)}; return builder.create(loc, vecTyInfo.toFirVectorType(), res); } From 76c78eb256d11162498816f7a2e3133464751ec4 Mon Sep 17 00:00:00 2001 From: Diego Caballero Date: Mon, 7 Jul 2025 18:12:52 +0000 Subject: [PATCH 2/2] Fix tests --- flang/include/flang/Optimizer/Support/InitFIR.h | 4 +++- flang/lib/Optimizer/Builder/PPCIntrinsicCall.cpp | 11 ++++++++--- flang/lib/Optimizer/CodeGen/CMakeLists.txt | 1 + flang/lib/Optimizer/CodeGen/CodeGen.cpp | 2 ++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/flang/include/flang/Optimizer/Support/InitFIR.h b/flang/include/flang/Optimizer/Support/InitFIR.h index fa08f41f84adf..2b73a71e126c9 100644 --- a/flang/include/flang/Optimizer/Support/InitFIR.h +++ b/flang/include/flang/Optimizer/Support/InitFIR.h @@ -23,6 +23,7 @@ #include "mlir/Dialect/Affine/Passes.h" #include "mlir/Dialect/Complex/IR/Complex.h" #include "mlir/Dialect/Func/Extensions/InlinerExtension.h" +#include "mlir/Dialect/Index/IR/IndexDialect.h" #include "mlir/Dialect/LLVMIR/NVVMDialect.h" #include "mlir/Dialect/OpenACC/Transforms/Passes.h" #include "mlir/Dialect/SCF/Transforms/Passes.h" @@ -41,7 +42,8 @@ namespace fir::support { mlir::cf::ControlFlowDialect, mlir::func::FuncDialect, \ mlir::vector::VectorDialect, mlir::math::MathDialect, \ mlir::complex::ComplexDialect, mlir::DLTIDialect, cuf::CUFDialect, \ - mlir::NVVM::NVVMDialect, mlir::gpu::GPUDialect + mlir::NVVM::NVVMDialect, mlir::gpu::GPUDialect, \ + mlir::index::IndexDialect #define FLANG_CODEGEN_DIALECT_LIST FIRCodeGenDialect, mlir::LLVM::LLVMDialect diff --git a/flang/lib/Optimizer/Builder/PPCIntrinsicCall.cpp b/flang/lib/Optimizer/Builder/PPCIntrinsicCall.cpp index d6beb49863052..db12c84496b10 100644 --- a/flang/lib/Optimizer/Builder/PPCIntrinsicCall.cpp +++ b/flang/lib/Optimizer/Builder/PPCIntrinsicCall.cpp @@ -17,6 +17,7 @@ #include "flang/Evaluate/common.h" #include "flang/Optimizer/Builder/FIRBuilder.h" #include "flang/Optimizer/Builder/MutableBox.h" +#include "mlir/Dialect/Index/IR/IndexOps.h" #include "mlir/Dialect/Vector/IR/VectorOps.h" namespace fir { @@ -1685,7 +1686,9 @@ PPCIntrinsicLibrary::genVecExtract(mlir::Type resultType, if (!isNativeVecElemOrderOnLE()) uremOp = convertVectorElementOrder(builder, loc, vecTyInfo, uremOp); - return builder.create(loc, varg0, uremOp); + mlir::Value index = builder.createOrFold( + loc, builder.getIndexType(), uremOp); + return builder.create(loc, varg0, index); } // VEC_INSERT @@ -1706,8 +1709,10 @@ PPCIntrinsicLibrary::genVecInsert(mlir::Type resultType, if (!isNativeVecElemOrderOnLE()) uremOp = convertVectorElementOrder(builder, loc, vecTyInfo, uremOp); - auto res{ - builder.create(loc, argBases[0], varg1, uremOp)}; + mlir::Value index = builder.createOrFold( + loc, builder.getIndexType(), uremOp); + mlir::Value res = + builder.create(loc, argBases[0], varg1, index); return builder.create(loc, vecTyInfo.toFirVectorType(), res); } diff --git a/flang/lib/Optimizer/CodeGen/CMakeLists.txt b/flang/lib/Optimizer/CodeGen/CMakeLists.txt index 980307db315d9..8b8cfa57aba69 100644 --- a/flang/lib/Optimizer/CodeGen/CMakeLists.txt +++ b/flang/lib/Optimizer/CodeGen/CMakeLists.txt @@ -36,6 +36,7 @@ add_flang_library(FIRCodeGen MLIRComplexToLLVM MLIRComplexToStandard MLIRGPUDialect + MLIRIndexToLLVM MLIRMathToFuncs MLIRMathToLLVM MLIRMathToLibm diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp index 09038f6e4d3ae..a0c1e9e7dcdca 100644 --- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp +++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp @@ -36,6 +36,7 @@ #include "mlir/Conversion/ComplexToStandard/ComplexToStandard.h" #include "mlir/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.h" #include "mlir/Conversion/FuncToLLVM/ConvertFuncToLLVM.h" +#include "mlir/Conversion/IndexToLLVM/IndexToLLVM.h" #include "mlir/Conversion/LLVMCommon/Pattern.h" #include "mlir/Conversion/MathToFuncs/MathToFuncs.h" #include "mlir/Conversion/MathToLLVM/MathToLLVM.h" @@ -4198,6 +4199,7 @@ class FIRToLLVMLowering if (!isAMDGCN) mlir::populateMathToLibmConversionPatterns(pattern); mlir::populateComplexToLLVMConversionPatterns(typeConverter, pattern); + mlir::index::populateIndexToLLVMConversionPatterns(typeConverter, pattern); mlir::populateVectorToLLVMConversionPatterns(typeConverter, pattern); // Flang specific overloads for OpenMP operations, to allow for special