From 2a127a7d652f157393884e9c5316efb526b4de39 Mon Sep 17 00:00:00 2001 From: YongKang Zhu Date: Wed, 3 Sep 2025 14:49:18 -0700 Subject: [PATCH] [BOLT][AArch64][instr] Remove instructions on saving and restoring NZCV Remove the `NZCV` save and restore instructions from instrumentation sequence because the instructions used for getting counter address, counter increment and stack push/pop won't impact `NZCV`. And with this we can use `X1` to do counter increment and then the push and pop of `X2` can be removed. --- bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp index fcb645f661ef0..7200cbe611db3 100644 --- a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp +++ b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp @@ -2517,21 +2517,17 @@ class AArch64MCPlusBuilder : public MCPlusBuilder { createInstrIncMemory(const MCSymbol *Target, MCContext *Ctx, bool IsLeaf, unsigned CodePointerSize) const override { unsigned int I = 0; - InstructionListType Instrs(10); + InstructionListType Instrs(6); createPushRegisters(Instrs[I++], AArch64::X0, AArch64::X1); - getSystemFlag(Instrs[I++], AArch64::X1); InstructionListType Addr = materializeAddress(Target, Ctx, AArch64::X0); assert(Addr.size() == 2 && "Invalid Addr size"); std::copy(Addr.begin(), Addr.end(), Instrs.begin() + I); I += Addr.size(); - storeReg(Instrs[I++], AArch64::X2, AArch64::SP); - InstructionListType Insts = createIncMemory(AArch64::X0, AArch64::X2); + InstructionListType Insts = createIncMemory(AArch64::X0, AArch64::X1); assert(Insts.size() == 2 && "Invalid Insts size"); std::copy(Insts.begin(), Insts.end(), Instrs.begin() + I); I += Insts.size(); - loadReg(Instrs[I++], AArch64::X2, AArch64::SP); - setSystemFlag(Instrs[I++], AArch64::X1); createPopRegisters(Instrs[I++], AArch64::X0, AArch64::X1); return Instrs; }