| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- ; RUN: opt < %s -instcombine -S | FileCheck %s
- @T1 = external constant i32
- @T2 = external constant i32
- @T3 = external constant i32
- declare i32 @generic_personality(i32, i64, i8*, i8*)
- declare i32 @__gxx_personality_v0(i32, i64, i8*, i8*)
- declare i32 @__objc_personality_v0(i32, i64, i8*, i8*)
- declare i32 @__C_specific_handler(...)
- declare void @bar()
- define void @foo_generic() personality i32 (i32, i64, i8*, i8*)* @generic_personality {
- ; CHECK-LABEL: @foo_generic(
- invoke void @bar()
- to label %cont.a unwind label %lpad.a
- cont.a:
- invoke void @bar()
- to label %cont.b unwind label %lpad.b
- cont.b:
- invoke void @bar()
- to label %cont.c unwind label %lpad.c
- cont.c:
- invoke void @bar()
- to label %cont.d unwind label %lpad.d
- cont.d:
- invoke void @bar()
- to label %cont.e unwind label %lpad.e
- cont.e:
- invoke void @bar()
- to label %cont.f unwind label %lpad.f
- cont.f:
- invoke void @bar()
- to label %cont.g unwind label %lpad.g
- cont.g:
- invoke void @bar()
- to label %cont.h unwind label %lpad.h
- cont.h:
- invoke void @bar()
- to label %cont.i unwind label %lpad.i
- cont.i:
- ret void
- lpad.a:
- %a = landingpad { i8*, i32 }
- catch i32* @T1
- catch i32* @T2
- catch i32* @T1
- catch i32* @T2
- unreachable
- ; CHECK: %a = landingpad
- ; CHECK-NEXT: @T1
- ; CHECK-NEXT: @T2
- ; CHECK-NEXT: unreachable
- lpad.b:
- %b = landingpad { i8*, i32 }
- filter [0 x i32*] zeroinitializer
- catch i32* @T1
- unreachable
- ; CHECK: %b = landingpad
- ; CHECK-NEXT: filter
- ; CHECK-NEXT: unreachable
- lpad.c:
- %c = landingpad { i8*, i32 }
- catch i32* @T1
- filter [1 x i32*] [i32* @T1]
- catch i32* @T2
- unreachable
- ; CHECK: %c = landingpad
- ; CHECK-NEXT: @T1
- ; CHECK-NEXT: filter [0 x i32*]
- ; CHECK-NEXT: unreachable
- lpad.d:
- %d = landingpad { i8*, i32 }
- filter [3 x i32*] zeroinitializer
- unreachable
- ; CHECK: %d = landingpad
- ; CHECK-NEXT: filter [1 x i32*] zeroinitializer
- ; CHECK-NEXT: unreachable
- lpad.e:
- %e = landingpad { i8*, i32 }
- catch i32* @T1
- filter [3 x i32*] [i32* @T1, i32* @T2, i32* @T2]
- unreachable
- ; CHECK: %e = landingpad
- ; CHECK-NEXT: @T1
- ; CHECK-NEXT: filter [1 x i32*] [i32* @T2]
- ; CHECK-NEXT: unreachable
- lpad.f:
- %f = landingpad { i8*, i32 }
- filter [2 x i32*] [i32* @T2, i32* @T1]
- filter [1 x i32*] [i32* @T1]
- unreachable
- ; CHECK: %f = landingpad
- ; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
- ; CHECK-NEXT: unreachable
- lpad.g:
- %g = landingpad { i8*, i32 }
- filter [1 x i32*] [i32* @T1]
- catch i32* @T3
- filter [2 x i32*] [i32* @T2, i32* @T1]
- unreachable
- ; CHECK: %g = landingpad
- ; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
- ; CHECK-NEXT: catch i32* @T3
- ; CHECK-NEXT: unreachable
- lpad.h:
- %h = landingpad { i8*, i32 }
- filter [2 x i32*] [i32* @T1, i32* null]
- filter [1 x i32*] zeroinitializer
- unreachable
- ; CHECK: %h = landingpad
- ; CHECK-NEXT: filter [1 x i32*] zeroinitializer
- ; CHECK-NEXT: unreachable
- lpad.i:
- %i = landingpad { i8*, i32 }
- cleanup
- filter [0 x i32*] zeroinitializer
- unreachable
- ; CHECK: %i = landingpad
- ; CHECK-NEXT: filter
- ; CHECK-NEXT: unreachable
- }
- define void @foo_cxx() personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0 {
- ; CHECK-LABEL: @foo_cxx(
- invoke void @bar()
- to label %cont.a unwind label %lpad.a
- cont.a:
- invoke void @bar()
- to label %cont.b unwind label %lpad.b
- cont.b:
- invoke void @bar()
- to label %cont.c unwind label %lpad.c
- cont.c:
- invoke void @bar()
- to label %cont.d unwind label %lpad.d
- cont.d:
- ret void
- lpad.a:
- %a = landingpad { i8*, i32 }
- catch i32* null
- catch i32* @T1
- unreachable
- ; CHECK: %a = landingpad
- ; CHECK-NEXT: null
- ; CHECK-NEXT: unreachable
- lpad.b:
- %b = landingpad { i8*, i32 }
- filter [1 x i32*] zeroinitializer
- unreachable
- ; CHECK: %b = landingpad
- ; CHECK-NEXT: cleanup
- ; CHECK-NEXT: unreachable
- lpad.c:
- %c = landingpad { i8*, i32 }
- filter [2 x i32*] [i32* @T1, i32* null]
- unreachable
- ; CHECK: %c = landingpad
- ; CHECK-NEXT: cleanup
- ; CHECK-NEXT: unreachable
- lpad.d:
- %d = landingpad { i8*, i32 }
- cleanup
- catch i32* null
- unreachable
- ; CHECK: %d = landingpad
- ; CHECK-NEXT: null
- ; CHECK-NEXT: unreachable
- }
- define void @foo_objc() personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0 {
- ; CHECK-LABEL: @foo_objc(
- invoke void @bar()
- to label %cont.a unwind label %lpad.a
- cont.a:
- invoke void @bar()
- to label %cont.b unwind label %lpad.b
- cont.b:
- invoke void @bar()
- to label %cont.c unwind label %lpad.c
- cont.c:
- invoke void @bar()
- to label %cont.d unwind label %lpad.d
- cont.d:
- ret void
- lpad.a:
- %a = landingpad { i8*, i32 }
- catch i32* null
- catch i32* @T1
- unreachable
- ; CHECK: %a = landingpad
- ; CHECK-NEXT: null
- ; CHECK-NEXT: unreachable
- lpad.b:
- %b = landingpad { i8*, i32 }
- filter [1 x i32*] zeroinitializer
- unreachable
- ; CHECK: %b = landingpad
- ; CHECK-NEXT: cleanup
- ; CHECK-NEXT: unreachable
- lpad.c:
- %c = landingpad { i8*, i32 }
- filter [2 x i32*] [i32* @T1, i32* null]
- unreachable
- ; CHECK: %c = landingpad
- ; CHECK-NEXT: cleanup
- ; CHECK-NEXT: unreachable
- lpad.d:
- %d = landingpad { i8*, i32 }
- cleanup
- catch i32* null
- unreachable
- ; CHECK: %d = landingpad
- ; CHECK-NEXT: null
- ; CHECK-NEXT: unreachable
- }
- define void @foo_seh() personality i32 (...)* @__C_specific_handler {
- ; CHECK-LABEL: @foo_seh(
- invoke void @bar()
- to label %cont.a unwind label %lpad.a
- cont.a:
- invoke void @bar()
- to label %cont.b unwind label %lpad.b
- cont.b:
- invoke void @bar()
- to label %cont.c unwind label %lpad.c
- cont.c:
- invoke void @bar()
- to label %cont.d unwind label %lpad.d
- cont.d:
- ret void
- lpad.a:
- %a = landingpad { i8*, i32 }
- catch i32* null
- catch i32* @T1
- unreachable
- ; CHECK: %a = landingpad
- ; CHECK-NEXT: null
- ; CHECK-NEXT: unreachable
- lpad.b:
- %b = landingpad { i8*, i32 }
- filter [1 x i32*] zeroinitializer
- unreachable
- ; CHECK: %b = landingpad
- ; CHECK-NEXT: cleanup
- ; CHECK-NEXT: unreachable
- lpad.c:
- %c = landingpad { i8*, i32 }
- filter [2 x i32*] [i32* @T1, i32* null]
- unreachable
- ; CHECK: %c = landingpad
- ; CHECK-NEXT: cleanup
- ; CHECK-NEXT: unreachable
- lpad.d:
- %d = landingpad { i8*, i32 }
- cleanup
- catch i32* null
- unreachable
- ; CHECK: %d = landingpad
- ; CHECK-NEXT: null
- ; CHECK-NEXT: unreachable
- }
|