From: Amara Emerson Date: Thu, 29 Apr 2021 06:16:54 +0000 (-0700) Subject: [GlobalISel][IRTranslator] Move line zero DebugLoc creation to constant translation... X-Git-Tag: llvmorg-14-init~8123 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=aa0b9200e8c5dea43c9ada2085a3061f4da70802;p=platform%2Fupstream%2Fllvm.git [GlobalISel][IRTranslator] Move line zero DebugLoc creation to constant translation. NFC. This is a compile time optimization. DILocation:get() is expensive to call, and we were calling it to create a line zero debug loc for *every* instruction we translated. We only really need to do this just before we build constants in the entry block, so I moved this code there. This reduces the LLVM -O0 codegen time of sqlite3 IR by around 0.7% instructions executed and by about ~2% in CPU time. We can probably do better with a more involved change, since the reason we need to create one for each new constant is because we're using the debug scope and inlined-at loc. If we just use a single instruction's scope and drop the inlined-at, we can just cache these and have them be free. --- diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 035b757..818c4c5 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -2842,13 +2842,6 @@ bool IRTranslator::valueIsSplit(const Value &V, bool IRTranslator::translate(const Instruction &Inst) { CurBuilder->setDebugLoc(Inst.getDebugLoc()); - // We only emit constants into the entry block from here. To prevent jumpy - // debug behaviour set the line to 0. - if (const DebugLoc &DL = Inst.getDebugLoc()) - EntryBuilder->setDebugLoc(DILocation::get( - Inst.getContext(), 0, 0, DL.getScope(), DL.getInlinedAt())); - else - EntryBuilder->setDebugLoc(DebugLoc()); auto &TLI = *MF->getSubtarget().getTargetLowering(); if (TLI.fallBackToDAGISel(Inst)) @@ -2865,6 +2858,15 @@ bool IRTranslator::translate(const Instruction &Inst) { } bool IRTranslator::translate(const Constant &C, Register Reg) { + // We only emit constants into the entry block from here. To prevent jumpy + // debug behaviour set the line to 0. + if (auto CurrInstDL = CurBuilder->getDL()) + EntryBuilder->setDebugLoc(DILocation::get(C.getContext(), 0, 0, + CurrInstDL.getScope(), + CurrInstDL.getInlinedAt())); + else + EntryBuilder->setDebugLoc(DebugLoc()); + if (auto CI = dyn_cast(&C)) EntryBuilder->buildConstant(Reg, *CI); else if (auto CF = dyn_cast(&C))