[PATCH] D46671: Use iteration instead of recursion in CFIInserter

Sanjoy Das via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri May 11 08:58:38 PDT 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rL332101: Use iteration instead of recursion in CFIInserter (authored by sanjoy, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D46671?vs=146153&id=146337#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D46671

Files:
  llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp
  llvm/trunk/test/CodeGen/X86/cfi-inserter-cfg-with-merge.mir


Index: llvm/trunk/test/CodeGen/X86/cfi-inserter-cfg-with-merge.mir
===================================================================
--- llvm/trunk/test/CodeGen/X86/cfi-inserter-cfg-with-merge.mir
+++ llvm/trunk/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
+...
Index: llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp
===================================================================
--- llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp
+++ llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp
@@ -151,7 +151,6 @@
   // 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::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<MachineBasicBlock *, 4> 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 @@
   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";
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D46671.146337.patch
Type: text/x-patch
Size: 3517 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180511/a115dcf0/attachment.bin>


More information about the llvm-commits mailing list