Loosen up the requirements in the Horrible Hack(tm) to include all selectors
authorBill Wendling <isanbard@gmail.com>
Thu, 24 Jun 2010 18:49:10 +0000 (18:49 +0000)
committerBill Wendling <isanbard@gmail.com>
Thu, 24 Jun 2010 18:49:10 +0000 (18:49 +0000)
which don't have a catch-all associated with them not just clean-ups. This fixes
the SingleSource/Benchmarks/Shootout-C++/except.cpp testcase that broke because
of my change r105902.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106772 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/DwarfEHPrepare.cpp

index 6673931625806d794a12c3d995942c84ee7e6c1e..651740d377fd30439ad11af28567c54b875955c6 100644 (file)
@@ -89,7 +89,7 @@ namespace {
     /// initializer instead.
     bool CleanupSelectors();
 
-    bool IsACleanupSelector(IntrinsicInst *);
+    bool HasCatchAllInSelector(IntrinsicInst *);
 
     /// FindAllCleanupSelectors - Find all eh.selector calls that are clean-ups.
     void FindAllCleanupSelectors(SmallPtrSet<IntrinsicInst*, 32> &Sels);
@@ -188,34 +188,14 @@ FunctionPass *llvm::createDwarfEHPass(const TargetMachine *tm, bool fast) {
   return new DwarfEHPrepare(tm, fast);
 }
 
-/// IsACleanupSelector - Return true if the intrinsic instruction is a clean-up
-/// selector instruction.
-bool DwarfEHPrepare::IsACleanupSelector(IntrinsicInst *II) {
-  unsigned NumOps = II->getNumOperands();
-  bool IsCleanUp = (NumOps == 3);
-
-  if (IsCleanUp)
-    return true;
-
-  if (ConstantInt *CI = dyn_cast<ConstantInt>(II->getOperand(3))) {
-    unsigned Val = CI->getZExtValue();
-
-    if (Val == 0 || Val + 3 == NumOps) {
-      // If the value is 0 or the selector has only filters in it, then it's
-      // a cleanup.
-      return true;
-    } else {
-      assert(Val + 3 < NumOps && "Ill-formed eh.selector!");
-
-      if (Val + 4 == NumOps) {
-        if (ConstantInt *FinalVal =
-            dyn_cast<ConstantInt>(II->getOperand(NumOps - 1)))
-          return FinalVal->isZero();
-      }
-    }
-  }
+/// HasCatchAllInSelector - Return true if the intrinsic instruction has a
+/// catch-all.
+bool DwarfEHPrepare::HasCatchAllInSelector(IntrinsicInst *II) {
+  if (!EHCatchAllValue) return false;
 
-  return false;
+  unsigned OpIdx = II->getNumOperands() - 1;
+  GlobalVariable *GV = dyn_cast<GlobalVariable>(II->getOperand(OpIdx));
+  return GV == EHCatchAllValue;
 }
 
 /// FindAllCleanupSelectors - Find all eh.selector calls that are clean-ups.
@@ -229,7 +209,7 @@ FindAllCleanupSelectors(SmallPtrSet<IntrinsicInst*, 32> &Sels) {
     if (II->getParent()->getParent() != F)
       continue;
 
-    if (IsACleanupSelector(II))
+    if (!HasCatchAllInSelector(II))
       Sels.insert(II);
   }
 }
@@ -387,7 +367,7 @@ bool DwarfEHPrepare::HandleURoRInvokes() {
         // need to convert it to a 'catch-all'.
         for (SmallPtrSet<IntrinsicInst*, 8>::iterator
                SI = SelCalls.begin(), SE = SelCalls.end(); SI != SE; ++SI)
-          if (IsACleanupSelector(*SI))
+          if (!HasCatchAllInSelector(*SI))
               SelsToConvert.insert(*SI);
       }
     }