diff options
author | Lang Hames <lhames@gmail.com> | 2014-12-02 21:36:24 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2014-12-02 21:36:24 +0000 |
commit | a7395bf49bfe89ccae612ac77fc400b1f5fa301f (patch) | |
tree | 9bcf2dfa8964ee80fdd3b0deb285b4e3b21c9029 /llvm/lib | |
parent | be40b2f1b25c655412f4a90536ffa4d066f82834 (diff) | |
download | bcm5719-llvm-a7395bf49bfe89ccae612ac77fc400b1f5fa301f.tar.gz bcm5719-llvm-a7395bf49bfe89ccae612ac77fc400b1f5fa301f.zip |
[AArch64][Stackmaps] Optimize stackmap shadows on AArch64.
Reduce the number of nops emitted for stackmap shadows on AArch64 by counting
non-stackmap instructions up to the next branch target towards the requested
shadow.
<rdar://problem/14959522>
llvm-svn: 223156
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp index 8bee4f51351..08ee687d84a 100644 --- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp +++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp @@ -381,8 +381,23 @@ void AArch64AsmPrinter::LowerSTACKMAP(MCStreamer &OutStreamer, StackMaps &SM, unsigned NumNOPBytes = MI.getOperand(1).getImm(); SM.recordStackMap(MI); - // Emit padding. assert(NumNOPBytes % 4 == 0 && "Invalid number of NOP bytes requested!"); + + // Scan ahead to trim the shadow. + const MachineBasicBlock &MBB = *MI.getParent(); + MachineBasicBlock::const_iterator MII(MI); + ++MII; + while (NumNOPBytes > 0) { + if (MII == MBB.end() || MII->isCall() || + MII->getOpcode() == AArch64::DBG_VALUE || + MII->getOpcode() == TargetOpcode::PATCHPOINT || + MII->getOpcode() == TargetOpcode::STACKMAP) + break; + ++MII; + NumNOPBytes -= 4; + } + + // Emit nops. for (unsigned i = 0; i < NumNOPBytes; i += 4) EmitToStreamer(OutStreamer, MCInstBuilder(AArch64::HINT).addImm(0)); } |