From 5418b3d4c9af42cfd853919dab61328fe720a8ef Mon Sep 17 00:00:00 2001 From: Francis Visoiu Mistrih Date: Wed, 19 Jul 2017 23:47:32 +0000 Subject: [PATCH] [PEI] Add basic opt-remarks support Add optimization remarks support to the PrologueEpilogueInserter. For now, emit the stack size as an analysis remark, but more additions wrt shrink-wrapping may be added. https://reviews.llvm.org/D35645 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308556 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/PrologEpilogInserter.cpp | 13 +++++ .../AArch64/prologue-epilogue-remarks.mir | 57 ++++++++++++++++++ test/CodeGen/X86/O0-pipeline.ll | 2 + .../CodeGen/X86/prologue-epilogue-remarks.mir | 58 +++++++++++++++++++ 4 files changed, 130 insertions(+) create mode 100644 test/CodeGen/AArch64/prologue-epilogue-remarks.mir create mode 100644 test/CodeGen/X86/prologue-epilogue-remarks.mir diff --git a/lib/CodeGen/PrologEpilogInserter.cpp b/lib/CodeGen/PrologEpilogInserter.cpp index b437b5c0b00..9361a2a8b0e 100644 --- a/lib/CodeGen/PrologEpilogInserter.cpp +++ b/lib/CodeGen/PrologEpilogInserter.cpp @@ -25,6 +25,7 @@ #include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineLoopInfo.h" #include "llvm/CodeGen/MachineModuleInfo.h" +#include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/RegisterScavenging.h" @@ -98,6 +99,9 @@ private: // FrameIndexVirtualScavenging is used. bool FrameIndexEliminationScavenging; + // Emit remarks. + MachineOptimizationRemarkEmitter *ORE = nullptr; + void calculateCallFrameInfo(MachineFunction &Fn); void calculateSaveRestoreBlocks(MachineFunction &Fn); void doSpillCalleeSavedRegs(MachineFunction &MF); @@ -122,6 +126,7 @@ INITIALIZE_PASS_BEGIN(PEI, DEBUG_TYPE, "Prologue/Epilogue Insertion", false, INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo) INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree) INITIALIZE_PASS_DEPENDENCY(StackProtector) +INITIALIZE_PASS_DEPENDENCY(MachineOptimizationRemarkEmitterPass) INITIALIZE_PASS_END(PEI, DEBUG_TYPE, "Prologue/Epilogue Insertion & Frame Finalization", false, false) @@ -138,6 +143,7 @@ void PEI::getAnalysisUsage(AnalysisUsage &AU) const { AU.addPreserved(); AU.addPreserved(); AU.addRequired(); + AU.addRequired(); MachineFunctionPass::getAnalysisUsage(AU); } @@ -171,6 +177,7 @@ bool PEI::runOnMachineFunction(MachineFunction &Fn) { FrameIndexVirtualScavenging = TRI->requiresFrameIndexScavenging(Fn); FrameIndexEliminationScavenging = (RS && !FrameIndexVirtualScavenging) || TRI->requiresFrameIndexReplacementScavenging(Fn); + ORE = &getAnalysis().getORE(); // Calculate the MaxCallFrameSize and AdjustsStack variables for the // function's frame information. Also eliminates call frame pseudo @@ -938,6 +945,12 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) { int64_t StackSize = Offset - LocalAreaOffset; MFI.setStackSize(StackSize); NumBytesStackSpace += StackSize; + + MachineOptimizationRemarkAnalysis R( + DEBUG_TYPE, "StackSize", Fn.getFunction()->getSubprogram(), &Fn.front()); + R << ore::NV("NumStackBytes", static_cast(StackSize)) + << " stack bytes in function"; + ORE->emit(R); } /// insertPrologEpilogCode - Scan the function for modified callee saved diff --git a/test/CodeGen/AArch64/prologue-epilogue-remarks.mir b/test/CodeGen/AArch64/prologue-epilogue-remarks.mir new file mode 100644 index 00000000000..ed139875d26 --- /dev/null +++ b/test/CodeGen/AArch64/prologue-epilogue-remarks.mir @@ -0,0 +1,57 @@ +# RUN: llc -mtriple=aarch64-unknown-unknown -run-pass=prologepilog -pass-remarks-output=%t -pass-remarks-analysis=prologepilog -o /dev/null %s 2>&1 +# RUN: cat %t | FileCheck %s +... +--- +name: fun0 +stack: + - { id: 0, type: default, offset: 0, size: 8, alignment: 4 } +# CHECK: --- !Analysis +# CHECK-NEXT: Pass: prologepilog +# CHECK-NEXT: Name: StackSize +# CHECK-NEXT: Function: fun0 +# CHECK-NEXT: Args: +# CHECK-NEXT: - NumStackBytes: '16' +# CHECK-NEXT: - String: ' stack bytes in function' +# CHECK-NEXT: ... +constants: +body: | + bb.0: + RET_ReallyLR + +... +--- +name: fun1 +stack: + - { id: 0, type: default, offset: 0, size: 19, alignment: 4 } +# CHECK: --- !Analysis +# CHECK-NEXT: Pass: prologepilog +# CHECK-NEXT: Name: StackSize +# CHECK-NEXT: Function: fun1 +# CHECK-NEXT: Args: +# CHECK-NEXT: - NumStackBytes: '32' +# CHECK-NEXT: - String: ' stack bytes in function' +# CHECK-NEXT: ... +constants: +body: | + bb.0: + RET_ReallyLR + +... +--- +name: fun2 +stack: + - { id: 0, type: default, offset: 0, size: 1024, alignment: 4 } +# --- !Analysis +# CHECK: Pass: prologepilog +# CHECK-NEXT: Name: StackSize +# CHECK-NEXT: Function: fun2 +# CHECK-NEXT: Args: +# CHECK-NEXT: - NumStackBytes: '1040' +# CHECK-NEXT: - String: ' stack bytes in function' +# CHECK-NEXT: ... +constants: +body: | + bb.0: + RET_ReallyLR + +... diff --git a/test/CodeGen/X86/O0-pipeline.ll b/test/CodeGen/X86/O0-pipeline.ll index 5e375cc42e0..1f7415ee2af 100644 --- a/test/CodeGen/X86/O0-pipeline.ll +++ b/test/CodeGen/X86/O0-pipeline.ll @@ -42,6 +42,8 @@ ; CHECK-NEXT: Fast Register Allocator ; CHECK-NEXT: Bundle Machine CFG Edges ; CHECK-NEXT: X86 FP Stackifier +; CHECK-NEXT: Lazy Machine Block Frequency Analysis +; CHECK-NEXT: Machine Optimization Remark Emitter ; CHECK-NEXT: Prologue/Epilogue Insertion & Frame Finalization ; CHECK-NEXT: Post-RA pseudo instruction expansion pass ; CHECK-NEXT: X86 pseudo instruction expansion pass diff --git a/test/CodeGen/X86/prologue-epilogue-remarks.mir b/test/CodeGen/X86/prologue-epilogue-remarks.mir new file mode 100644 index 00000000000..a57305d80bf --- /dev/null +++ b/test/CodeGen/X86/prologue-epilogue-remarks.mir @@ -0,0 +1,58 @@ +# RUN: llc -mtriple=x86_64-unknown-unknown -run-pass=prologepilog -pass-remarks-output=%t -pass-remarks-analysis=prologepilog -o /dev/null %s 2>&1 +# RUN: cat %t | FileCheck %s +... +--- +name: fun0 +stack: + - { id: 0, type: default, offset: 0, size: 8, alignment: 4 } +# --- !Analysis +# CHECK: Pass: prologepilog +# CHECK-NEXT: Name: StackSize +# CHECK-NEXT: Function: fun0 +# CHECK-NEXT: Args: +# CHECK-NEXT: - NumStackBytes: '8' +# CHECK-NEXT: - String: ' stack bytes in function' +# CHECK-NEXT: ... + +constants: +body: | + bb.0: + RETQ + +... +--- +name: fun1 +stack: + - { id: 0, type: default, offset: 0, size: 19, alignment: 4 } +# --- !Analysis +# CHECK: Pass: prologepilog +# CHECK-NEXT: Name: StackSize +# CHECK-NEXT: Function: fun1 +# CHECK-NEXT: Args: +# CHECK-NEXT: - NumStackBytes: '20' +# CHECK-NEXT: - String: ' stack bytes in function' +# CHECK-NEXT: ... +constants: +body: | + bb.0: + RETQ + +... +--- +name: fun2 +stack: + - { id: 0, type: default, offset: 0, size: 1024, alignment: 8 } +# --- !Analysis +# CHECK: Pass: prologepilog +# CHECK-NEXT: Name: StackSize +# CHECK-NEXT: Function: fun2 +# CHECK-NEXT: Args: +# CHECK-NEXT: - NumStackBytes: '1024' +# CHECK-NEXT: - String: ' stack bytes in function' +# CHECK-NEXT: ... +constants: +body: | + bb.0: + RETQ + +... -- 2.40.0