| ; 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} |
| ;. |