[llvm] r270314 - [SimplifyCFG] Remove cleanuppads which are empty except for calls to lifetime.end

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Fri May 20 22:12:33 PDT 2016


Author: majnemer
Date: Sat May 21 00:12:32 2016
New Revision: 270314

URL: http://llvm.org/viewvc/llvm-project?rev=270314&view=rev
Log:
[SimplifyCFG] Remove cleanuppads which are empty except for calls to lifetime.end

A cleanuppad is not cheap, they turn into many instructions and result
in additional spills and fills.  It is not worth keeping a cleanuppad
around if all it does is hold a lifetime.end instruction.

N.B.  We first try to merge the cleanuppad with another cleanuppad to
avoid dropping the lifetime and debug info markers.

Modified:
    llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
    llvm/trunk/test/Transforms/SimplifyCFG/empty-cleanuppad.ll

Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=270314&r1=270313&r2=270314&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Sat May 21 00:12:32 2016
@@ -3424,12 +3424,24 @@ static bool removeEmptyCleanup(CleanupRe
     // This isn't an empty cleanup.
     return false;
 
-  // Check that there are no other instructions except for debug intrinsics.
+  // Check that there are no other instructions except for benign intrinsics.
   BasicBlock::iterator I = CPInst->getIterator(), E = RI->getIterator();
-  while (++I != E)
-    if (!isa<DbgInfoIntrinsic>(I))
+  while (++I != E) {
+    auto *II = dyn_cast<IntrinsicInst>(I);
+    if (!II)
       return false;
 
+    Intrinsic::ID IntrinsicID = II->getIntrinsicID();
+    switch (IntrinsicID) {
+    case Intrinsic::dbg_declare:
+    case Intrinsic::dbg_value:
+    case Intrinsic::lifetime_end:
+      break;
+    default:
+      return false;
+    }
+  }
+
   // If the cleanup return we are simplifying unwinds to the caller, this will
   // set UnwindDest to nullptr.
   BasicBlock *UnwindDest = RI->getUnwindDest();
@@ -3567,10 +3579,10 @@ bool SimplifyCFGOpt::SimplifyCleanupRetu
   if (isa<UndefValue>(RI->getOperand(0)))
     return false;
 
-  if (removeEmptyCleanup(RI))
+  if (mergeCleanupPad(RI))
     return true;
 
-  if (mergeCleanupPad(RI))
+  if (removeEmptyCleanup(RI))
     return true;
 
   return false;

Modified: llvm/trunk/test/Transforms/SimplifyCFG/empty-cleanuppad.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyCFG/empty-cleanuppad.ll?rev=270314&r1=270313&r2=270314&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/SimplifyCFG/empty-cleanuppad.ll (original)
+++ llvm/trunk/test/Transforms/SimplifyCFG/empty-cleanuppad.ll Sat May 21 00:12:32 2016
@@ -404,6 +404,35 @@ catch.cont:
 return:                                           ; preds = %invoke.cont, %catch.cont
   ret void
 }
+; CHECK-LABEL: define i32 @f9()
+; CHECK: entry:
+; CHECK:   invoke void @"\01??1S2@@QEAA at XZ"(
+; CHECK-NOT:   cleanuppad
+; CHECK: catch.dispatch:
+; CHECK: }
+define i32 @f9() personality i32 (...)* @__CxxFrameHandler3 {
+entry:
+  %s = alloca i8, align 1
+  call void @llvm.lifetime.start(i64 1, i8* nonnull %s)
+  %bc = bitcast i8* %s to %struct.S2*
+  invoke void @"\01??1S2@@QEAA at XZ"(%struct.S2* %bc)
+          to label %try.cont unwind label %ehcleanup
+
+ehcleanup:
+  %cleanup.pad = cleanuppad within none []
+  call void @llvm.lifetime.end(i64 1, i8* nonnull %s)
+  cleanupret from %cleanup.pad unwind label %catch.dispatch
+
+catch.dispatch:
+  %catch.switch = catchswitch within none [label %catch] unwind to caller
+
+catch:
+  %catch.pad = catchpad within %catch.switch [i8* null, i32 0, i8* null]
+  catchret from %catch.pad to label %try.cont
+
+try.cont:
+  ret i32 0
+}
 
 %struct.S = type { i8 }
 %struct.S2 = type { i8 }
@@ -413,3 +442,5 @@ declare void @use_x(i32 %x)
 
 declare i32 @__CxxFrameHandler3(...)
 
+declare void @llvm.lifetime.start(i64, i8* nocapture)
+declare void @llvm.lifetime.end(i64, i8* nocapture)




More information about the llvm-commits mailing list