[llvm-commits] [llvm] r148520 - /llvm/trunk/lib/CodeGen/DwarfEHPrepare.cpp

Bill Wendling isanbard at gmail.com
Thu Jan 19 16:53:28 PST 2012


Author: void
Date: Thu Jan 19 18:53:28 2012
New Revision: 148520

URL: http://llvm.org/viewvc/llvm-project?rev=148520&view=rev
Log:
When lowering the 'resume' instruction, look to see if we can eliminate the
'insertvalue' instructions that recreate the structure returned by the
'landingpad' instruction. Because the 'insertvalue' instruction isn't supported
by FastISel, this can save a bit of time during -O0 compilation.

Modified:
    llvm/trunk/lib/CodeGen/DwarfEHPrepare.cpp

Modified: llvm/trunk/lib/CodeGen/DwarfEHPrepare.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/DwarfEHPrepare.cpp?rev=148520&r1=148519&r2=148520&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/DwarfEHPrepare.cpp (original)
+++ llvm/trunk/lib/CodeGen/DwarfEHPrepare.cpp Thu Jan 19 18:53:28 2012
@@ -101,10 +101,40 @@
          I = Resumes.begin(), E = Resumes.end(); I != E; ++I) {
     ResumeInst *RI = *I;
     BranchInst::Create(UnwindBB, RI->getParent());
-    ExtractValueInst *ExnObj = ExtractValueInst::Create(RI->getOperand(0),
-                                                        0, "exn.obj", RI);
+
+    Value *V = RI->getOperand(0);
+    Instruction *ExnObj = 0;
+    InsertValueInst *SelIVI = dyn_cast<InsertValueInst>(V);
+    LoadInst *SelLoad = 0;
+    InsertValueInst *ExcIVI = 0;
+    bool EraseIVIs = false;
+    if (SelIVI) {
+      if (SelIVI->getNumIndices() == 1 && *SelIVI->idx_begin() == 1) {
+        ExcIVI = dyn_cast<InsertValueInst>(SelIVI->getOperand(0));
+        if (ExcIVI && isa<UndefValue>(ExcIVI->getOperand(0)) &&
+            ExcIVI->getNumIndices() == 1 && *ExcIVI->idx_begin() == 0) {
+          ExnObj = cast<Instruction>(ExcIVI->getOperand(1));
+          SelLoad = dyn_cast<LoadInst>(SelIVI->getOperand(1));
+          EraseIVIs = true;
+        }
+      }
+    }
+
+    if (!ExnObj)
+      ExnObj = ExtractValueInst::Create(RI->getOperand(0), 0, "exn.obj", RI);
+
     PN->addIncoming(ExnObj, RI->getParent());
     RI->eraseFromParent();
+
+    if (EraseIVIs) {
+      if (SelIVI->getNumUses() == 0)
+        SelIVI->eraseFromParent();
+      if (ExcIVI->getNumUses() == 0)
+        ExcIVI->eraseFromParent();
+      if (SelLoad && SelLoad->getNumUses() == 0)
+        SelLoad->eraseFromParent();
+    }
+
     ++NumResumesLowered;
   }
 





More information about the llvm-commits mailing list