53 lines · plain
1; Test that if an invoked function is inlined, and if that function cannot2; throw, that the dead handler is now unreachable.3 4; RUN: opt < %s -passes=inline,simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s5 6declare void @might_throw()7 8define internal i32 @callee() personality ptr @__gxx_personality_v0 {9enrty:10 invoke void @might_throw()11 to label %cont unwind label %exc12 13cont:14 ret i32 015 16exc:17 %exn = landingpad {ptr, i32}18 cleanup19 ret i32 120}21 22; caller returns true if might_throw throws an exception... callee cannot throw.23define i32 @caller() personality ptr @__gxx_personality_v0 {24; CHECK-LABEL: define i32 @caller() personality ptr @__gxx_personality_v025enrty:26 %X = invoke i32 @callee()27 to label %cont unwind label %UnreachableExceptionHandler28; CHECK-NOT: @callee29; CHECK: invoke void @might_throw()30; CHECK: to label %[[C:.*]] unwind label %[[E:.*]]31 32; CHECK: [[E]]:33; CHECK: landingpad34; CHECK: cleanup35; CHECK: br label %[[C]]36 37cont:38; CHECK: [[C]]:39 ret i32 %X40; CHECK: %[[PHI:.*]] = phi i3241; CHECK: ret i32 %[[PHI]]42 43UnreachableExceptionHandler:44; CHECK-NOT: UnreachableExceptionHandler:45 %exn = landingpad {ptr, i32}46 cleanup47 ret i32 -148; CHECK-NOT: ret i32 -149}50; CHECK: }51 52declare i32 @__gxx_personality_v0(...)53