Skip to content

Commit 03ceb76

Browse files
alexey-bataevgithub-actions[bot]
authored andcommitted
Automerge: [Flang][Pass]Disable memory intrinsics expansions
Patch disables memory intrinsics expansion, enabled by default in llvm/llvm-project#168622. This patch does the same in clang, but not in flang. The expansion causes massive perf regressions, up to 2x times in fortran code. Reviewers: jeanPerier, vzakhari Reviewed By: vzakhari Pull Request: llvm/llvm-project#171650
2 parents 30134a2 + deac791 commit 03ceb76

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

flang/lib/Frontend/FrontendActions.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,11 @@
4242
#include "clang/Driver/DriverDiagnostic.h"
4343
#include "llvm/ADT/SmallString.h"
4444
#include "llvm/ADT/StringRef.h"
45+
#include "llvm/Analysis/RuntimeLibcallInfo.h"
4546
#include "llvm/Analysis/TargetLibraryInfo.h"
4647
#include "llvm/Analysis/TargetTransformInfo.h"
4748
#include "llvm/Bitcode/BitcodeWriterPass.h"
49+
#include "llvm/CodeGen/LibcallLoweringInfo.h"
4850
#include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
4951
#include "llvm/IR/LLVMRemarkStreamer.h"
5052
#include "llvm/IR/LegacyPassManager.h"
@@ -902,6 +904,9 @@ static void generateMachineCodeOrAssemblyImpl(clang::DiagnosticsEngine &diags,
902904
llvm::TargetLibraryInfoImpl *tlii =
903905
llvm::driver::createTLII(triple, codeGenOpts.getVecLib());
904906
codeGenPasses.add(new llvm::TargetLibraryInfoWrapperPass(*tlii));
907+
codeGenPasses.add(new llvm::RuntimeLibraryInfoWrapper(
908+
triple, tm.Options.ExceptionModel, tm.Options.FloatABIType,
909+
tm.Options.EABIVersion, tm.Options.MCOptions.ABIName, tm.Options.VecLib));
905910

906911
llvm::CodeGenFileType cgft = (act == BackendActionTy::Backend_EmitAssembly)
907912
? llvm::CodeGenFileType::AssemblyFile
@@ -1009,6 +1014,14 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) {
10091014
llvm::TargetLibraryInfoImpl *tlii =
10101015
llvm::driver::createTLII(triple, opts.getVecLib());
10111016
fam.registerPass([&] { return llvm::TargetLibraryAnalysis(*tlii); });
1017+
mam.registerPass([&] {
1018+
return llvm::RuntimeLibraryAnalysis(
1019+
triple, targetMachine->Options.ExceptionModel,
1020+
targetMachine->Options.FloatABIType, targetMachine->Options.EABIVersion,
1021+
targetMachine->Options.MCOptions.ABIName,
1022+
targetMachine->Options.VecLib);
1023+
});
1024+
mam.registerPass([&] { return llvm::LibcallLoweringModuleAnalysis(); });
10121025

10131026
// Register all the basic analyses with the managers.
10141027
pb.registerModuleAnalyses(mam);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
! REQUIRES: aarch64-registered-target
2+
3+
! RUN: %flang_fc1 -S -O1 %s -triple aarch64-linux-gnu -mllvm -debug-pass=Structure -o %t_O0 2>&1 | FileCheck %s
4+
! RUN: %flang_fc1 -S -O2 %s -triple aarch64-linux-gnu -mllvm -debug-pass=Structure -o %t_O2 2>&1 | FileCheck %s
5+
! RUN: %flang_fc1 -S -O3 %s -triple aarch64-linux-gnu -mllvm -debug-pass=Structure -o %t_O3 2>&1 | FileCheck %s
6+
! RUN: FileCheck --input-file=%t_O0 --check-prefix=CALL %s
7+
! RUN: FileCheck --input-file=%t_O2 --check-prefix=CALL %s
8+
! RUN: FileCheck --input-file=%t_O3 --check-prefix=CALL %s
9+
10+
! CHECK: Target Library Information
11+
! CHECK: Runtime Library Function Analysis
12+
! CHECK: Library Function Lowering Analysis
13+
14+
! CALL: {{callq|bl}} memcpy
15+
program memcpy_test
16+
implicit none
17+
integer, parameter :: n = 100
18+
real :: a(n), b(n)
19+
integer :: i
20+
21+
! Initialize array a
22+
do i = 1, n
23+
a(i) = real(i)
24+
end do
25+
26+
! Array assignment - this should generate memcpy
27+
b = a
28+
29+
! Use array b to prevent optimization
30+
print *, b(1), b(n)
31+
32+
end program memcpy_test
33+

0 commit comments

Comments
 (0)