Home | History | Annotate | Download | only in SimplifyCFG
      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