Home | History | Annotate | Download | only in InstCombine
      1 ; RUN: opt < %s -instcombine -S | FileCheck %s
      2 
      3 @T1 = external constant i32
      4 @T2 = external constant i32
      5 @T3 = external constant i32
      6 
      7 declare i32 @generic_personality(i32, i64, i8*, i8*)
      8 declare i32 @__gxx_personality_v0(i32, i64, i8*, i8*)
      9 
     10 declare void @bar()
     11 
     12 define void @foo_generic() {
     13 ; CHECK: @foo_generic
     14   invoke void @bar()
     15     to label %cont.a unwind label %lpad.a
     16 cont.a:
     17   invoke void @bar()
     18     to label %cont.b unwind label %lpad.b
     19 cont.b:
     20   invoke void @bar()
     21     to label %cont.c unwind label %lpad.c
     22 cont.c:
     23   invoke void @bar()
     24     to label %cont.d unwind label %lpad.d
     25 cont.d:
     26   invoke void @bar()
     27     to label %cont.e unwind label %lpad.e
     28 cont.e:
     29   invoke void @bar()
     30     to label %cont.f unwind label %lpad.f
     31 cont.f:
     32   invoke void @bar()
     33     to label %cont.g unwind label %lpad.g
     34 cont.g:
     35   invoke void @bar()
     36     to label %cont.h unwind label %lpad.h
     37 cont.h:
     38   invoke void @bar()
     39     to label %cont.i unwind label %lpad.i
     40 cont.i:
     41   ret void
     42 
     43 lpad.a:
     44   %a = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
     45           catch i32* @T1
     46           catch i32* @T2
     47           catch i32* @T1
     48           catch i32* @T2
     49   unreachable
     50 ; CHECK: %a = landingpad
     51 ; CHECK-NEXT: @T1
     52 ; CHECK-NEXT: @T2
     53 ; CHECK-NEXT: unreachable
     54 
     55 lpad.b:
     56   %b = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
     57           filter [0 x i32*] zeroinitializer
     58           catch i32* @T1
     59   unreachable
     60 ; CHECK: %b = landingpad
     61 ; CHECK-NEXT: filter
     62 ; CHECK-NEXT: unreachable
     63 
     64 lpad.c:
     65   %c = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
     66           catch i32* @T1
     67           filter [1 x i32*] [i32* @T1]
     68           catch i32* @T2
     69   unreachable
     70 ; CHECK: %c = landingpad
     71 ; CHECK-NEXT: @T1
     72 ; CHECK-NEXT: filter [0 x i32*]
     73 ; CHECK-NEXT: unreachable
     74 
     75 lpad.d:
     76   %d = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
     77           filter [3 x i32*] zeroinitializer
     78   unreachable
     79 ; CHECK: %d = landingpad
     80 ; CHECK-NEXT: filter [1 x i32*] zeroinitializer
     81 ; CHECK-NEXT: unreachable
     82 
     83 lpad.e:
     84   %e = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
     85           catch i32* @T1
     86           filter [3 x i32*] [i32* @T1, i32* @T2, i32* @T2]
     87   unreachable
     88 ; CHECK: %e = landingpad
     89 ; CHECK-NEXT: @T1
     90 ; CHECK-NEXT: filter [1 x i32*] [i32* @T2]
     91 ; CHECK-NEXT: unreachable
     92 
     93 lpad.f:
     94   %f = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
     95           filter [2 x i32*] [i32* @T2, i32* @T1]
     96           filter [1 x i32*] [i32* @T1]
     97   unreachable
     98 ; CHECK: %f = landingpad
     99 ; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
    100 ; CHECK-NEXT: unreachable
    101 
    102 lpad.g:
    103   %g = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
    104           filter [1 x i32*] [i32* @T1]
    105           catch i32* @T3
    106           filter [2 x i32*] [i32* @T2, i32* @T1]
    107   unreachable
    108 ; CHECK: %g = landingpad
    109 ; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
    110 ; CHECK-NEXT: catch i32* @T3
    111 ; CHECK-NEXT: unreachable
    112 
    113 lpad.h:
    114   %h = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
    115           filter [2 x i32*] [i32* @T1, i32* null]
    116           filter [1 x i32*] zeroinitializer
    117   unreachable
    118 ; CHECK: %h = landingpad
    119 ; CHECK-NEXT: filter [1 x i32*] zeroinitializer
    120 ; CHECK-NEXT: unreachable
    121 
    122 lpad.i:
    123   %i = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
    124           cleanup
    125           filter [0 x i32*] zeroinitializer
    126   unreachable
    127 ; CHECK: %i = landingpad
    128 ; CHECK-NEXT: filter
    129 ; CHECK-NEXT: unreachable
    130 }
    131 
    132 define void @foo_cxx() {
    133 ; CHECK: @foo_cxx
    134   invoke void @bar()
    135     to label %cont.a unwind label %lpad.a
    136 cont.a:
    137   invoke void @bar()
    138     to label %cont.b unwind label %lpad.b
    139 cont.b:
    140   invoke void @bar()
    141     to label %cont.c unwind label %lpad.c
    142 cont.c:
    143   invoke void @bar()
    144     to label %cont.d unwind label %lpad.d
    145 cont.d:
    146   ret void
    147 
    148 lpad.a:
    149   %a = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0
    150           catch i32* null
    151           catch i32* @T1
    152   unreachable
    153 ; CHECK: %a = landingpad
    154 ; CHECK-NEXT: null
    155 ; CHECK-NEXT: unreachable
    156 
    157 lpad.b:
    158   %b = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0
    159           filter [1 x i32*] zeroinitializer
    160   unreachable
    161 ; CHECK: %b = landingpad
    162 ; CHECK-NEXT: cleanup
    163 ; CHECK-NEXT: unreachable
    164 
    165 lpad.c:
    166   %c = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0
    167           filter [2 x i32*] [i32* @T1, i32* null]
    168   unreachable
    169 ; CHECK: %c = landingpad
    170 ; CHECK-NEXT: cleanup
    171 ; CHECK-NEXT: unreachable
    172 
    173 lpad.d:
    174   %d = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0
    175           cleanup
    176           catch i32* null
    177   unreachable
    178 ; CHECK: %d = landingpad
    179 ; CHECK-NEXT: null
    180 ; CHECK-NEXT: unreachable
    181 }
    182