From 48eb2bc608e2db4258f9a5432be6458b33e8f551 Mon Sep 17 00:00:00 2001 From: Andrzej Warzynski Date: Fri, 17 Jun 2022 13:08:42 +0000 Subject: [PATCH] [flang][driver] Use `-O{0|1|2|3}` to define LLVM backend pass pipeline Support for optimisation flags in LLVM Flang was originally added in https://reviews.llvm.org/D128043. That patch focused on LLVM middle-end/optimisation pipelines. With this patch, Flang will additionally configure LLVM backend pass pipelines accordingly. This behavior is consistent with Clang. New hook is added to translate compiler optimisation flags (e.g. `-O3`) into backend optimisation level: `getCGOptLevel`. Identical hooks are available in Clang and LLVM. In other words, the meaning of these optimisation flags remains consistent with other sub-projects that use LLVM backends. Differential Revision: https://reviews.llvm.org/D128050 --- flang/lib/Frontend/FrontendActions.cpp | 25 ++++++++++++++++--- .../test/Driver/default-backend-pipelines.f90 | 25 +++++++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 flang/test/Driver/default-backend-pipelines.f90 diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index ae7150900ecf..c53d9f2347fa 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -517,6 +517,22 @@ void CodeGenAction::generateLLVMIR() { } } +static llvm::CodeGenOpt::Level +getCGOptLevel(const Fortran::frontend::CodeGenOptions &opts) { + switch (opts.OptimizationLevel) { + default: + llvm_unreachable("Invalid optimization level!"); + case 0: + return llvm::CodeGenOpt::None; + case 1: + return llvm::CodeGenOpt::Less; + case 2: + return llvm::CodeGenOpt::Default; + case 3: + return llvm::CodeGenOpt::Aggressive; + } +} + void CodeGenAction::setUpTargetMachine() { CompilerInstance &ci = this->getInstance(); @@ -535,9 +551,12 @@ void CodeGenAction::setUpTargetMachine() { assert(theTarget && "Failed to create Target"); // Create `TargetMachine` - tm.reset(theTarget->createTargetMachine(theTriple, /*CPU=*/"", - /*Features=*/"", - llvm::TargetOptions(), llvm::None)); + llvm::CodeGenOpt::Level OptLevel = + getCGOptLevel(ci.getInvocation().getCodeGenOpts()); + tm.reset(theTarget->createTargetMachine( + theTriple, /*CPU=*/"", + /*Features=*/"", llvm::TargetOptions(), /*Reloc::Model=*/llvm::None, + /*CodeModel::Model=*/llvm::None, OptLevel)); assert(tm && "Failed to create TargetMachine"); } diff --git a/flang/test/Driver/default-backend-pipelines.f90 b/flang/test/Driver/default-backend-pipelines.f90 new file mode 100644 index 000000000000..7d233bb751bc --- /dev/null +++ b/flang/test/Driver/default-backend-pipelines.f90 @@ -0,0 +1,25 @@ +! Verify that`-O{n}` is indeed taken into account when definining the LLVM backend pass pipeline. + +! REQUIRES: aarch64-registered-target + +!----------- +! RUN LINES +!----------- +! RUN: %flang_fc1 -S -O2 %s -triple aarch64-unknown-linux-gnu -mllvm -debug-pass=Structure -o /dev/null 2>&1 | FileCheck %s --check-prefix=CHECK-O2 +! RUN: %flang_fc1 -S -O3 %s -triple aarch64-unknown-linux-gnu -mllvm -debug-pass=Structure -o /dev/null 2>&1 | FileCheck %s --check-prefix=CHECK-O3 + +!----------------------- +! EXPECTED OUTPUT +!----------------------- +! CHECK-O2-NOT: SVE intrinsics optimizations + +! CHECK-O3: SVE intrinsics optimizations + +!------- +! INPUT +!------- +subroutine simple_loop + integer :: i + do i=1,5 + end do +end subroutine