1 ; RUN: opt < %s -simplifycfg -S | FileCheck %s 2 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" 3 4 declare i32 @__gxx_personality_v0(...) 5 declare void @fn() 6 7 8 ; CHECK-LABEL: @test1 9 define void @test1() personality i32 (...)* @__gxx_personality_v0 { 10 entry: 11 ; CHECK-LABEL: entry: 12 ; CHECK: to label %invoke2 unwind label %lpad2 13 invoke void @fn() 14 to label %invoke2 unwind label %lpad1 15 16 invoke2: 17 ; CHECK-LABEL: invoke2: 18 ; CHECK: to label %invoke.cont unwind label %lpad2 19 invoke void @fn() 20 to label %invoke.cont unwind label %lpad2 21 22 invoke.cont: 23 ret void 24 25 lpad1: 26 %exn = landingpad {i8*, i32} 27 cleanup 28 br label %shared_resume 29 30 lpad2: 31 ; CHECK-LABEL: lpad2: 32 ; CHECK: landingpad { i8*, i32 } 33 ; CHECK-NEXT: cleanup 34 ; CHECK-NEXT: call void @fn() 35 ; CHECK-NEXT: ret void 36 %exn2 = landingpad {i8*, i32} 37 cleanup 38 br label %shared_resume 39 40 shared_resume: 41 call void @fn() 42 ret void 43 } 44 45 ; Don't trigger if blocks aren't the same/empty 46 define void @neg1() personality i32 (...)* @__gxx_personality_v0 { 47 ; CHECK-LABEL: @neg1 48 entry: 49 ; CHECK-LABEL: entry: 50 ; CHECK: to label %invoke2 unwind label %lpad1 51 invoke void @fn() 52 to label %invoke2 unwind label %lpad1 53 54 invoke2: 55 ; CHECK-LABEL: invoke2: 56 ; CHECK: to label %invoke.cont unwind label %lpad2 57 invoke void @fn() 58 to label %invoke.cont unwind label %lpad2 59 60 invoke.cont: 61 ret void 62 63 lpad1: 64 %exn = landingpad {i8*, i32} 65 filter [0 x i8*] zeroinitializer 66 call void @fn() 67 br label %shared_resume 68 69 lpad2: 70 %exn2 = landingpad {i8*, i32} 71 cleanup 72 br label %shared_resume 73 74 shared_resume: 75 call void @fn() 76 ret void 77 } 78 79 ; Should not trigger when the landing pads are not the exact same 80 define void @neg2() personality i32 (...)* @__gxx_personality_v0 { 81 ; CHECK-LABEL: @neg2 82 entry: 83 ; CHECK-LABEL: entry: 84 ; CHECK: to label %invoke2 unwind label %lpad1 85 invoke void @fn() 86 to label %invoke2 unwind label %lpad1 87 88 invoke2: 89 ; CHECK-LABEL: invoke2: 90 ; CHECK: to label %invoke.cont unwind label %lpad2 91 invoke void @fn() 92 to label %invoke.cont unwind label %lpad2 93 94 invoke.cont: 95 ret void 96 97 lpad1: 98 %exn = landingpad {i8*, i32} 99 filter [0 x i8*] zeroinitializer 100 br label %shared_resume 101 102 lpad2: 103 %exn2 = landingpad {i8*, i32} 104 cleanup 105 br label %shared_resume 106 107 shared_resume: 108 call void @fn() 109 ret void 110 } 111