Skip to content

Commit 374e828

Browse files
authored
[flang] (Re-)Enable alias tags pass by default (#74250)
Enable by default for optimization levels higher than 0 (same behavior as clang). For simplicity, only forward the flag to the frontend driver when it contradicts what is implied by the optimization level. This was first landed in #73111 but was later reverted due to a performance regression. That regression was fixed by #74065.
1 parent c274eea commit 374e828

File tree

8 files changed

+60
-21
lines changed

8 files changed

+60
-21
lines changed

clang/lib/Driver/ToolChains/Flang.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,26 @@ void Flang::addCodegenOptions(const ArgList &Args,
143143
if (shouldLoopVersion(Args))
144144
CmdArgs.push_back("-fversion-loops-for-stride");
145145

146+
Arg *aliasAnalysis = Args.getLastArg(options::OPT_falias_analysis,
147+
options::OPT_fno_alias_analysis);
148+
// only pass on the argument if it does not match that implied by the
149+
// optimization level: so if optimization is requested, only forward
150+
// -fno-alias-analysis. If optimization is not requested, only forward
151+
// -falias-analysis.
152+
Arg *optLevel =
153+
Args.getLastArg(options::OPT_Ofast, options::OPT_O, options::OPT_O4);
154+
if (aliasAnalysis) {
155+
bool faliasAnalysis =
156+
aliasAnalysis->getOption().matches(options::OPT_falias_analysis);
157+
if (optLevel && !faliasAnalysis) {
158+
CmdArgs.push_back("-fno-alias-analysis");
159+
} else {
160+
if (faliasAnalysis)
161+
// requested alias analysis but no optimization enabled
162+
CmdArgs.push_back("-falias-analysis");
163+
}
164+
}
165+
146166
Args.addAllArgs(CmdArgs, {options::OPT_flang_experimental_hlfir,
147167
options::OPT_flang_deprecated_no_hlfir,
148168
options::OPT_flang_experimental_polymorphism,

flang/include/flang/Tools/CLOptions.inc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,10 +158,10 @@ inline void addDebugFoundationPass(mlir::PassManager &pm) {
158158
}
159159

160160
inline void addFIRToLLVMPass(
161-
mlir::PassManager &pm, llvm::OptimizationLevel optLevel = defaultOptLevel) {
161+
mlir::PassManager &pm, const MLIRToLLVMPassPipelineConfig &config) {
162162
fir::FIRToLLVMPassOptions options;
163163
options.ignoreMissingTypeDescriptors = ignoreMissingTypeDescriptors;
164-
options.applyTBAA = optLevel.isOptimizingForSpeed();
164+
options.applyTBAA = config.AliasAnalysis;
165165
options.forceUnifiedTBAATree = useOldAliasTags;
166166
addPassConditionally(pm, disableFirToLlvmIr,
167167
[&]() { return fir::createFIRToLLVMPass(options); });
@@ -311,7 +311,7 @@ inline void createDefaultFIRCodeGenPassPipeline(
311311
if (config.VScaleMin != 0)
312312
pm.addPass(fir::createVScaleAttrPass({config.VScaleMin, config.VScaleMax}));
313313

314-
fir::addFIRToLLVMPass(pm, config.OptLevel);
314+
fir::addFIRToLLVMPass(pm, config);
315315
}
316316

317317
/// Create a pass pipeline for lowering from MLIR to LLVM IR

flang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -242,10 +242,12 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts,
242242
clang::driver::options::OPT_fno_loop_versioning, false))
243243
opts.LoopVersioning = 1;
244244

245-
opts.AliasAnalysis =
246-
args.hasFlag(clang::driver::options::OPT_falias_analysis,
247-
clang::driver::options::OPT_fno_alias_analysis,
248-
/*default=*/false);
245+
opts.AliasAnalysis = opts.OptimizationLevel > 0;
246+
if (auto *arg =
247+
args.getLastArg(clang::driver::options::OPT_falias_analysis,
248+
clang::driver::options::OPT_fno_alias_analysis))
249+
opts.AliasAnalysis =
250+
arg->getOption().matches(clang::driver::options::OPT_falias_analysis);
249251

250252
for (auto *a : args.filtered(clang::driver::options::OPT_fpass_plugin_EQ))
251253
opts.LLVMPassPlugins.push_back(a->getValue());

flang/test/Driver/falias-analysis.f90

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,26 @@
22
! See flang/test/Fir/tbaa-codegen.fir for a test that the output is correct
33

44
! RUN: %flang -c -emit-llvm -falias-analysis %s -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-AA --check-prefix=CHECK-ALL
5-
! RUN: %flang -c -emit-llvm -falias-analysis -fno-alias-analysis %s -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-NOAA --check-prefix=CHECK-ALL
5+
! RUN: %flang -c -emit-llvm -Ofast %s -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-AA --check-prefix=CHECK-ALL
6+
! RUN: %flang -c -emit-llvm -O3 %s -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-AA --check-prefix=CHECK-ALL
7+
! RUN: %flang -c -emit-llvm -O2 %s -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-AA --check-prefix=CHECK-ALL
8+
! RUN: %flang -c -emit-llvm -O1 %s -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-AA --check-prefix=CHECK-ALL
9+
10+
! RUN: %flang -c -emit-llvm -O0 %s -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-NOAA --check-prefix=CHECK-ALL
11+
! RUN: %flang -c -emit-llvm -Ofast -fno-alias-analysis %s -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-NOAA --check-prefix=CHECK-ALL
12+
! RUN: %flang -c -emit-llvm -fno-alias-analysis -Ofast %s -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-NOAA --check-prefix=CHECK-ALL
613
! RUN: %flang -c -emit-llvm %s -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-NOAA --check-prefix=CHECK-ALL
14+
! RUN: %flang -c -emit-llvm -falias-analysis -fno-alias-analysis %s -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-NOAA --check-prefix=CHECK-ALL
715

816
! RUN: %flang -fc1 -emit-llvm -falias-analysis %s -o - | FileCheck %s --check-prefix=CHECK-AA --check-prefix=CHECK-ALL
17+
! RUN: %flang -fc1 -emit-llvm -O3 %s -o - | FileCheck %s --check-prefix=CHECK-AA --check-prefix=CHECK-ALL
18+
! RUN: %flang -fc1 -emit-llvm -O2 %s -o - | FileCheck %s --check-prefix=CHECK-AA --check-prefix=CHECK-ALL
19+
! RUN: %flang -fc1 -emit-llvm -O1 %s -o - | FileCheck %s --check-prefix=CHECK-AA --check-prefix=CHECK-ALL
20+
21+
! RUN: %flang -fc1 -emit-llvm -O0 %s -o - | FileCheck %s --check-prefix=CHECK-NOAA --check-prefix=CHECK-ALL
922
! RUN: %flang -fc1 -emit-llvm -falias-analysis -fno-alias-analysis %s -o - | FileCheck %s --check-prefix=CHECK-NOAA --check-prefix=CHECK-ALL
1023
! RUN: %flang -fc1 -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK-NOAA --check-prefix=CHECK-ALL
24+
! RUN: %flang -fc1 -emit-llvm -O3 -fno-alias-analysis %s -o - | FileCheck %s --check-prefix=CHECK-NOAA --check-prefix=CHECK-ALL
1125

1226
subroutine simple(a)
1327
integer, intent(inout) :: a(:)

flang/test/Driver/mlir-pass-pipeline.f90

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@
5151

5252
! ALL-NEXT: 'func.func' Pipeline
5353
! ALL-NEXT: PolymorphicOpConversion
54+
! O2-NEXT: AddAliasTags
55+
! O2-NEXT: 'func.func' Pipeline
5456
! ALL-NEXT: CFGConversion
5557

5658
! ALL-NEXT: SCFToControlFlow

flang/test/Driver/optimization-remark.f90

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,28 +41,24 @@
4141
! Once we start filtering, this is reduced to 1 one of the loop passes.
4242

4343
! PASS-REGEX-LOOP-ONLY-NOT: optimization-remark.f90:77:7: remark: hoisting load [-Rpass=licm]
44-
! PASS-REGEX-LOOP-ONLY: optimization-remark.f90:83:5: remark: Loop deleted because it is invariant [-Rpass=loop-delete]
44+
! PASS-REGEX-LOOP-ONLY: optimization-remark.f90:79:5: remark: Loop deleted because it is invariant [-Rpass=loop-delete]
4545

4646
! MISSED-REGEX-LOOP-ONLY-NOT: optimization-remark.f90:77:7: remark: failed to hoist load with loop-invariant address because load is conditionally executed [-Rpass-missed=licm]
47-
! MISSED-REGEX-LOOP-ONLY: optimization-remark.f90:76:4: remark: loop not vectorized [-Rpass-missed=loop-vectorize]
47+
! MISSED-REGEX-LOOP-ONLY: optimization-remark.f90:72:4: remark: loop not vectorized [-Rpass-missed=loop-vectorize]
4848

4949

50-
! ANALYSIS-REGEX-LOOP-ONLY: optimization-remark.f90:79:7: remark: loop not vectorized: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
51-
! ANALYSIS-REGEX-LOOP-ONLY: Unknown data dependence. Memory location is the same as accessed at optimization-remark.f90:78:7 [-Rpass-analysis=loop-vectorize]
50+
! ANALYSIS-REGEX-LOOP-ONLY: optimization-remark.f90:74:7: remark: loop not vectorized: unsafe dependent memory operations in loop
5251
! ANALYSIS-REGEX-LOOP-ONLY-NOT: remark: {{.*}}: IR instruction count changed from {{[0-9]+}} to {{[0-9]+}}; Delta: {{-?[0-9]+}} [-Rpass-analysis=size-info]
5352

54-
! PASS: optimization-remark.f90:77:7: remark: hoisting load [-Rpass=licm]
55-
! PASS: optimization-remark.f90:83:5: remark: Loop deleted because it is invariant [-Rpass=loop-delete]
53+
! PASS: optimization-remark.f90:79:5: remark: Loop deleted because it is invariant [-Rpass=loop-delete]
5654

57-
! MISSED: optimization-remark.f90:77:7: remark: failed to hoist load with loop-invariant address because load is conditionally executed [-Rpass-missed=licm]
58-
! MISSED: optimization-remark.f90:76:4: remark: loop not vectorized [-Rpass-missed=loop-vectorize]
59-
! MISSED-NOT: optimization-remark.f90:79:7: remark: loop not vectorized: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
55+
! MISSED: optimization-remark.f90:73:7: remark: failed to hoist load with loop-invariant address
56+
! MISSED: optimization-remark.f90:72:4: remark: loop not vectorized [-Rpass-missed=loop-vectorize]
57+
! MISSED-NOT: optimization-remark.f90:75:7: remark: loop not vectorized: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
6058
! MISSED-NOT: Unknown data dependence. Memory location is the same as accessed at optimization-remark.f90:78:7 [-Rpass-analysis=loop-vectorize]
6159

62-
! ANALYSIS: optimization-remark.f90:79:7: remark: loop not vectorized: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
63-
! ANALYSIS: Unknown data dependence. Memory location is the same as accessed at optimization-remark.f90:78:7 [-Rpass-analysis=loop-vectorize]
64-
! ANALYSIS: remark: {{.*}}: IR instruction count changed from {{[0-9]+}} to {{[0-9]+}}; Delta: {{-?[0-9]+}} [-Rpass-analysis=size-info]
65-
! ANALYSIS-NOT: optimization-remark.f90:77:7: remark: failed to hoist load with loop-invariant address because load is conditionally executed [-Rpass-missed=licm]
60+
! ANALYSIS: optimization-remark.f90:74:7: remark: loop not vectorized: unsafe dependent memory operations in loop.
61+
! ANALYSIS: remark: {{.*}} instructions in function [-Rpass-analysis=asm-printer]
6662

6763
subroutine swap_real(a1, a2)
6864
implicit none

flang/test/Fir/basic-program.fir

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ func.func @_QQmain() {
5757

5858
// PASSES-NEXT: 'func.func' Pipeline
5959
// PASSES-NEXT: PolymorphicOpConversion
60+
61+
// PASSES-NEXT: AddAliasTags
62+
63+
// PASSES-NEXT: 'func.func' Pipeline
6064
// PASSES-NEXT: CFGConversion
6165

6266
// PASSES-NEXT: SCFToControlFlow

flang/tools/tco/tco.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ compileFIR(const mlir::PassPipelineCLParser &passPipeline) {
120120
return mlir::failure();
121121
} else {
122122
MLIRToLLVMPassPipelineConfig config(llvm::OptimizationLevel::O2);
123+
config.AliasAnalysis = true; // enabled when optimizing for speed
123124
if (codeGenLLVM) {
124125
// Run only CodeGen passes.
125126
fir::createDefaultFIRCodeGenPassPipeline(pm, config);

0 commit comments

Comments
 (0)