Skip to content

Commit 6000017

Browse files
committed
[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.
1 parent cfad8bf commit 6000017

File tree

8 files changed

+62
-21
lines changed

8 files changed

+62
-21
lines changed

clang/lib/Driver/ToolChains/Flang.cpp

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

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

flang/include/flang/Tools/CLOptions.inc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,11 +157,11 @@ inline void addDebugFoundationPass(mlir::PassManager &pm) {
157157
[&]() { return fir::createAddDebugFoundationPass(); });
158158
}
159159

160-
inline void addFIRToLLVMPass(
161-
mlir::PassManager &pm, llvm::OptimizationLevel optLevel = defaultOptLevel) {
160+
inline void addFIRToLLVMPass(mlir::PassManager &pm,
161+
llvm::OptimizationLevel optLevel = defaultOptLevel, bool applyTbaa = true) {
162162
fir::FIRToLLVMPassOptions options;
163163
options.ignoreMissingTypeDescriptors = ignoreMissingTypeDescriptors;
164-
options.applyTBAA = optLevel.isOptimizingForSpeed();
164+
options.applyTBAA = applyTbaa;
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.OptLevel, config.AliasAnalysis);
315315
}
316316

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

flang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -242,10 +242,24 @@ 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+
bool aliasAnalysis = false;
246+
bool noAliasAnalysis = false;
247+
if (auto *arg =
248+
args.getLastArg(clang::driver::options::OPT_falias_analysis,
249+
clang::driver::options::OPT_fno_alias_analysis)) {
250+
if (arg->getOption().matches(clang::driver::options::OPT_falias_analysis))
251+
aliasAnalysis = true;
252+
else
253+
noAliasAnalysis = true;
254+
}
255+
opts.AliasAnalysis = 0;
256+
if (opts.OptimizationLevel > 0) {
257+
if (!noAliasAnalysis)
258+
opts.AliasAnalysis = 1;
259+
} else {
260+
if (aliasAnalysis)
261+
opts.AliasAnalysis = 1;
262+
}
249263

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

flang/test/Driver/falias-analysis.f90

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44
! RUN: %flang -c -emit-llvm -falias-analysis %s -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-AA --check-prefix=CHECK-ALL
55
! RUN: %flang -c -emit-llvm -falias-analysis -fno-alias-analysis %s -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-NOAA --check-prefix=CHECK-ALL
66
! RUN: %flang -c -emit-llvm %s -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-NOAA --check-prefix=CHECK-ALL
7+
! RUN: %flang -c -emit-llvm -Ofast %s -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-AA --check-prefix=CHECK-ALL
8+
! RUN: %flang -c -emit-llvm -Ofast -fno-alias-analysis %s -o - | llvm-dis | FileCheck %s --check-prefix=CHECK-NOAA --check-prefix=CHECK-ALL
79

810
! RUN: %flang -fc1 -emit-llvm -falias-analysis %s -o - | FileCheck %s --check-prefix=CHECK-AA --check-prefix=CHECK-ALL
911
! RUN: %flang -fc1 -emit-llvm -falias-analysis -fno-alias-analysis %s -o - | FileCheck %s --check-prefix=CHECK-NOAA --check-prefix=CHECK-ALL
1012
! RUN: %flang -fc1 -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK-NOAA --check-prefix=CHECK-ALL
13+
! RUN: %flang -fc1 -emit-llvm -O3 %s -o - | FileCheck %s --check-prefix=CHECK-AA --check-prefix=CHECK-ALL
14+
! RUN: %flang -fc1 -emit-llvm -O3 -fno-alias-analysis %s -o - | FileCheck %s --check-prefix=CHECK-NOAA --check-prefix=CHECK-ALL
1115

1216
subroutine simple(a)
1317
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:73:7: remark: loop not vectorized: cannot identify array bounds [-Rpass-analysis=loop-vectorize]
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 move load with loop-invariant address because the loop may invalidate its value [-Rpass-missed=licm]
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)