[flang] [clang] [flang] Enable alias tags pass by default (PR #73111)

2023-11-27 Thread Tom Eccles via cfe-commits

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)

2023-11-27 Thread Andrzej Warzyński via cfe-commits

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)

2023-11-27 Thread Kiran Chandramohan via cfe-commits

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)

2023-11-27 Thread Tom Eccles via cfe-commits

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)

2023-11-27 Thread Andrzej Warzyński via cfe-commits

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)

2023-11-27 Thread Andrzej Warzyński via cfe-commits

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)

2023-11-27 Thread Kiran Chandramohan via cfe-commits


@@ -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)

2023-11-23 Thread Tom Eccles via cfe-commits


@@ -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)

2023-11-23 Thread Andrzej Warzyński via cfe-commits

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)

2023-11-22 Thread Slava Zakharin via cfe-commits

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)

2023-11-22 Thread Tom Eccles via cfe-commits

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)

2023-11-22 Thread via cfe-commits

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)

2023-11-22 Thread Tom Eccles via cfe-commits


@@ -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)

2023-11-22 Thread Tom Eccles via cfe-commits


@@ -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)

2023-11-22 Thread Andrzej Warzyński via cfe-commits

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)

2023-11-22 Thread Mats Petersson via cfe-commits

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)

2023-11-22 Thread Tom Eccles via cfe-commits

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)

2023-11-22 Thread Mats Petersson via cfe-commits


@@ -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)

2023-11-22 Thread Mats Petersson via cfe-commits


@@ -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)

2023-11-22 Thread via cfe-commits

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)

2023-11-22 Thread Tom Eccles via cfe-commits

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;
+