Some more correctness fixes and code-size optimizations for fragile-ABI
ObjC exceptions:
  - don't enter a try for the catch blocks unless there's a finally
  - put the setjmp buffer in the locals set for liveness reasons
  - dump the sync object into an alloca in the locals set for liveness reasons
Some of this can go away if the backend starts to properly calculate liveness
in the presence of setjmp (which would also be a *much* stabler solution).

llvm-svn: 110188
diff --git a/clang/test/CodeGenObjC/synchronized.m b/clang/test/CodeGenObjC/synchronized.m
index b713379..2a80906 100644
--- a/clang/test/CodeGenObjC/synchronized.m
+++ b/clang/test/CodeGenObjC/synchronized.m
@@ -23,23 +23,28 @@
 // CHECK: define void @foo(
 void foo(id a) {
   // CHECK: [[A:%.*]] = alloca i8*
+  // CHECK: [[SYNC:%.*]] = alloca i8*
 
-  // CHECK: call void @objc_sync_enter
-  // CHECK: call void @objc_exception_try_enter
-  // CHECK: call i32 @_setjmp
+  // CHECK:      store i8* [[AVAL:%.*]], i8** [[A]]
+  // CHECK-NEXT: call void @objc_sync_enter(i8* [[AVAL]])
+  // CHECK-NEXT: store i8* [[AVAL]], i8** [[SYNC]]
+  // CHECK-NEXT: call void @objc_exception_try_enter
+  // CHECK:      call i32 @_setjmp
   @synchronized(a) {
-    // CHECK: call void @objc_exception_try_exit
+    // This is unreachable, but the optimizers can't know that.
+    // CHECK: call void asm sideeffect "", "=*m,=*m,=*m"(i8** [[A]], i8** [[SYNC]]
     // CHECK: call void @objc_sync_exit
+    // CHECK: call i8* @objc_exception_extract
+    // CHECK: call void @objc_exception_throw
+    // CHECK: unreachable
+
+    // CHECK:      call void @objc_exception_try_exit
+    // CHECK:      [[T:%.*]] = load i8** [[SYNC]]
+    // CHECK-NEXT: call void @objc_sync_exit
     // CHECK: ret void
     return;
   }
 
-  // This is unreachable, but the optimizers can't know that.
-  // CHECK: call void asm sideeffect "", "=*m"(i8** [[A]])
-  // CHECK: call i8* @objc_exception_extract
-  // CHECK: call void @objc_sync_exit
-  // CHECK: call void @objc_exception_throw
-  // CHECK: unreachable
 }
 
 // CHECK: define i32 @f0(