Perform the lowering only if there are invokes.
authorBill Wendling <isanbard@gmail.com>
Wed, 28 Sep 2011 20:29:45 +0000 (20:29 +0000)
committerBill Wendling <isanbard@gmail.com>
Wed, 28 Sep 2011 20:29:45 +0000 (20:29 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140719 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMSjLjLoweringPass.cpp

index a7dce3be4b8a207e5382e157a31913240eccb77b..e082bc6dd2a31a66e9265faa13165b4625ec6cff 100644 (file)
@@ -35,14 +35,14 @@ class ARMSjLjLowering : public MachineFunctionPass {
   LLVMContext *Context;
 
   MachineFunction *MF;
-  const Function *Fn;
+  const Function *F;
   const TargetLowering *TLI;
   const TargetInstrInfo *TII;
   const TargetRegisterInfo *TRI;
 
-  /// createFunctionContext - Create the function context on the stack. This
-  /// returns the nonnegative identifier representing it in the FrameInfo.
-  int createFunctionContext();
+  /// setupFunctionContext - Setup the function context on the stack. Some of
+  /// the fields were set by the SjLj EH prepare pass.
+  int setupFunctionContext();
 
 public:
   static char ID;
@@ -67,19 +67,29 @@ bool ARMSjLjLowering::runOnMachineFunction(MachineFunction &mf) {
   if (!EnableNewSjLjEHPrepare) return false;
 
   MF = &mf;
-  Fn = MF->getFunction();
-  Context = &Fn->getContext();
+  F = MF->getFunction();
+  Context = &F->getContext();
   TLI = MF->getTarget().getTargetLowering();
   TII = MF->getTarget().getInstrInfo();
   TRI = MF->getTarget().getRegisterInfo();
 
-  int FrameIdx = createFunctionContext(); (void)FrameIdx;
+  // Perform the lowering only if there are invokes.
+  bool HasInvokes = false;
+  for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB)
+    if (isa<InvokeInst>(BB->getTerminator())) {
+      HasInvokes = true;
+      break;
+    }
+
+  if (!HasInvokes) return false;
+
+  int FrameIdx = setupFunctionContext(); (void)FrameIdx;
 
   return true;
 }
 
-/// createFunctionContext - Create the function context on the stack.
-int ARMSjLjLowering::createFunctionContext() {
+/// setupFunctionContext - Create the function context on the stack.
+int ARMSjLjLowering::setupFunctionContext() {
   // struct _Unwind_FunctionContext {
   //   // next function in stack of handlers.
   //   struct _Unwind_FunctionContext *prev;