[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / Transforms / SimplifyCFG / duplicate-landingpad.ll
blob93c55f0064ccb85b6d22e79be9ff583a15b3e438
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"
4 declare i32 @__gxx_personality_v0(...)
5 declare void @fn()
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
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
22 invoke.cont:
23   ret void
25 lpad1:
26   %exn = landingpad {i8*, i32}
27          cleanup
28   br label %shared_resume
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
40 shared_resume:
41   call void @fn()
42   ret void
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
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
60 invoke.cont:
61   ret void
63 lpad1:
64   %exn = landingpad {i8*, i32}
65          filter [0 x i8*] zeroinitializer
66   call void @fn()
67   br label %shared_resume
69 lpad2:
70   %exn2 = landingpad {i8*, i32}
71           cleanup
72   br label %shared_resume
74 shared_resume:
75   call void @fn()
76   ret void
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
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
94 invoke.cont:
95   ret void
97 lpad1:
98   %exn = landingpad {i8*, i32}
99          filter [0 x i8*] zeroinitializer
100   br label %shared_resume
102 lpad2:
103   %exn2 = landingpad {i8*, i32}
104           cleanup
105   br label %shared_resume
107 shared_resume:
108   call void @fn()
109   ret void