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 declare i32 @__objc_personality_v0(i32, i64, i8*, i8*)
     10 
     11 declare void @bar()
     12 
     13 define void @foo_generic() {
     14 ; CHECK: @foo_generic
     15   invoke void @bar()
     16     to label %cont.a unwind label %lpad.a
     17 cont.a:
     18   invoke void @bar()
     19     to label %cont.b unwind label %lpad.b
     20 cont.b:
     21   invoke void @bar()
     22     to label %cont.c unwind label %lpad.c
     23 cont.c:
     24   invoke void @bar()
     25     to label %cont.d unwind label %lpad.d
     26 cont.d:
     27   invoke void @bar()
     28     to label %cont.e unwind label %lpad.e
     29 cont.e:
     30   invoke void @bar()
     31     to label %cont.f unwind label %lpad.f
     32 cont.f:
     33   invoke void @bar()
     34     to label %cont.g unwind label %lpad.g
     35 cont.g:
     36   invoke void @bar()
     37     to label %cont.h unwind label %lpad.h
     38 cont.h:
     39   invoke void @bar()
     40     to label %cont.i unwind label %lpad.i
     41 cont.i:
     42   ret void
     43 
     44 lpad.a:
     45   %a = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
     46           catch i32* @T1
     47           catch i32* @T2
     48           catch i32* @T1
     49           catch i32* @T2
     50   unreachable
     51 ; CHECK: %a = landingpad
     52 ; CHECK-NEXT: @T1
     53 ; CHECK-NEXT: @T2
     54 ; CHECK-NEXT: unreachable
     55 
     56 lpad.b:
     57   %b = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
     58           filter [0 x i32*] zeroinitializer
     59           catch i32* @T1
     60   unreachable
     61 ; CHECK: %b = landingpad
     62 ; CHECK-NEXT: filter
     63 ; CHECK-NEXT: unreachable
     64 
     65 lpad.c:
     66   %c = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
     67           catch i32* @T1
     68           filter [1 x i32*] [i32* @T1]
     69           catch i32* @T2
     70   unreachable
     71 ; CHECK: %c = landingpad
     72 ; CHECK-NEXT: @T1
     73 ; CHECK-NEXT: filter [0 x i32*]
     74 ; CHECK-NEXT: unreachable
     75 
     76 lpad.d:
     77   %d = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
     78           filter [3 x i32*] zeroinitializer
     79   unreachable
     80 ; CHECK: %d = landingpad
     81 ; CHECK-NEXT: filter [1 x i32*] zeroinitializer
     82 ; CHECK-NEXT: unreachable
     83 
     84 lpad.e:
     85   %e = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
     86           catch i32* @T1
     87           filter [3 x i32*] [i32* @T1, i32* @T2, i32* @T2]
     88   unreachable
     89 ; CHECK: %e = landingpad
     90 ; CHECK-NEXT: @T1
     91 ; CHECK-NEXT: filter [1 x i32*] [i32* @T2]
     92 ; CHECK-NEXT: unreachable
     93 
     94 lpad.f:
     95   %f = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
     96           filter [2 x i32*] [i32* @T2, i32* @T1]
     97           filter [1 x i32*] [i32* @T1]
     98   unreachable
     99 ; CHECK: %f = landingpad
    100 ; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
    101 ; CHECK-NEXT: unreachable
    102 
    103 lpad.g:
    104   %g = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
    105           filter [1 x i32*] [i32* @T1]
    106           catch i32* @T3
    107           filter [2 x i32*] [i32* @T2, i32* @T1]
    108   unreachable
    109 ; CHECK: %g = landingpad
    110 ; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
    111 ; CHECK-NEXT: catch i32* @T3
    112 ; CHECK-NEXT: unreachable
    113 
    114 lpad.h:
    115   %h = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
    116           filter [2 x i32*] [i32* @T1, i32* null]
    117           filter [1 x i32*] zeroinitializer
    118   unreachable
    119 ; CHECK: %h = landingpad
    120 ; CHECK-NEXT: filter [1 x i32*] zeroinitializer
    121 ; CHECK-NEXT: unreachable
    122 
    123 lpad.i:
    124   %i = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @generic_personality
    125           cleanup
    126           filter [0 x i32*] zeroinitializer
    127   unreachable
    128 ; CHECK: %i = landingpad
    129 ; CHECK-NEXT: filter
    130 ; CHECK-NEXT: unreachable
    131 }
    132 
    133 define void @foo_cxx() {
    134 ; CHECK: @foo_cxx
    135   invoke void @bar()
    136     to label %cont.a unwind label %lpad.a
    137 cont.a:
    138   invoke void @bar()
    139     to label %cont.b unwind label %lpad.b
    140 cont.b:
    141   invoke void @bar()
    142     to label %cont.c unwind label %lpad.c
    143 cont.c:
    144   invoke void @bar()
    145     to label %cont.d unwind label %lpad.d
    146 cont.d:
    147   ret void
    148 
    149 lpad.a:
    150   %a = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0
    151           catch i32* null
    152           catch i32* @T1
    153   unreachable
    154 ; CHECK: %a = landingpad
    155 ; CHECK-NEXT: null
    156 ; CHECK-NEXT: unreachable
    157 
    158 lpad.b:
    159   %b = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0
    160           filter [1 x i32*] zeroinitializer
    161   unreachable
    162 ; CHECK: %b = landingpad
    163 ; CHECK-NEXT: cleanup
    164 ; CHECK-NEXT: unreachable
    165 
    166 lpad.c:
    167   %c = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0
    168           filter [2 x i32*] [i32* @T1, i32* null]
    169   unreachable
    170 ; CHECK: %c = landingpad
    171 ; CHECK-NEXT: cleanup
    172 ; CHECK-NEXT: unreachable
    173 
    174 lpad.d:
    175   %d = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0
    176           cleanup
    177           catch i32* null
    178   unreachable
    179 ; CHECK: %d = landingpad
    180 ; CHECK-NEXT: null
    181 ; CHECK-NEXT: unreachable
    182 }
    183 
    184 define void @foo_objc() {
    185 ; CHECK: @foo_objc
    186   invoke void @bar()
    187     to label %cont.a unwind label %lpad.a
    188 cont.a:
    189   invoke void @bar()
    190     to label %cont.b unwind label %lpad.b
    191 cont.b:
    192   invoke void @bar()
    193     to label %cont.c unwind label %lpad.c
    194 cont.c:
    195   invoke void @bar()
    196     to label %cont.d unwind label %lpad.d
    197 cont.d:
    198   ret void
    199 
    200 lpad.a:
    201   %a = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0
    202           catch i32* null
    203           catch i32* @T1
    204   unreachable
    205 ; CHECK: %a = landingpad
    206 ; CHECK-NEXT: null
    207 ; CHECK-NEXT: unreachable
    208 
    209 lpad.b:
    210   %b = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0
    211           filter [1 x i32*] zeroinitializer
    212   unreachable
    213 ; CHECK: %b = landingpad
    214 ; CHECK-NEXT: cleanup
    215 ; CHECK-NEXT: unreachable
    216 
    217 lpad.c:
    218   %c = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0
    219           filter [2 x i32*] [i32* @T1, i32* null]
    220   unreachable
    221 ; CHECK: %c = landingpad
    222 ; CHECK-NEXT: cleanup
    223 ; CHECK-NEXT: unreachable
    224 
    225 lpad.d:
    226   %d = landingpad { i8*, i32 } personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0
    227           cleanup
    228           catch i32* null
    229   unreachable
    230 ; CHECK: %d = landingpad
    231 ; CHECK-NEXT: null
    232 ; CHECK-NEXT: unreachable
    233 }
    234