Don't mark a call as potentially throwing if the function it's calling has the
"nounwind" attribute.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86897 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/AsmPrinter/DwarfException.cpp b/lib/CodeGen/AsmPrinter/DwarfException.cpp
index b07c95b..693dcc2 100644
--- a/lib/CodeGen/AsmPrinter/DwarfException.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfException.cpp
@@ -490,7 +490,27 @@
     for (MachineBasicBlock::const_iterator MI = I->begin(), E = I->end();
          MI != E; ++MI) {
       if (!MI->isLabel()) {
-        SawPotentiallyThrowing |= MI->getDesc().isCall();
+        if (MI->getDesc().isCall()) {
+          // Don't mark a call as potentially throwing if the function it's
+          // calling is marked "nounwind".
+          bool DoesNotThrow = false;
+          for (unsigned OI = 0, OE = MI->getNumOperands(); OI != OE; ++OI) {
+            const MachineOperand &MO = MI->getOperand(OI);
+
+            if (MO.isGlobal()) {
+              if (Function *F = dyn_cast<Function>(MO.getGlobal())) {
+                if (F->doesNotThrow()) {
+                  DoesNotThrow = true;
+                  break;
+                }
+              }
+            }
+          }
+
+          if (!DoesNotThrow)
+            SawPotentiallyThrowing = true;
+        }
+
         continue;
       }