| ; RUN: opt < %s -basic-aa -gvn -S | FileCheck %s |
| %struct.__fundamental_type_info_pseudo = type { %struct.__type_info_pseudo } |
| %struct.__type_info_pseudo = type { i8*, i8* } |
| |
| @_ZTIi = external constant %struct.__fundamental_type_info_pseudo |
| @_ZTIb = external constant %struct.__fundamental_type_info_pseudo |
| |
| declare void @_Z4barv() |
| |
| declare void @_Z7cleanupv() |
| |
| declare i32 @llvm.eh.typeid.for(i8*) nounwind readonly |
| |
| declare i8* @__cxa_begin_catch(i8*) nounwind |
| |
| declare void @__cxa_end_catch() |
| |
| declare i32 @__gxx_personality_v0(i32, i64, i8*, i8*) |
| |
| define void @_Z3foov() uwtable personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0 { |
| entry: |
| invoke void @_Z4barv() |
| to label %return unwind label %lpad |
| |
| lpad: ; preds = %entry |
| %0 = landingpad { i8*, i32 } |
| catch %struct.__fundamental_type_info_pseudo* @_ZTIi |
| catch %struct.__fundamental_type_info_pseudo* @_ZTIb |
| catch %struct.__fundamental_type_info_pseudo* @_ZTIi |
| catch %struct.__fundamental_type_info_pseudo* @_ZTIb |
| %exc_ptr2.i = extractvalue { i8*, i32 } %0, 0 |
| %filter3.i = extractvalue { i8*, i32 } %0, 1 |
| %typeid.i = tail call i32 @llvm.eh.typeid.for(i8* bitcast (%struct.__fundamental_type_info_pseudo* @_ZTIi to i8*)) |
| ; CHECK: call i32 @llvm.eh.typeid.for |
| %1 = icmp eq i32 %filter3.i, %typeid.i |
| br i1 %1, label %ppad, label %next |
| |
| next: ; preds = %lpad |
| %typeid1.i = tail call i32 @llvm.eh.typeid.for(i8* bitcast (%struct.__fundamental_type_info_pseudo* @_ZTIb to i8*)) |
| ; CHECK: call i32 @llvm.eh.typeid.for |
| %2 = icmp eq i32 %filter3.i, %typeid1.i |
| br i1 %2, label %ppad2, label %next2 |
| |
| ppad: ; preds = %lpad |
| %3 = tail call i8* @__cxa_begin_catch(i8* %exc_ptr2.i) nounwind |
| tail call void @__cxa_end_catch() nounwind |
| br label %return |
| |
| ppad2: ; preds = %next |
| %D.2073_5.i = tail call i8* @__cxa_begin_catch(i8* %exc_ptr2.i) nounwind |
| tail call void @__cxa_end_catch() nounwind |
| br label %return |
| |
| next2: ; preds = %next |
| call void @_Z7cleanupv() |
| %typeid = tail call i32 @llvm.eh.typeid.for(i8* bitcast (%struct.__fundamental_type_info_pseudo* @_ZTIi to i8*)) |
| ; CHECK-NOT: call i32 @llvm.eh.typeid.for |
| %4 = icmp eq i32 %filter3.i, %typeid |
| br i1 %4, label %ppad3, label %next3 |
| |
| next3: ; preds = %next2 |
| %typeid1 = tail call i32 @llvm.eh.typeid.for(i8* bitcast (%struct.__fundamental_type_info_pseudo* @_ZTIb to i8*)) |
| %5 = icmp eq i32 %filter3.i, %typeid1 |
| br i1 %5, label %ppad4, label %unwind |
| |
| unwind: ; preds = %next3 |
| resume { i8*, i32 } %0 |
| |
| ppad3: ; preds = %next2 |
| %6 = tail call i8* @__cxa_begin_catch(i8* %exc_ptr2.i) nounwind |
| tail call void @__cxa_end_catch() nounwind |
| br label %return |
| |
| ppad4: ; preds = %next3 |
| %D.2080_5 = tail call i8* @__cxa_begin_catch(i8* %exc_ptr2.i) nounwind |
| tail call void @__cxa_end_catch() nounwind |
| br label %return |
| |
| return: ; preds = %ppad4, %ppad3, %ppad2, %ppad, %entry |
| ret void |
| } |