; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 ; RUN: opt -passes='cgscc(inline)' -S %s | FileCheck %s ; declare i32 @__gxx_personality_v0(...) declare void @may_throw() define internal void @callee_with_indirect(ptr %fn) { call void %fn() call void @may_throw() ret void } define void @caller(ptr %fn) personality ptr @__gxx_personality_v0 { ; CHECK-LABEL: define void @caller( ; CHECK-SAME: ptr [[FN:%.*]]) personality ptr @__gxx_personality_v0 { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: invoke void [[FN]]() ; CHECK-NEXT: to [[DOTNOEXC:label %.*]] unwind label %[[LPAD:.*]], !inline_history [[META0:![0-9]+]] ; CHECK: [[_NOEXC:.*:]] ; CHECK-NEXT: invoke void @may_throw() ; CHECK-NEXT: to label %[[CALLEE_WITH_INDIRECT_EXIT:.*]] unwind label %[[LPAD]] ; CHECK: [[CALLEE_WITH_INDIRECT_EXIT]]: ; CHECK-NEXT: br label %[[CONT:.*]] ; CHECK: [[CONT]]: ; CHECK-NEXT: ret void ; CHECK: [[LPAD]]: ; CHECK-NEXT: [[EX:%.*]] = landingpad { ptr, i32 } ; CHECK-NEXT: cleanup ; CHECK-NEXT: resume { ptr, i32 } [[EX]] ; entry: invoke void @callee_with_indirect(ptr %fn) to label %cont unwind label %lpad cont: ret void lpad: %ex = landingpad { ptr, i32 } cleanup resume { ptr, i32 } %ex } define void @caller_ehpad(ptr %fn) personality ptr @__gxx_personality_v0 { ; CHECK-LABEL: define void @caller_ehpad( ; CHECK-SAME: ptr [[FN:%.*]]) personality ptr @__gxx_personality_v0 { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: invoke void [[FN]]() ; CHECK-NEXT: to [[DOTNOEXC:label %.*]] unwind label %[[CLEANUPBB:.*]], !inline_history [[META0]] ; CHECK: [[_NOEXC:.*:]] ; CHECK-NEXT: invoke void @may_throw() ; CHECK-NEXT: to label %[[CALLEE_WITH_INDIRECT_EXIT:.*]] unwind label %[[CLEANUPBB]] ; CHECK: [[CALLEE_WITH_INDIRECT_EXIT]]: ; CHECK-NEXT: br label %[[CONT:.*]] ; CHECK: [[CONT]]: ; CHECK-NEXT: ret void ; CHECK: [[CLEANUPBB]]: ; CHECK-NEXT: [[PAD:%.*]] = cleanuppad within none [] ; CHECK-NEXT: cleanupret from [[PAD]] unwind to caller ; entry: invoke void @callee_with_indirect(ptr %fn) to label %cont unwind label %cleanupbb cont: ret void cleanupbb: %pad = cleanuppad within none [] cleanupret from %pad unwind to caller } ;. ; CHECK: [[META0]] = distinct !{null} ;.