Teach IR generation how to lazily emit cleanups.  This has a lot of advantages,
mostly in avoiding unnecessary work at compile time but also in producing more
sensible block orderings.

Move the destructor cleanups for local variables over to use lazy cleanups.
Eventually all cleanups will do this;  for now we have some awkward code
duplication.

Tell IR generation just to never produce landing pads in -fno-exceptions.
This is a much more comprehensive solution to a problem which previously was
half-solved by checks in most cleanup-generation spots.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108270 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/CodeGenCXX/nrvo.cpp b/test/CodeGenCXX/nrvo.cpp
index 6181f0e..8d19b1e 100644
--- a/test/CodeGenCXX/nrvo.cpp
+++ b/test/CodeGenCXX/nrvo.cpp
@@ -57,20 +57,15 @@
 
   // CHECK-EH:      call void @_ZN1XC1Ev
   // CHECK-EH-NEXT: invoke void @_ZN1XC1Ev
-  // -> %invoke.cont1, %lpad
+  // -> %invoke.cont, %lpad
 
-  // %invoke.cont1:
+  // %invoke.cont:
   // CHECK-EH:      br i1
   // -> %if.then, %if.end
 
   // %if.then: returning 'x'
   // CHECK-EH:      invoke void @_ZN1XC1ERKS_
-  // -> %cleanup, %lpad5
-
-  // %invoke.cont: rethrow block for %eh.cleanup.
-  // This really should be elsewhere in the function.
-  // CHECK-EH:      call void @_Unwind_Resume_or_Rethrow
-  // CHECK-EH-NEXT: unreachable
+  // -> %cleanup, %lpad1
 
   // %lpad: landing pad for ctor of 'y', dtor of 'y'
   // CHECK-EH:      call i8* @llvm.eh.exception()
@@ -78,25 +73,30 @@
   // CHECK-EH-NEXT: br label
   // -> %eh.cleanup
 
-  // %invoke.cont2: normal cleanup for 'x'
-  // CHECK-EH:      call void @_ZN1XD1Ev
-  // CHECK-EH-NEXT: ret void
-
-  // %lpad5: landing pad for return copy ctors, EH cleanup for 'y'
+  // %lpad1: landing pad for return copy ctors, EH cleanup for 'y'
   // CHECK-EH: invoke void @_ZN1XD1Ev
   // -> %eh.cleanup, %terminate.lpad
 
   // %if.end: returning 'y'
   // CHECK-EH: invoke void @_ZN1XC1ERKS_
-  // -> %cleanup, %lpad5
+  // -> %cleanup, %lpad1
 
   // %cleanup: normal cleanup for 'y'
   // CHECK-EH: invoke void @_ZN1XD1Ev
-  // -> %invoke.cont2, %lpad
+  // -> %invoke.cont11, %lpad
+
+  // %invoke.cont11: normal cleanup for 'x'
+  // CHECK-EH:      call void @_ZN1XD1Ev
+  // CHECK-EH-NEXT: ret void
 
   // %eh.cleanup:  EH cleanup for 'x'
   // CHECK-EH: invoke void @_ZN1XD1Ev
-  // -> %invoke.cont, %terminate.lpad
+  // -> %invoke.cont17, %terminate.lpad
+
+  // %invoke.cont17: rethrow block for %eh.cleanup.
+  // This really should be elsewhere in the function.
+  // CHECK-EH:      call void @_Unwind_Resume_or_Rethrow
+  // CHECK-EH-NEXT: unreachable
 
   // %terminate.lpad: terminate landing pad.
   // CHECK-EH:      call i8* @llvm.eh.exception()