diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -517,6 +517,22 @@ } } +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 @@ 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 --- /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