| ; Test that if an invoked function is inlined, and if that function cannot | |
| ; throw, that the dead handler is now unreachable. | |
| ; RUN: opt < %s -inline -simplifycfg -S | \ | |
| ; RUN: not grep UnreachableExceptionHandler | |
| declare void @might_throw() | |
| define internal i32 @callee() { | |
| invoke void @might_throw( ) | |
| to label %cont unwind label %exc | |
| cont: ; preds = %0 | |
| ret i32 0 | |
| exc: ; preds = %0 | |
| %exn = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0 | |
| cleanup | |
| ret i32 1 | |
| } | |
| ; caller returns true if might_throw throws an exception... callee cannot throw. | |
| define i32 @caller() { | |
| %X = invoke i32 @callee( ) | |
| to label %cont unwind label %UnreachableExceptionHandler ; <i32> [#uses=1] | |
| cont: ; preds = %0 | |
| ret i32 %X | |
| UnreachableExceptionHandler: ; preds = %0 | |
| %exn = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0 | |
| cleanup | |
| ret i32 -1 | |
| } | |
| declare i32 @__gxx_personality_v0(...) |