[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
tblah wrote: > If you are in a rush to land this then this LGTM, but I would like the > relationship between `-O{1|2|3|4}` and `-f{no}-alias-analysis` to be refined > in a follow-up patch. Unless there's a good reason to avoid that? WDYT? Thanks @banach-space, I will land this now and follow up later today. The behavior you're commenting on was deliberate because to me, it feels wrong to enable alias analysis if there is an `-fno-alias-analysis` flag anywhere (and no `-falias-analysis`) as it it may not be obvious that -O implies `-falias-analysis`, and what `-O` does isn't documented anywhere. But I don't feel strongly about it so I will follow up with a new patch later if you still feel that is worthwhile. https://github.com/llvm/llvm-project/pull/73111 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
https://github.com/banach-space commented: I think that what's being proposed here is quite non-standard. In particular, what should happen here: ```bash flang-new {A very long list of options copied from somewhere, including -fno-alias-analysis) -O3 file.f90 ``` How is the user meant to know that they need to add `-falias-analysis` at the end to enable alias analysis? And in general, how are they supposed to know that `-fno-alias-analysis` overrides `-O3`? If it was the case of "the last relevant option takes priority" (as is the case with most/all options) then that would be easy - identical logic would always apply. This should be easy to fix if you use this instead of what's currently implemented (apologies for GitHub being unable to format this properly): ```cpp Args.getLastArg(options::OPT_falias_analysis, options::OPT_fno_alias_analysis, options::OPT_Ofast, options::OPT_O, options::OPT_O4); ``` (I'm skipping other changes that would also be required - hopefully this is clear enough). This should still give you all the flexibility that you need for testing and be less surprising for end users. If you are in a rush to land this then this LGTM, but I would like the relationship between `-O{1|2|3|4}` and `-f{no}-alias-analysis` to be refined in a follow-up patch. Unless there's a good reason to avoid that? WDYT? Sorry, I've only really realised this after @tblah updated [falias-analysis.f90](https://github.com/llvm/llvm-project/pull/73111/files#diff-9e3d54cea408f6f309c22f64040afb821ceba52f3b73e2001b3a4b72114f2a10). https://github.com/llvm/llvm-project/pull/73111 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
https://github.com/kiranchandramohan edited https://github.com/llvm/llvm-project/pull/73111 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
https://github.com/tblah updated https://github.com/llvm/llvm-project/pull/73111 >From 617d6d23b2f861cd6dceb82f54a2685059b6 Mon Sep 17 00:00:00 2001 From: Tom Eccles Date: Thu, 14 Sep 2023 09:09:29 + Subject: [PATCH 1/8] [flang] Enable alias tags pass by default Enable by default when optimizing for speed. For simplicity, only forward the flag to the frontend driver when it contradicts what is implied by the optimization level. --- clang/lib/Driver/ToolChains/Flang.cpp | 20 flang/include/flang/Tools/CLOptions.inc | 8 flang/lib/Frontend/CompilerInvocation.cpp | 22 ++ flang/test/Driver/falias-analysis.f90 | 4 flang/test/Driver/mlir-pass-pipeline.f90 | 2 ++ flang/test/Driver/optimization-remark.f90 | 22 +- flang/test/Fir/basic-program.fir | 4 flang/tools/tco/tco.cpp | 1 + 8 files changed, 62 insertions(+), 21 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 8bdd920c3dcbb79..9382433b94dadfd 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -142,6 +142,26 @@ void Flang::addCodegenOptions(const ArgList , if (shouldLoopVersion(Args)) CmdArgs.push_back("-fversion-loops-for-stride"); + Arg *aliasAnalysis = Args.getLastArg(options::OPT_falias_analysis, + options::OPT_fno_alias_analysis); + Arg *optLevel = + Args.getLastArg(options::OPT_Ofast, options::OPT_O, options::OPT_O4); + if (aliasAnalysis) { +bool falias_analysis = +aliasAnalysis->getOption().matches(options::OPT_falias_analysis); +// only pass on the argument if it does not match that implied by the +// optimization level +if (optLevel) { + if (!falias_analysis) { +CmdArgs.push_back("-fno-alias-analysis"); + } +} else { + if (falias_analysis) +// requested alias analysis but no optimization enabled +CmdArgs.push_back("-falias-analysis"); +} + } + Args.addAllArgs(CmdArgs, {options::OPT_flang_experimental_hlfir, options::OPT_flang_deprecated_no_hlfir, options::OPT_flang_experimental_polymorphism, diff --git a/flang/include/flang/Tools/CLOptions.inc b/flang/include/flang/Tools/CLOptions.inc index c452c023b4a80ce..5a17385fb3dae87 100644 --- a/flang/include/flang/Tools/CLOptions.inc +++ b/flang/include/flang/Tools/CLOptions.inc @@ -157,11 +157,11 @@ inline void addDebugFoundationPass(mlir::PassManager ) { [&]() { return fir::createAddDebugFoundationPass(); }); } -inline void addFIRToLLVMPass( -mlir::PassManager , llvm::OptimizationLevel optLevel = defaultOptLevel) { +inline void addFIRToLLVMPass(mlir::PassManager , +llvm::OptimizationLevel optLevel = defaultOptLevel, bool applyTbaa = true) { fir::FIRToLLVMPassOptions options; options.ignoreMissingTypeDescriptors = ignoreMissingTypeDescriptors; - options.applyTBAA = optLevel.isOptimizingForSpeed(); + options.applyTBAA = applyTbaa; options.forceUnifiedTBAATree = useOldAliasTags; addPassConditionally(pm, disableFirToLlvmIr, [&]() { return fir::createFIRToLLVMPass(options); }); @@ -311,7 +311,7 @@ inline void createDefaultFIRCodeGenPassPipeline( if (config.VScaleMin != 0) pm.addPass(fir::createVScaleAttrPass({config.VScaleMin, config.VScaleMax})); - fir::addFIRToLLVMPass(pm, config.OptLevel); + fir::addFIRToLLVMPass(pm, config.OptLevel, config.AliasAnalysis); } /// Create a pass pipeline for lowering from MLIR to LLVM IR diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index cb4f2d6a6225205..cfb1dd91ead3056 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -242,10 +242,24 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions , clang::driver::options::OPT_fno_loop_versioning, false)) opts.LoopVersioning = 1; - opts.AliasAnalysis = - args.hasFlag(clang::driver::options::OPT_falias_analysis, - clang::driver::options::OPT_fno_alias_analysis, - /*default=*/false); + bool aliasAnalysis = false; + bool noAliasAnalysis = false; + if (auto *arg = + args.getLastArg(clang::driver::options::OPT_falias_analysis, + clang::driver::options::OPT_fno_alias_analysis)) { +if (arg->getOption().matches(clang::driver::options::OPT_falias_analysis)) + aliasAnalysis = true; +else + noAliasAnalysis = true; + } + opts.AliasAnalysis = 0; + if (opts.OptimizationLevel > 0) { +if (!noAliasAnalysis) + opts.AliasAnalysis = 1; + } else { +if (aliasAnalysis) + opts.AliasAnalysis = 1; + } for (auto *a : args.filtered(clang::driver::options::OPT_fpass_plugin_EQ))
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
https://github.com/banach-space commented: Thanks for addressing my comments - this is looking really good now! https://github.com/llvm/llvm-project/pull/73111 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
https://github.com/banach-space edited https://github.com/llvm/llvm-project/pull/73111 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
@@ -142,6 +142,26 @@ void Flang::addCodegenOptions(const ArgList , if (shouldLoopVersion(Args)) CmdArgs.push_back("-fversion-loops-for-stride"); + Arg *aliasAnalysis = Args.getLastArg(options::OPT_falias_analysis, + options::OPT_fno_alias_analysis); + Arg *optLevel = + Args.getLastArg(options::OPT_Ofast, options::OPT_O, options::OPT_O4); kiranchandramohan wrote: Some discussion regarding `-Os` is here. https://discourse.llvm.org/t/code-size-optimization-flags-in-flang/69482 https://github.com/llvm/llvm-project/pull/73111 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
@@ -242,10 +242,24 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions , clang::driver::options::OPT_fno_loop_versioning, false)) opts.LoopVersioning = 1; - opts.AliasAnalysis = - args.hasFlag(clang::driver::options::OPT_falias_analysis, - clang::driver::options::OPT_fno_alias_analysis, - /*default=*/false); + bool aliasAnalysis = false; + bool noAliasAnalysis = false; + if (auto *arg = + args.getLastArg(clang::driver::options::OPT_falias_analysis, + clang::driver::options::OPT_fno_alias_analysis)) { +if (arg->getOption().matches(clang::driver::options::OPT_falias_analysis)) + aliasAnalysis = true; +else + noAliasAnalysis = true; + } + opts.AliasAnalysis = 0; + if (opts.OptimizationLevel > 0) { +if (!noAliasAnalysis) + opts.AliasAnalysis = 1; + } else { +if (aliasAnalysis) + opts.AliasAnalysis = 1; + } tblah wrote: Thanks for explaining. Is https://github.com/llvm/llvm-project/pull/73111/commits/c2b7674546588d9e5227f1d71cada670bf61166b acceptable? https://github.com/llvm/llvm-project/pull/73111 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
https://github.com/banach-space commented: Makes sense, but the summary should document when exactly the alias analysis is enabled/disabled. And the relationship between `-f{no}-alias-analysis` and the optimisation flags. Could you also add a note whether the implemented behaviour is consistent with Clang? https://github.com/llvm/llvm-project/pull/73111 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
https://github.com/vzakhari edited https://github.com/llvm/llvm-project/pull/73111 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
https://github.com/tblah updated https://github.com/llvm/llvm-project/pull/73111 >From 617d6d23b2f861cd6dceb82f54a2685059b6 Mon Sep 17 00:00:00 2001 From: Tom Eccles Date: Thu, 14 Sep 2023 09:09:29 + Subject: [PATCH 1/4] [flang] Enable alias tags pass by default Enable by default when optimizing for speed. For simplicity, only forward the flag to the frontend driver when it contradicts what is implied by the optimization level. --- clang/lib/Driver/ToolChains/Flang.cpp | 20 flang/include/flang/Tools/CLOptions.inc | 8 flang/lib/Frontend/CompilerInvocation.cpp | 22 ++ flang/test/Driver/falias-analysis.f90 | 4 flang/test/Driver/mlir-pass-pipeline.f90 | 2 ++ flang/test/Driver/optimization-remark.f90 | 22 +- flang/test/Fir/basic-program.fir | 4 flang/tools/tco/tco.cpp | 1 + 8 files changed, 62 insertions(+), 21 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 8bdd920c3dcbb79..9382433b94dadfd 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -142,6 +142,26 @@ void Flang::addCodegenOptions(const ArgList , if (shouldLoopVersion(Args)) CmdArgs.push_back("-fversion-loops-for-stride"); + Arg *aliasAnalysis = Args.getLastArg(options::OPT_falias_analysis, + options::OPT_fno_alias_analysis); + Arg *optLevel = + Args.getLastArg(options::OPT_Ofast, options::OPT_O, options::OPT_O4); + if (aliasAnalysis) { +bool falias_analysis = +aliasAnalysis->getOption().matches(options::OPT_falias_analysis); +// only pass on the argument if it does not match that implied by the +// optimization level +if (optLevel) { + if (!falias_analysis) { +CmdArgs.push_back("-fno-alias-analysis"); + } +} else { + if (falias_analysis) +// requested alias analysis but no optimization enabled +CmdArgs.push_back("-falias-analysis"); +} + } + Args.addAllArgs(CmdArgs, {options::OPT_flang_experimental_hlfir, options::OPT_flang_deprecated_no_hlfir, options::OPT_flang_experimental_polymorphism, diff --git a/flang/include/flang/Tools/CLOptions.inc b/flang/include/flang/Tools/CLOptions.inc index c452c023b4a80ce..5a17385fb3dae87 100644 --- a/flang/include/flang/Tools/CLOptions.inc +++ b/flang/include/flang/Tools/CLOptions.inc @@ -157,11 +157,11 @@ inline void addDebugFoundationPass(mlir::PassManager ) { [&]() { return fir::createAddDebugFoundationPass(); }); } -inline void addFIRToLLVMPass( -mlir::PassManager , llvm::OptimizationLevel optLevel = defaultOptLevel) { +inline void addFIRToLLVMPass(mlir::PassManager , +llvm::OptimizationLevel optLevel = defaultOptLevel, bool applyTbaa = true) { fir::FIRToLLVMPassOptions options; options.ignoreMissingTypeDescriptors = ignoreMissingTypeDescriptors; - options.applyTBAA = optLevel.isOptimizingForSpeed(); + options.applyTBAA = applyTbaa; options.forceUnifiedTBAATree = useOldAliasTags; addPassConditionally(pm, disableFirToLlvmIr, [&]() { return fir::createFIRToLLVMPass(options); }); @@ -311,7 +311,7 @@ inline void createDefaultFIRCodeGenPassPipeline( if (config.VScaleMin != 0) pm.addPass(fir::createVScaleAttrPass({config.VScaleMin, config.VScaleMax})); - fir::addFIRToLLVMPass(pm, config.OptLevel); + fir::addFIRToLLVMPass(pm, config.OptLevel, config.AliasAnalysis); } /// Create a pass pipeline for lowering from MLIR to LLVM IR diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index cb4f2d6a6225205..cfb1dd91ead3056 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -242,10 +242,24 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions , clang::driver::options::OPT_fno_loop_versioning, false)) opts.LoopVersioning = 1; - opts.AliasAnalysis = - args.hasFlag(clang::driver::options::OPT_falias_analysis, - clang::driver::options::OPT_fno_alias_analysis, - /*default=*/false); + bool aliasAnalysis = false; + bool noAliasAnalysis = false; + if (auto *arg = + args.getLastArg(clang::driver::options::OPT_falias_analysis, + clang::driver::options::OPT_fno_alias_analysis)) { +if (arg->getOption().matches(clang::driver::options::OPT_falias_analysis)) + aliasAnalysis = true; +else + noAliasAnalysis = true; + } + opts.AliasAnalysis = 0; + if (opts.OptimizationLevel > 0) { +if (!noAliasAnalysis) + opts.AliasAnalysis = 1; + } else { +if (aliasAnalysis) + opts.AliasAnalysis = 1; + } for (auto *a : args.filtered(clang::driver::options::OPT_fpass_plugin_EQ))
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
github-actions[bot] wrote: :warning: C/C++ code formatter, clang-format found issues in your code. :warning: You can test this locally with the following command: ``bash git-clang-format --diff fbfd2c9972695bc74a646bfa5e3e2d00477dabe2 b5b0aa7c97dcdd723ca53c71b77382e834ec1938 -- clang/lib/Driver/ToolChains/Flang.cpp flang/include/flang/Tools/CLOptions.inc flang/lib/Frontend/CompilerInvocation.cpp flang/tools/tco/tco.cpp `` View the diff from clang-format here. ``diff diff --git a/flang/include/flang/Tools/CLOptions.inc b/flang/include/flang/Tools/CLOptions.inc index 0e00f9c01c..d3e4dc6cd4 100644 --- a/flang/include/flang/Tools/CLOptions.inc +++ b/flang/include/flang/Tools/CLOptions.inc @@ -157,8 +157,8 @@ inline void addDebugFoundationPass(mlir::PassManager ) { [&]() { return fir::createAddDebugFoundationPass(); }); } -inline void addFIRToLLVMPass(mlir::PassManager , -const MLIRToLLVMPassPipelineConfig ) { +inline void addFIRToLLVMPass( +mlir::PassManager , const MLIRToLLVMPassPipelineConfig ) { fir::FIRToLLVMPassOptions options; options.ignoreMissingTypeDescriptors = ignoreMissingTypeDescriptors; options.applyTBAA = config.AliasAnalysis; `` https://github.com/llvm/llvm-project/pull/73111 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
@@ -142,6 +142,26 @@ void Flang::addCodegenOptions(const ArgList , if (shouldLoopVersion(Args)) CmdArgs.push_back("-fversion-loops-for-stride"); + Arg *aliasAnalysis = Args.getLastArg(options::OPT_falias_analysis, + options::OPT_fno_alias_analysis); + Arg *optLevel = + Args.getLastArg(options::OPT_Ofast, options::OPT_O, options::OPT_O4); tblah wrote: It would be disabled unless `-falias-analysis` is specified directly. What I am trying to accomplish here is for the frontend driver to usually just do what you expect, without having to remember to use this option. But I want there to still be a separate flag available to override this default behavior. https://github.com/llvm/llvm-project/pull/73111 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
@@ -242,10 +242,24 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions , clang::driver::options::OPT_fno_loop_versioning, false)) opts.LoopVersioning = 1; - opts.AliasAnalysis = - args.hasFlag(clang::driver::options::OPT_falias_analysis, - clang::driver::options::OPT_fno_alias_analysis, - /*default=*/false); + bool aliasAnalysis = false; + bool noAliasAnalysis = false; tblah wrote: If `-falias-analysis` is specified then we should enable alias analysis even when it would not be enabled by the optimization level. If `-fno-alias-analysis` is specified then we should not enable enable analysis even if it would be enabled by the optimization level. This doesn't fit neatly into a single boolean, because we also need to support the state where both of these are false (indicating that we should follow the default behavior). An alternative implementation would be a single boolean inside a std::option. Would that be clearer? https://github.com/llvm/llvm-project/pull/73111 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
https://github.com/banach-space commented: Nice! > Enable by default when optimizing for speed. Please, can you be more specific and define what qualifies as "optimizing for speed"? https://github.com/llvm/llvm-project/pull/73111 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
https://github.com/Leporacanthicus approved this pull request. LGTM https://github.com/llvm/llvm-project/pull/73111 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
https://github.com/tblah updated https://github.com/llvm/llvm-project/pull/73111 >From 617d6d23b2f861cd6dceb82f54a2685059b6 Mon Sep 17 00:00:00 2001 From: Tom Eccles Date: Thu, 14 Sep 2023 09:09:29 + Subject: [PATCH 1/2] [flang] Enable alias tags pass by default Enable by default when optimizing for speed. For simplicity, only forward the flag to the frontend driver when it contradicts what is implied by the optimization level. --- clang/lib/Driver/ToolChains/Flang.cpp | 20 flang/include/flang/Tools/CLOptions.inc | 8 flang/lib/Frontend/CompilerInvocation.cpp | 22 ++ flang/test/Driver/falias-analysis.f90 | 4 flang/test/Driver/mlir-pass-pipeline.f90 | 2 ++ flang/test/Driver/optimization-remark.f90 | 22 +- flang/test/Fir/basic-program.fir | 4 flang/tools/tco/tco.cpp | 1 + 8 files changed, 62 insertions(+), 21 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 8bdd920c3dcbb79..9382433b94dadfd 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -142,6 +142,26 @@ void Flang::addCodegenOptions(const ArgList , if (shouldLoopVersion(Args)) CmdArgs.push_back("-fversion-loops-for-stride"); + Arg *aliasAnalysis = Args.getLastArg(options::OPT_falias_analysis, + options::OPT_fno_alias_analysis); + Arg *optLevel = + Args.getLastArg(options::OPT_Ofast, options::OPT_O, options::OPT_O4); + if (aliasAnalysis) { +bool falias_analysis = +aliasAnalysis->getOption().matches(options::OPT_falias_analysis); +// only pass on the argument if it does not match that implied by the +// optimization level +if (optLevel) { + if (!falias_analysis) { +CmdArgs.push_back("-fno-alias-analysis"); + } +} else { + if (falias_analysis) +// requested alias analysis but no optimization enabled +CmdArgs.push_back("-falias-analysis"); +} + } + Args.addAllArgs(CmdArgs, {options::OPT_flang_experimental_hlfir, options::OPT_flang_deprecated_no_hlfir, options::OPT_flang_experimental_polymorphism, diff --git a/flang/include/flang/Tools/CLOptions.inc b/flang/include/flang/Tools/CLOptions.inc index c452c023b4a80ce..5a17385fb3dae87 100644 --- a/flang/include/flang/Tools/CLOptions.inc +++ b/flang/include/flang/Tools/CLOptions.inc @@ -157,11 +157,11 @@ inline void addDebugFoundationPass(mlir::PassManager ) { [&]() { return fir::createAddDebugFoundationPass(); }); } -inline void addFIRToLLVMPass( -mlir::PassManager , llvm::OptimizationLevel optLevel = defaultOptLevel) { +inline void addFIRToLLVMPass(mlir::PassManager , +llvm::OptimizationLevel optLevel = defaultOptLevel, bool applyTbaa = true) { fir::FIRToLLVMPassOptions options; options.ignoreMissingTypeDescriptors = ignoreMissingTypeDescriptors; - options.applyTBAA = optLevel.isOptimizingForSpeed(); + options.applyTBAA = applyTbaa; options.forceUnifiedTBAATree = useOldAliasTags; addPassConditionally(pm, disableFirToLlvmIr, [&]() { return fir::createFIRToLLVMPass(options); }); @@ -311,7 +311,7 @@ inline void createDefaultFIRCodeGenPassPipeline( if (config.VScaleMin != 0) pm.addPass(fir::createVScaleAttrPass({config.VScaleMin, config.VScaleMax})); - fir::addFIRToLLVMPass(pm, config.OptLevel); + fir::addFIRToLLVMPass(pm, config.OptLevel, config.AliasAnalysis); } /// Create a pass pipeline for lowering from MLIR to LLVM IR diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index cb4f2d6a6225205..cfb1dd91ead3056 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -242,10 +242,24 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions , clang::driver::options::OPT_fno_loop_versioning, false)) opts.LoopVersioning = 1; - opts.AliasAnalysis = - args.hasFlag(clang::driver::options::OPT_falias_analysis, - clang::driver::options::OPT_fno_alias_analysis, - /*default=*/false); + bool aliasAnalysis = false; + bool noAliasAnalysis = false; + if (auto *arg = + args.getLastArg(clang::driver::options::OPT_falias_analysis, + clang::driver::options::OPT_fno_alias_analysis)) { +if (arg->getOption().matches(clang::driver::options::OPT_falias_analysis)) + aliasAnalysis = true; +else + noAliasAnalysis = true; + } + opts.AliasAnalysis = 0; + if (opts.OptimizationLevel > 0) { +if (!noAliasAnalysis) + opts.AliasAnalysis = 1; + } else { +if (aliasAnalysis) + opts.AliasAnalysis = 1; + } for (auto *a : args.filtered(clang::driver::options::OPT_fpass_plugin_EQ))
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
@@ -242,10 +242,24 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions , clang::driver::options::OPT_fno_loop_versioning, false)) opts.LoopVersioning = 1; - opts.AliasAnalysis = - args.hasFlag(clang::driver::options::OPT_falias_analysis, - clang::driver::options::OPT_fno_alias_analysis, - /*default=*/false); + bool aliasAnalysis = false; + bool noAliasAnalysis = false; + if (auto *arg = + args.getLastArg(clang::driver::options::OPT_falias_analysis, + clang::driver::options::OPT_fno_alias_analysis)) { +if (arg->getOption().matches(clang::driver::options::OPT_falias_analysis)) + aliasAnalysis = true; +else + noAliasAnalysis = true; + } + opts.AliasAnalysis = 0; + if (opts.OptimizationLevel > 0) { +if (!noAliasAnalysis) + opts.AliasAnalysis = 1; Leporacanthicus wrote: Is there a reason that AliasAnalysis is an integer, rather than a boolean? https://github.com/llvm/llvm-project/pull/73111 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
@@ -311,7 +311,7 @@ inline void createDefaultFIRCodeGenPassPipeline( if (config.VScaleMin != 0) pm.addPass(fir::createVScaleAttrPass({config.VScaleMin, config.VScaleMax})); - fir::addFIRToLLVMPass(pm, config.OptLevel); + fir::addFIRToLLVMPass(pm, config.OptLevel, config.AliasAnalysis); Leporacanthicus wrote: Maybe we can just pass (const reference to) `config` into the `addFIRToLLVMPass`? https://github.com/llvm/llvm-project/pull/73111 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
llvmbot wrote: @llvm/pr-subscribers-flang-driver Author: Tom Eccles (tblah) Changes Enable by default when optimizing for speed. For simplicity, only forward the flag to the frontend driver when it contradicts what is implied by the optimization level. Since https://github.com/llvm/llvm-project/pull/72903 there are now no known performance regressions. Original PR was https://github.com/llvm/llvm-project/pull/68597 --- Full diff: https://github.com/llvm/llvm-project/pull/73111.diff 8 Files Affected: - (modified) clang/lib/Driver/ToolChains/Flang.cpp (+20) - (modified) flang/include/flang/Tools/CLOptions.inc (+4-4) - (modified) flang/lib/Frontend/CompilerInvocation.cpp (+18-4) - (modified) flang/test/Driver/falias-analysis.f90 (+4) - (modified) flang/test/Driver/mlir-pass-pipeline.f90 (+2) - (modified) flang/test/Driver/optimization-remark.f90 (+9-13) - (modified) flang/test/Fir/basic-program.fir (+4) - (modified) flang/tools/tco/tco.cpp (+1) ``diff diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 8bdd920c3dcbb796..9382433b94dadfd4 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -142,6 +142,26 @@ void Flang::addCodegenOptions(const ArgList , if (shouldLoopVersion(Args)) CmdArgs.push_back("-fversion-loops-for-stride"); + Arg *aliasAnalysis = Args.getLastArg(options::OPT_falias_analysis, + options::OPT_fno_alias_analysis); + Arg *optLevel = + Args.getLastArg(options::OPT_Ofast, options::OPT_O, options::OPT_O4); + if (aliasAnalysis) { +bool falias_analysis = +aliasAnalysis->getOption().matches(options::OPT_falias_analysis); +// only pass on the argument if it does not match that implied by the +// optimization level +if (optLevel) { + if (!falias_analysis) { +CmdArgs.push_back("-fno-alias-analysis"); + } +} else { + if (falias_analysis) +// requested alias analysis but no optimization enabled +CmdArgs.push_back("-falias-analysis"); +} + } + Args.addAllArgs(CmdArgs, {options::OPT_flang_experimental_hlfir, options::OPT_flang_deprecated_no_hlfir, options::OPT_flang_experimental_polymorphism, diff --git a/flang/include/flang/Tools/CLOptions.inc b/flang/include/flang/Tools/CLOptions.inc index c452c023b4a80ce1..5a17385fb3dae87a 100644 --- a/flang/include/flang/Tools/CLOptions.inc +++ b/flang/include/flang/Tools/CLOptions.inc @@ -157,11 +157,11 @@ inline void addDebugFoundationPass(mlir::PassManager ) { [&]() { return fir::createAddDebugFoundationPass(); }); } -inline void addFIRToLLVMPass( -mlir::PassManager , llvm::OptimizationLevel optLevel = defaultOptLevel) { +inline void addFIRToLLVMPass(mlir::PassManager , +llvm::OptimizationLevel optLevel = defaultOptLevel, bool applyTbaa = true) { fir::FIRToLLVMPassOptions options; options.ignoreMissingTypeDescriptors = ignoreMissingTypeDescriptors; - options.applyTBAA = optLevel.isOptimizingForSpeed(); + options.applyTBAA = applyTbaa; options.forceUnifiedTBAATree = useOldAliasTags; addPassConditionally(pm, disableFirToLlvmIr, [&]() { return fir::createFIRToLLVMPass(options); }); @@ -311,7 +311,7 @@ inline void createDefaultFIRCodeGenPassPipeline( if (config.VScaleMin != 0) pm.addPass(fir::createVScaleAttrPass({config.VScaleMin, config.VScaleMax})); - fir::addFIRToLLVMPass(pm, config.OptLevel); + fir::addFIRToLLVMPass(pm, config.OptLevel, config.AliasAnalysis); } /// Create a pass pipeline for lowering from MLIR to LLVM IR diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index cb4f2d6a6225205b..cfb1dd91ead30564 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -242,10 +242,24 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions , clang::driver::options::OPT_fno_loop_versioning, false)) opts.LoopVersioning = 1; - opts.AliasAnalysis = - args.hasFlag(clang::driver::options::OPT_falias_analysis, - clang::driver::options::OPT_fno_alias_analysis, - /*default=*/false); + bool aliasAnalysis = false; + bool noAliasAnalysis = false; + if (auto *arg = + args.getLastArg(clang::driver::options::OPT_falias_analysis, + clang::driver::options::OPT_fno_alias_analysis)) { +if (arg->getOption().matches(clang::driver::options::OPT_falias_analysis)) + aliasAnalysis = true; +else + noAliasAnalysis = true; + } + opts.AliasAnalysis = 0; + if (opts.OptimizationLevel > 0) { +if (!noAliasAnalysis) + opts.AliasAnalysis = 1; + } else { +if (aliasAnalysis) + opts.AliasAnalysis = 1; + } for (auto *a : args.filtered(clang::driver::options::OPT_fpass_plugin_EQ))
[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)
https://github.com/tblah created https://github.com/llvm/llvm-project/pull/73111 Enable by default when optimizing for speed. For simplicity, only forward the flag to the frontend driver when it contradicts what is implied by the optimization level. Since https://github.com/llvm/llvm-project/pull/72903 there are now no known performance regressions. Original PR was https://github.com/llvm/llvm-project/pull/68597 >From 617d6d23b2f861cd6dceb82f54a2685059b6 Mon Sep 17 00:00:00 2001 From: Tom Eccles Date: Thu, 14 Sep 2023 09:09:29 + Subject: [PATCH] [flang] Enable alias tags pass by default Enable by default when optimizing for speed. For simplicity, only forward the flag to the frontend driver when it contradicts what is implied by the optimization level. --- clang/lib/Driver/ToolChains/Flang.cpp | 20 flang/include/flang/Tools/CLOptions.inc | 8 flang/lib/Frontend/CompilerInvocation.cpp | 22 ++ flang/test/Driver/falias-analysis.f90 | 4 flang/test/Driver/mlir-pass-pipeline.f90 | 2 ++ flang/test/Driver/optimization-remark.f90 | 22 +- flang/test/Fir/basic-program.fir | 4 flang/tools/tco/tco.cpp | 1 + 8 files changed, 62 insertions(+), 21 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 8bdd920c3dcbb796..9382433b94dadfd4 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -142,6 +142,26 @@ void Flang::addCodegenOptions(const ArgList , if (shouldLoopVersion(Args)) CmdArgs.push_back("-fversion-loops-for-stride"); + Arg *aliasAnalysis = Args.getLastArg(options::OPT_falias_analysis, + options::OPT_fno_alias_analysis); + Arg *optLevel = + Args.getLastArg(options::OPT_Ofast, options::OPT_O, options::OPT_O4); + if (aliasAnalysis) { +bool falias_analysis = +aliasAnalysis->getOption().matches(options::OPT_falias_analysis); +// only pass on the argument if it does not match that implied by the +// optimization level +if (optLevel) { + if (!falias_analysis) { +CmdArgs.push_back("-fno-alias-analysis"); + } +} else { + if (falias_analysis) +// requested alias analysis but no optimization enabled +CmdArgs.push_back("-falias-analysis"); +} + } + Args.addAllArgs(CmdArgs, {options::OPT_flang_experimental_hlfir, options::OPT_flang_deprecated_no_hlfir, options::OPT_flang_experimental_polymorphism, diff --git a/flang/include/flang/Tools/CLOptions.inc b/flang/include/flang/Tools/CLOptions.inc index c452c023b4a80ce1..5a17385fb3dae87a 100644 --- a/flang/include/flang/Tools/CLOptions.inc +++ b/flang/include/flang/Tools/CLOptions.inc @@ -157,11 +157,11 @@ inline void addDebugFoundationPass(mlir::PassManager ) { [&]() { return fir::createAddDebugFoundationPass(); }); } -inline void addFIRToLLVMPass( -mlir::PassManager , llvm::OptimizationLevel optLevel = defaultOptLevel) { +inline void addFIRToLLVMPass(mlir::PassManager , +llvm::OptimizationLevel optLevel = defaultOptLevel, bool applyTbaa = true) { fir::FIRToLLVMPassOptions options; options.ignoreMissingTypeDescriptors = ignoreMissingTypeDescriptors; - options.applyTBAA = optLevel.isOptimizingForSpeed(); + options.applyTBAA = applyTbaa; options.forceUnifiedTBAATree = useOldAliasTags; addPassConditionally(pm, disableFirToLlvmIr, [&]() { return fir::createFIRToLLVMPass(options); }); @@ -311,7 +311,7 @@ inline void createDefaultFIRCodeGenPassPipeline( if (config.VScaleMin != 0) pm.addPass(fir::createVScaleAttrPass({config.VScaleMin, config.VScaleMax})); - fir::addFIRToLLVMPass(pm, config.OptLevel); + fir::addFIRToLLVMPass(pm, config.OptLevel, config.AliasAnalysis); } /// Create a pass pipeline for lowering from MLIR to LLVM IR diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index cb4f2d6a6225205b..cfb1dd91ead30564 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -242,10 +242,24 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions , clang::driver::options::OPT_fno_loop_versioning, false)) opts.LoopVersioning = 1; - opts.AliasAnalysis = - args.hasFlag(clang::driver::options::OPT_falias_analysis, - clang::driver::options::OPT_fno_alias_analysis, - /*default=*/false); + bool aliasAnalysis = false; + bool noAliasAnalysis = false; + if (auto *arg = + args.getLastArg(clang::driver::options::OPT_falias_analysis, + clang::driver::options::OPT_fno_alias_analysis)) { +if (arg->getOption().matches(clang::driver::options::OPT_falias_analysis)) + aliasAnalysis = true; +