From 82105e2a7d6a06db3a73c53a76840df7cfe7c28b Mon Sep 17 00:00:00 2001 From: Sanjoy Das Date: Fri, 11 May 2018 15:54:46 +0000 Subject: [PATCH] Use iteration instead of recursion in CFIInserter Summary: This recursive step can overflow the stack. Reviewers: djokov, petarj Subscribers: mcrosier, jlebar, bixia, llvm-commits Differential Revision: https://reviews.llvm.org/D46671 llvm-svn: 332101 --- llvm/lib/CodeGen/CFIInstrInserter.cpp | 41 ++++++++++++------- .../X86/cfi-inserter-cfg-with-merge.mir | 17 ++++++++ 2 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 llvm/test/CodeGen/X86/cfi-inserter-cfg-with-merge.mir diff --git a/llvm/lib/CodeGen/CFIInstrInserter.cpp b/llvm/lib/CodeGen/CFIInstrInserter.cpp index a73826920506..00ebf63fc174 100644 --- a/llvm/lib/CodeGen/CFIInstrInserter.cpp +++ b/llvm/lib/CodeGen/CFIInstrInserter.cpp @@ -151,7 +151,6 @@ void CFIInstrInserter::calculateCFAInfo(MachineFunction &MF) { // information. for (MachineBasicBlock &MBB : MF) { if (MBBVector[MBB.getNumber()].Processed) continue; - calculateOutgoingCFAInfo(MBBVector[MBB.getNumber()]); updateSuccCFAInfo(MBBVector[MBB.getNumber()]); } } @@ -222,14 +221,25 @@ void CFIInstrInserter::calculateOutgoingCFAInfo(MBBCFAInfo &MBBInfo) { } void CFIInstrInserter::updateSuccCFAInfo(MBBCFAInfo &MBBInfo) { - for (MachineBasicBlock *Succ : MBBInfo.MBB->successors()) { - MBBCFAInfo &SuccInfo = MBBVector[Succ->getNumber()]; - if (SuccInfo.Processed) continue; - SuccInfo.IncomingCFAOffset = MBBInfo.OutgoingCFAOffset; - SuccInfo.IncomingCFARegister = MBBInfo.OutgoingCFARegister; - calculateOutgoingCFAInfo(SuccInfo); - updateSuccCFAInfo(SuccInfo); - } + SmallVector Stack; + Stack.push_back(MBBInfo.MBB); + + do { + MachineBasicBlock *Current = Stack.pop_back_val(); + MBBCFAInfo &CurrentInfo = MBBVector[Current->getNumber()]; + if (CurrentInfo.Processed) + continue; + + calculateOutgoingCFAInfo(CurrentInfo); + for (auto *Succ : CurrentInfo.MBB->successors()) { + MBBCFAInfo &SuccInfo = MBBVector[Succ->getNumber()]; + if (!SuccInfo.Processed) { + SuccInfo.IncomingCFAOffset = CurrentInfo.OutgoingCFAOffset; + SuccInfo.IncomingCFARegister = CurrentInfo.OutgoingCFARegister; + Stack.push_back(Succ); + } + } + } while (!Stack.empty()); } bool CFIInstrInserter::insertCFIInstrs(MachineFunction &MF) { @@ -282,17 +292,18 @@ bool CFIInstrInserter::insertCFIInstrs(MachineFunction &MF) { return InsertedCFIInstr; } -void CFIInstrInserter::report(const MBBCFAInfo &Pred, - const MBBCFAInfo &Succ) { +void CFIInstrInserter::report(const MBBCFAInfo &Pred, const MBBCFAInfo &Succ) { errs() << "*** Inconsistent CFA register and/or offset between pred and succ " "***\n"; - errs() << "Pred: " << Pred.MBB->getName() + errs() << "Pred: " << Pred.MBB->getName() << " #" << Pred.MBB->getNumber() + << " in " << Pred.MBB->getParent()->getName() << " outgoing CFA Reg:" << Pred.OutgoingCFARegister << "\n"; - errs() << "Pred: " << Pred.MBB->getName() + errs() << "Pred: " << Pred.MBB->getName() << " #" << Pred.MBB->getNumber() + << " in " << Pred.MBB->getParent()->getName() << " outgoing CFA Offset:" << Pred.OutgoingCFAOffset << "\n"; - errs() << "Succ: " << Succ.MBB->getName() + errs() << "Succ: " << Succ.MBB->getName() << " #" << Succ.MBB->getNumber() << " incoming CFA Reg:" << Succ.IncomingCFARegister << "\n"; - errs() << "Succ: " << Succ.MBB->getName() + errs() << "Succ: " << Succ.MBB->getName() << " #" << Succ.MBB->getNumber() << " incoming CFA Offset:" << Succ.IncomingCFAOffset << "\n"; } diff --git a/llvm/test/CodeGen/X86/cfi-inserter-cfg-with-merge.mir b/llvm/test/CodeGen/X86/cfi-inserter-cfg-with-merge.mir new file mode 100644 index 000000000000..3ab321c0d314 --- /dev/null +++ b/llvm/test/CodeGen/X86/cfi-inserter-cfg-with-merge.mir @@ -0,0 +1,17 @@ +# RUN: llc -o - %s -mtriple=x86_64-- -verify-cfiinstrs -run-pass=cfi-instr-inserter + +--- | + define void @foo() { ret void } +... +--- +name: foo +body: | + bb.0: + JE_1 %bb.3, implicit $eflags + bb.1: + CFI_INSTRUCTION def_cfa_offset 24 + bb.2: + CFI_INSTRUCTION def_cfa_offset 8 + bb.3: + RET 0 +... -- 2.34.1