[llvm] 4ff5e81 - [RISCV] Enable MachineOutliner by default under -Oz for RISCV
via llvm-commits
llvm-commits at lists.llvm.org
Fri May 6 02:38:33 PDT 2022
Author: wangpc
Date: 2022-05-06T17:37:45+08:00
New Revision: 4ff5e8184c665d7de6023a174fd132b20ccb8a40
URL: https://github.com/llvm/llvm-project/commit/4ff5e8184c665d7de6023a174fd132b20ccb8a40
DIFF: https://github.com/llvm/llvm-project/commit/4ff5e8184c665d7de6023a174fd132b20ccb8a40.diff
LOG: [RISCV] Enable MachineOutliner by default under -Oz for RISCV
Enable default outlining when the function has the minsize attribute.
`addr-label.ll` crashed after enabling this, so a barrier is added before
instruction selection as a workaround.
Reviewed By: luismarques
Differential Revision: https://reviews.llvm.org/D122213
Added:
Modified:
llvm/lib/Target/RISCV/CMakeLists.txt
llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
llvm/lib/Target/RISCV/RISCVInstrInfo.h
llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
llvm/test/CodeGen/RISCV/O3-pipeline.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/CMakeLists.txt b/llvm/lib/Target/RISCV/CMakeLists.txt
index 87a6d4dbdf103..1e706a4b8dfb0 100644
--- a/llvm/lib/Target/RISCV/CMakeLists.txt
+++ b/llvm/lib/Target/RISCV/CMakeLists.txt
@@ -47,6 +47,7 @@ add_llvm_target(RISCVCodeGen
Analysis
AsmPrinter
Core
+ IPO
CodeGen
MC
RISCVDesc
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
index 0491844a98f82..5c35fa964480a 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
@@ -1196,6 +1196,11 @@ enum MachineOutlinerConstructionID {
MachineOutlinerDefault
};
+bool RISCVInstrInfo::shouldOutlineFromFunctionByDefault(
+ MachineFunction &MF) const {
+ return MF.getFunction().hasMinSize();
+}
+
outliner::OutlinedFunction RISCVInstrInfo::getOutliningCandidateInfo(
std::vector<outliner::Candidate> &RepeatedSequenceLocs) const {
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.h b/llvm/lib/Target/RISCV/RISCVInstrInfo.h
index ac25fdb5e2ae9..627efb02a059b 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.h
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.h
@@ -135,6 +135,8 @@ class RISCVInstrInfo : public RISCVGenInstrInfo {
virtual bool isMBBSafeToOutlineFrom(MachineBasicBlock &MBB,
unsigned &Flags) const override;
+ bool shouldOutlineFromFunctionByDefault(MachineFunction &MF) const override;
+
// Calculate target-specific information for a set of outlining candidates.
outliner::OutlinedFunction getOutliningCandidateInfo(
std::vector<outliner::Candidate> &RepeatedSequenceLocs) const override;
diff --git a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
index 0a4cbd4833c9f..6bf670b20f1a6 100644
--- a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
+++ b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
@@ -33,6 +33,7 @@
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Support/FormattedStream.h"
#include "llvm/Target/TargetOptions.h"
+#include "llvm/Transforms/IPO.h"
using namespace llvm;
static cl::opt<bool> EnableRedundantCopyElimination(
@@ -80,6 +81,7 @@ RISCVTargetMachine::RISCVTargetMachine(const Target &T, const Triple &TT,
// RISC-V supports the MachineOutliner.
setMachineOutliner(true);
+ setSupportsDefaultOutlining(true);
}
const RISCVSubtarget *
@@ -141,6 +143,7 @@ class RISCVPassConfig : public TargetPassConfig {
}
void addIRPasses() override;
+ bool addPreISel() override;
bool addInstSelector() override;
bool addIRTranslator() override;
bool addLegalizeMachineIR() override;
@@ -167,6 +170,16 @@ void RISCVPassConfig::addIRPasses() {
TargetPassConfig::addIRPasses();
}
+bool RISCVPassConfig::addPreISel() {
+ if (TM->getOptLevel() != CodeGenOpt::None) {
+ // Add a barrier before instruction selection so that we will not get
+ // deleted block address after enabling default outlining. See D99707 for
+ // more details.
+ addPass(createBarrierNoopPass());
+ }
+ return false;
+}
+
bool RISCVPassConfig::addInstSelector() {
addPass(createRISCVISelDag(getRISCVTargetMachine()));
diff --git a/llvm/test/CodeGen/RISCV/O3-pipeline.ll b/llvm/test/CodeGen/RISCV/O3-pipeline.ll
index e80ff19f27a8f..89b14bef9bce3 100644
--- a/llvm/test/CodeGen/RISCV/O3-pipeline.ll
+++ b/llvm/test/CodeGen/RISCV/O3-pipeline.ll
@@ -60,9 +60,12 @@
; CHECK-NEXT: CodeGen Prepare
; CHECK-NEXT: Dominator Tree Construction
; CHECK-NEXT: Exception handling preparation
+; CHECK-NEXT: A No-Op Barrier Pass
+; CHECK-NEXT: FunctionPass Manager
; CHECK-NEXT: Safe Stack instrumentation pass
; CHECK-NEXT: Insert stack protectors
; CHECK-NEXT: Module Verifier
+; CHECK-NEXT: Dominator Tree Construction
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
; CHECK-NEXT: Function Alias Analysis Results
; CHECK-NEXT: Natural Loop Information
@@ -151,6 +154,8 @@
; CHECK-NEXT: Contiguously Lay Out Funclets
; CHECK-NEXT: StackMap Liveness Analysis
; CHECK-NEXT: Live DEBUG_VALUE analysis
+; CHECK-NEXT: Machine Outliner
+; CHECK-NEXT: FunctionPass Manager
; CHECK-NEXT: RISCV pseudo instruction expansion pass
; CHECK-NEXT: RISCV atomic pseudo instruction expansion pass
; CHECK-NEXT: Lazy Machine Block Frequency Analysis
More information about the llvm-commits
mailing list