1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals 2; RUN: opt < %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s 3 4declare void @llvm.lifetime.start.p0(i64, ptr) 5declare void @llvm.lifetime.end.p0(i64, ptr) 6 7declare void @escape(ptr) 8 9declare void @throwing_callee_foo() 10declare void @throwing_callee_bar() 11 12declare i32 @__gxx_personality_v0(...) 13 14define void @caller(i1 %c) personality ptr @__gxx_personality_v0 { 15; CHECK-LABEL: @caller( 16; CHECK-NEXT: entry: 17; CHECK-NEXT: [[I0:%.*]] = alloca i32, align 4 18; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr nonnull [[I0]]) 19; CHECK-NEXT: call void @escape(ptr [[I0]]) 20; CHECK-NEXT: [[I2:%.*]] = alloca i32, align 4 21; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr nonnull [[I2]]) 22; CHECK-NEXT: call void @escape(ptr [[I2]]) 23; CHECK-NEXT: [[I4:%.*]] = alloca i32, align 4 24; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr nonnull [[I4]]) 25; CHECK-NEXT: call void @escape(ptr [[I4]]) 26; CHECK-NEXT: [[I6:%.*]] = alloca i32, align 4 27; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr nonnull [[I6]]) 28; CHECK-NEXT: call void @escape(ptr [[I6]]) 29; CHECK-NEXT: br i1 [[C:%.*]], label [[V0:%.*]], label [[V1:%.*]] 30; CHECK: v0: 31; CHECK-NEXT: call void @throwing_callee_foo() 32; CHECK-NEXT: unreachable 33; CHECK: v1: 34; CHECK-NEXT: call void @throwing_callee_bar() 35; CHECK-NEXT: unreachable 36; 37entry: 38 %i0 = alloca i32 39 call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %i0) 40 call void @escape(ptr %i0) 41 42 %i2 = alloca i32 43 call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %i2) 44 call void @escape(ptr %i2) 45 46 %i4 = alloca i32 47 call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %i4) 48 call void @escape(ptr %i4) 49 50 %i6 = alloca i32 51 call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %i6) 52 call void @escape(ptr %i6) 53 54 br i1 %c, label %v0, label %v1 55 56v0: 57 invoke void @throwing_callee_foo() 58 to label %invoke.cont unwind label %lpad.v0 59 60v1: 61 invoke void @throwing_callee_bar() 62 to label %invoke.cont unwind label %lpad.v1 63 64invoke.cont: 65 unreachable 66 67lpad.v0: 68 %i8 = landingpad { ptr, i32 } cleanup 69 call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %i0) 70 br label %end 71 72lpad.v1: 73 %i9 = landingpad { ptr, i32 } cleanup 74 call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %i2) 75 br label %end 76 77end: 78 %i10 = phi { ptr, i32 } [ %i8, %lpad.v0 ], [ %i9, %lpad.v1 ] 79 %i11 = phi ptr [ %i4, %lpad.v0 ], [ %i6, %lpad.v1 ] 80 call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %i11) 81 resume { ptr, i32 } %i10 82} 83;. 84; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } 85;. 86