llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-flang-driver @llvm/pr-subscribers-flang-fir-hlfir Author: Sergio Afonso (skatrak) <details> <summary>Changes</summary> This patch forwards the target CPU and features information from the Flang frontend to MLIR func.func operation attributes, which are later used to populate the target_cpu and target_features llvm.func attributes. This completes a full flow by which target CPU and features make it all the way from compiler options to LLVM IR function attributes. --- Full diff: https://github.com/llvm/llvm-project/pull/78289.diff 7 Files Affected: - (modified) flang/include/flang/Lower/Bridge.h (+7-7) - (modified) flang/lib/Frontend/FrontendActions.cpp (+1-3) - (modified) flang/lib/Lower/Bridge.cpp (+17-4) - (modified) flang/test/Driver/save-mlir-temps.f90 (+3-3) - (added) flang/test/Lower/target-features-amdgcn.f90 (+23) - (added) flang/test/Lower/target-features-x86_64.f90 (+21) - (modified) flang/tools/bbc/bbc.cpp (+1-2) ``````````diff diff --git a/flang/include/flang/Lower/Bridge.h b/flang/include/flang/Lower/Bridge.h index 6c0d14d65edae1..4864a08d9977b8 100644 --- a/flang/include/flang/Lower/Bridge.h +++ b/flang/include/flang/Lower/Bridge.h @@ -21,10 +21,7 @@ #include "flang/Optimizer/Builder/FIRBuilder.h" #include "flang/Optimizer/Dialect/Support/KindMapping.h" #include "mlir/IR/BuiltinOps.h" - -namespace llvm { -class DataLayout; -} // namespace llvm +#include "llvm/Target/TargetMachine.h" namespace Fortran { namespace common { @@ -64,11 +61,11 @@ class LoweringBridge { const Fortran::lower::LoweringOptions &loweringOptions, const std::vector<Fortran::lower::EnvironmentDefault> &envDefaults, const Fortran::common::LanguageFeatureControl &languageFeatures, - const llvm::DataLayout *dataLayout = nullptr) { + const llvm::TargetMachine &targetMachine) { return LoweringBridge(ctx, semanticsContext, defaultKinds, intrinsics, targetCharacteristics, allCooked, triple, kindMap, loweringOptions, envDefaults, languageFeatures, - dataLayout); + targetMachine); } //===--------------------------------------------------------------------===// @@ -110,6 +107,8 @@ class LoweringBridge { return languageFeatures; } + const llvm::TargetMachine &getTargetMachine() const { return targetMachine; } + /// Create a folding context. Careful: this is very expensive. Fortran::evaluate::FoldingContext createFoldingContext() const; @@ -147,7 +146,7 @@ class LoweringBridge { const Fortran::lower::LoweringOptions &loweringOptions, const std::vector<Fortran::lower::EnvironmentDefault> &envDefaults, const Fortran::common::LanguageFeatureControl &languageFeatures, - const llvm::DataLayout *dataLayout); + const llvm::TargetMachine &targetMachine); LoweringBridge() = delete; LoweringBridge(const LoweringBridge &) = delete; @@ -164,6 +163,7 @@ class LoweringBridge { const Fortran::lower::LoweringOptions &loweringOptions; const std::vector<Fortran::lower::EnvironmentDefault> &envDefaults; const Fortran::common::LanguageFeatureControl &languageFeatures; + const llvm::TargetMachine &targetMachine; }; } // namespace lower diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index 74e3992d5ab62b..397e403847588e 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -285,8 +285,6 @@ bool CodeGenAction::beginSourceFileAction() { ci.getSemanticsContext().defaultKinds(); fir::KindMapping kindMap(mlirCtx.get(), llvm::ArrayRef<fir::KindTy>{ fir::fromDefaultKinds(defKinds)}); - const llvm::DataLayout &dl = targetMachine.createDataLayout(); - lower::LoweringBridge lb = Fortran::lower::LoweringBridge::create( *mlirCtx, ci.getSemanticsContext(), defKinds, ci.getSemanticsContext().intrinsics(), @@ -294,7 +292,7 @@ bool CodeGenAction::beginSourceFileAction() { ci.getParsing().allCooked(), ci.getInvocation().getTargetOpts().triple, kindMap, ci.getInvocation().getLoweringOpts(), ci.getInvocation().getFrontendOpts().envDefaults, - ci.getInvocation().getFrontendOpts().features, &dl); + ci.getInvocation().getFrontendOpts().features, targetMachine); // Fetch module from lb, so we can set mlirModule = std::make_unique<mlir::ModuleOp>(lb.getModule()); diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index 8006b9b426f4dc..27e6e46c52d825 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -54,6 +54,7 @@ #include "flang/Semantics/symbol.h" #include "flang/Semantics/tools.h" #include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h" +#include "mlir/Dialect/LLVMIR/LLVMAttrs.h" #include "mlir/IR/PatternMatch.h" #include "mlir/Parser/Parser.h" #include "mlir/Transforms/RegionUtils.h" @@ -4290,6 +4291,18 @@ class FirConverter : public Fortran::lower::AbstractConverter { assert(blockId == 0 && "invalid blockId"); assert(activeConstructStack.empty() && "invalid construct stack state"); + // Set target_cpu and target_features attributes to be passed through to the + // llvm.func operation during lowering. + const llvm::TargetMachine &targetMachine = bridge.getTargetMachine(); + if (auto targetCPU = targetMachine.getTargetCPU(); !targetCPU.empty()) + func->setAttr("target_cpu", + mlir::StringAttr::get(func.getContext(), targetCPU)); + + if (auto targetFeatures = targetMachine.getTargetFeatureString(); + !targetFeatures.empty()) + func->setAttr("target_features", mlir::LLVM::TargetFeaturesAttr::get( + func.getContext(), targetFeatures)); + // Manage floating point exception, halting mode, and rounding mode // settings at function entry and exit. if (!funit.isMainProgram()) @@ -5062,12 +5075,12 @@ Fortran::lower::LoweringBridge::LoweringBridge( const Fortran::lower::LoweringOptions &loweringOptions, const std::vector<Fortran::lower::EnvironmentDefault> &envDefaults, const Fortran::common::LanguageFeatureControl &languageFeatures, - const llvm::DataLayout *dataLayout) + const llvm::TargetMachine &targetMachine) : semanticsContext{semanticsContext}, defaultKinds{defaultKinds}, intrinsics{intrinsics}, targetCharacteristics{targetCharacteristics}, cooked{&cooked}, context{context}, kindMap{kindMap}, loweringOptions{loweringOptions}, envDefaults{envDefaults}, - languageFeatures{languageFeatures} { + languageFeatures{languageFeatures}, targetMachine{targetMachine} { // Register the diagnostic handler. context.getDiagEngine().registerHandler([](mlir::Diagnostic &diag) { llvm::raw_ostream &os = llvm::errs(); @@ -5118,6 +5131,6 @@ Fortran::lower::LoweringBridge::LoweringBridge( assert(module.get() && "module was not created"); fir::setTargetTriple(*module.get(), triple); fir::setKindMapping(*module.get(), kindMap); - if (dataLayout) - fir::support::setMLIRDataLayout(*module.get(), *dataLayout); + fir::support::setMLIRDataLayout(*module.get(), + targetMachine.createDataLayout()); } diff --git a/flang/test/Driver/save-mlir-temps.f90 b/flang/test/Driver/save-mlir-temps.f90 index 1c8935fbd7aac9..e9478a6c521b2e 100644 --- a/flang/test/Driver/save-mlir-temps.f90 +++ b/flang/test/Driver/save-mlir-temps.f90 @@ -51,9 +51,9 @@ ! Content to check from the MLIR outputs !-------------------------- ! MLIR-FIR-NOT: llvm.func -! MLIR-FIR: func.func @{{.*}}main(){{.*}}{ +! MLIR-FIR: func.func @{{.*}}main(){{.*}} -! MLIR-FIR-NOT: func.func -! MLIR-LLVMIR: llvm.func @{{.*}}main(){{.*}}{ +! MLIR-LLVMIR-NOT: func.func +! MLIR-LLVMIR: llvm.func @{{.*}}main(){{.*}} end program diff --git a/flang/test/Lower/target-features-amdgcn.f90 b/flang/test/Lower/target-features-amdgcn.f90 new file mode 100644 index 00000000000000..8bd6773a43d4e3 --- /dev/null +++ b/flang/test/Lower/target-features-amdgcn.f90 @@ -0,0 +1,23 @@ +! REQUIRES: amdgpu-registered-target +! RUN: %flang_fc1 -emit-fir %s -o - | FileCheck %s --check-prefixes=ALL,NONE +! RUN: %flang_fc1 -emit-fir -triple amdgcn-amd-amdhsa %s -o - | FileCheck %s --check-prefixes=ALL,TRIPLE +! RUN: %flang_fc1 -emit-fir -target-cpu gfx90a %s -o - | FileCheck %s --check-prefixes=ALL,CPU +! RUN: %flang_fc1 -emit-fir -triple amdgcn-amd-amdhsa -target-cpu gfx90a %s -o - | FileCheck %s --check-prefixes=ALL,BOTH + +! ALL-LABEL: func.func @_QPfoo() + +! NONE-NOT: target_cpu +! NONE-NOT: target_features + +! TRIPLE-SAME: target_cpu = "generic-hsa" +! TRIPLE-NOT: target_features + +! CPU-SAME: target_cpu = "gfx90a" +! CPU-NOT: target_features + +! BOTH-SAME: target_cpu = "gfx90a" +! BOTH-SAME: target_features = #llvm.target_features<[ +! BOTH-SAME: "+gfx90a-insts" +! BOTH-SAME: ]> +subroutine foo +end subroutine diff --git a/flang/test/Lower/target-features-x86_64.f90 b/flang/test/Lower/target-features-x86_64.f90 new file mode 100644 index 00000000000000..c4190e83f6a6c7 --- /dev/null +++ b/flang/test/Lower/target-features-x86_64.f90 @@ -0,0 +1,21 @@ +! REQUIRES: x86-registered-target +! RUN: %flang_fc1 -emit-fir -triple x86_64-unknown-linux-gnu %s -o - | FileCheck %s --check-prefixes=ALL,NONE +! RUN: %flang_fc1 -emit-fir -triple x86_64-unknown-linux-gnu -target-cpu x86-64 %s -o - | FileCheck %s --check-prefixes=ALL,CPU +! RUN: %flang_fc1 -emit-fir -triple x86_64-unknown-linux-gnu -target-feature +sse %s -o - | FileCheck %s --check-prefixes=ALL,FEATURE +! RUN: %flang_fc1 -emit-fir -triple x86_64-unknown-linux-gnu -target-cpu x86-64 -target-feature +sse %s -o - | FileCheck %s --check-prefixes=ALL,BOTH + +! ALL-LABEL: func.func @_QPfoo() + +! NONE-NOT: target_cpu +! NONE-NOT: target_features + +! CPU-SAME: target_cpu = "x86-64" +! CPU-NOT: target_features + +! FEATURE-NOT: target_cpu +! FEATURE-SAME: target_features = #llvm.target_features<["+sse"]> + +! BOTH-SAME: target_cpu = "x86-64" +! BOTH-SAME: target_features = #llvm.target_features<["+sse"]> +subroutine foo +end subroutine diff --git a/flang/tools/bbc/bbc.cpp b/flang/tools/bbc/bbc.cpp index b4ba837a3263f8..98d9258e023e55 100644 --- a/flang/tools/bbc/bbc.cpp +++ b/flang/tools/bbc/bbc.cpp @@ -331,7 +331,6 @@ static mlir::LogicalResult convertFortranSourceToMLIR( auto &defKinds = semanticsContext.defaultKinds(); fir::KindMapping kindMap( &ctx, llvm::ArrayRef<fir::KindTy>{fir::fromDefaultKinds(defKinds)}); - const llvm::DataLayout &dataLayout = targetMachine.createDataLayout(); std::string targetTriple = targetMachine.getTargetTriple().normalize(); // Use default lowering options for bbc. Fortran::lower::LoweringOptions loweringOptions{}; @@ -342,7 +341,7 @@ static mlir::LogicalResult convertFortranSourceToMLIR( ctx, semanticsContext, defKinds, semanticsContext.intrinsics(), semanticsContext.targetCharacteristics(), parsing.allCooked(), targetTriple, kindMap, loweringOptions, {}, - semanticsContext.languageFeatures(), &dataLayout); + semanticsContext.languageFeatures(), targetMachine); burnside.lower(parseTree, semanticsContext); mlir::ModuleOp mlirModule = burnside.getModule(); if (enableOpenMP) { `````````` </details> https://github.com/llvm/llvm-project/pull/78289 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits