Index: llvm/include/llvm/IR/IntrinsicsWebAssembly.td =================================================================== --- llvm/include/llvm/IR/IntrinsicsWebAssembly.td +++ llvm/include/llvm/IR/IntrinsicsWebAssembly.td @@ -19,64 +19,69 @@ // Query the current memory size, and increase the current memory size. // Note that memory.size is not IntrNoMem because it must be sequenced with // respect to memory.grow calls. -def int_wasm_memory_size : Intrinsic<[llvm_anyint_ty], - [llvm_i32_ty], - [IntrReadMem]>; -def int_wasm_memory_grow : Intrinsic<[llvm_anyint_ty], - [llvm_i32_ty, LLVMMatchType<0>], - []>; +def int_wasm_memory_size : + DefaultAttrsIntrinsic<[llvm_anyint_ty], [llvm_i32_ty], [IntrReadMem]>; +def int_wasm_memory_grow : + DefaultAttrsIntrinsic<[llvm_anyint_ty], [llvm_i32_ty, LLVMMatchType<0>], []>; //===----------------------------------------------------------------------===// // ref.null intrinsics //===----------------------------------------------------------------------===// -def int_wasm_ref_null_extern : Intrinsic<[llvm_externref_ty], [], [IntrNoMem]>; -def int_wasm_ref_null_func : Intrinsic<[llvm_funcref_ty], [], [IntrNoMem]>; -def int_wasm_ref_is_null_extern : Intrinsic<[llvm_i32_ty], [llvm_externref_ty], - [IntrNoMem], "llvm.wasm.ref.is_null.extern">; -def int_wasm_ref_is_null_func : Intrinsic<[llvm_i32_ty], [llvm_funcref_ty], - [IntrNoMem], "llvm.wasm.ref.is_null.func">; +def int_wasm_ref_null_extern : + DefaultAttrsIntrinsic<[llvm_externref_ty], [], [IntrNoMem]>; +def int_wasm_ref_null_func : + DefaultAttrsIntrinsic<[llvm_funcref_ty], [], [IntrNoMem]>; +def int_wasm_ref_is_null_extern : + DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_externref_ty], [IntrNoMem], + "llvm.wasm.ref.is_null.extern">; +def int_wasm_ref_is_null_func : + DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_funcref_ty], + [IntrNoMem], "llvm.wasm.ref.is_null.func">; //===----------------------------------------------------------------------===// // Table intrinsics //===----------------------------------------------------------------------===// -def int_wasm_table_set_externref : Intrinsic<[], - [llvm_table_ty, llvm_i32_ty, llvm_externref_ty], - [IntrWriteMem]>; -def int_wasm_table_set_funcref : Intrinsic<[], - [llvm_table_ty, llvm_i32_ty, llvm_funcref_ty], - [IntrWriteMem]>; - -def int_wasm_table_get_externref : Intrinsic<[llvm_externref_ty], - [llvm_table_ty, llvm_i32_ty], - [IntrReadMem]>; -def int_wasm_table_get_funcref : Intrinsic<[llvm_funcref_ty], - [llvm_table_ty, llvm_i32_ty], - [IntrReadMem]>; +def int_wasm_table_set_externref : + DefaultAttrsIntrinsic<[], [llvm_table_ty, llvm_i32_ty, llvm_externref_ty], + [IntrWriteMem]>; +def int_wasm_table_set_funcref : + DefaultAttrsIntrinsic<[], [llvm_table_ty, llvm_i32_ty, llvm_funcref_ty], + [IntrWriteMem]>; + +def int_wasm_table_get_externref : + DefaultAttrsIntrinsic<[llvm_externref_ty], [llvm_table_ty, llvm_i32_ty], + [IntrReadMem]>; +def int_wasm_table_get_funcref : + DefaultAttrsIntrinsic<[llvm_funcref_ty], [llvm_table_ty, llvm_i32_ty], + [IntrReadMem]>; // Query the current table size, and increase the current table size. -def int_wasm_table_size : Intrinsic<[llvm_i32_ty], - [llvm_table_ty], - [IntrReadMem]>; -def int_wasm_table_copy : Intrinsic<[], - [llvm_table_ty, llvm_table_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], - []>; -def int_wasm_table_grow_externref : Intrinsic<[llvm_i32_ty], - [llvm_table_ty, llvm_externref_ty, llvm_i32_ty], - []>; -def int_wasm_table_grow_funcref : Intrinsic<[llvm_i32_ty], - [llvm_table_ty, llvm_funcref_ty, llvm_i32_ty], - []>; -def int_wasm_table_fill_externref : Intrinsic<[], - [llvm_table_ty, llvm_i32_ty, llvm_externref_ty, llvm_i32_ty], - []>; -def int_wasm_table_fill_funcref : Intrinsic<[], - [llvm_table_ty, llvm_i32_ty, llvm_funcref_ty, llvm_i32_ty], - []>; +def int_wasm_table_size : + DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_table_ty], [IntrReadMem]>; +def int_wasm_table_copy : + DefaultAttrsIntrinsic<[], + [llvm_table_ty, llvm_table_ty, llvm_i32_ty, llvm_i32_ty, + llvm_i32_ty], []>; +def int_wasm_table_grow_externref : + DefaultAttrsIntrinsic<[llvm_i32_ty], + [llvm_table_ty, llvm_externref_ty, llvm_i32_ty], []>; +def int_wasm_table_grow_funcref : + DefaultAttrsIntrinsic<[llvm_i32_ty], + [llvm_table_ty, llvm_funcref_ty, llvm_i32_ty], []>; +def int_wasm_table_fill_externref : + DefaultAttrsIntrinsic<[], + [llvm_table_ty, llvm_i32_ty, llvm_externref_ty, + llvm_i32_ty], []>; +def int_wasm_table_fill_funcref : + DefaultAttrsIntrinsic<[], + [llvm_table_ty, llvm_i32_ty, llvm_funcref_ty, + llvm_i32_ty], []>; //===----------------------------------------------------------------------===// // Trapping float-to-int conversions //===----------------------------------------------------------------------===// +// These don't use default attributes, because they are not willreturn. def int_wasm_trunc_signed : Intrinsic<[llvm_anyint_ty], [llvm_anyfloat_ty], [IntrNoMem]>; @@ -88,12 +93,12 @@ // Saturating float-to-int conversions //===----------------------------------------------------------------------===// -def int_wasm_trunc_saturate_signed : Intrinsic<[llvm_anyint_ty], - [llvm_anyfloat_ty], - [IntrNoMem, IntrSpeculatable]>; -def int_wasm_trunc_saturate_unsigned : Intrinsic<[llvm_anyint_ty], - [llvm_anyfloat_ty], - [IntrNoMem, IntrSpeculatable]>; +def int_wasm_trunc_saturate_signed : + DefaultAttrsIntrinsic<[llvm_anyint_ty], [llvm_anyfloat_ty], + [IntrNoMem, IntrSpeculatable]>; +def int_wasm_trunc_saturate_unsigned : + DefaultAttrsIntrinsic<[llvm_anyint_ty], [llvm_anyfloat_ty], + [IntrNoMem, IntrSpeculatable]>; //===----------------------------------------------------------------------===// // Exception handling intrinsics @@ -102,38 +107,42 @@ // throw / rethrow // The first immediate argument is an index to a tag, which is 0 for C++ // exception. The second argument is the thrown exception pointer. -def int_wasm_throw : Intrinsic<[], [llvm_i32_ty, llvm_ptr_ty], - [Throws, IntrNoReturn, ImmArg>]>; -def int_wasm_rethrow : Intrinsic<[], [], [Throws, IntrNoReturn]>; +def int_wasm_throw : + DefaultAttrsIntrinsic<[], [llvm_i32_ty, llvm_ptr_ty], + [Throws, IntrNoReturn, ImmArg>]>; +def int_wasm_rethrow : DefaultAttrsIntrinsic<[], [], [Throws, IntrNoReturn]>; // Since wasm does not use landingpad instructions, these instructions return // exception pointer and selector values until we lower them in WasmEHPrepare. -def int_wasm_get_exception : Intrinsic<[llvm_ptr_ty], [llvm_token_ty], - [IntrHasSideEffects]>; -def int_wasm_get_ehselector : Intrinsic<[llvm_i32_ty], [llvm_token_ty], - [IntrHasSideEffects]>; +def int_wasm_get_exception : + DefaultAttrsIntrinsic<[llvm_ptr_ty], [llvm_token_ty], [IntrHasSideEffects]>; +def int_wasm_get_ehselector : + DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_token_ty], [IntrHasSideEffects]>; // wasm.catch returns the pointer to the exception object caught by wasm 'catch' // instruction. This returns a single pointer, which is the case for C++ // exceptions. The immediate argument is an index to for a tag, which is 0 for // C++ exceptions. -def int_wasm_catch : Intrinsic<[llvm_ptr_ty], [llvm_i32_ty], - [IntrHasSideEffects, ImmArg>]>; +def int_wasm_catch : + DefaultAttrsIntrinsic<[llvm_ptr_ty], [llvm_i32_ty], + [IntrHasSideEffects, ImmArg>]>; // WebAssembly EH must maintain the landingpads in the order assigned to them // by WasmEHPrepare pass to generate landingpad table in EHStreamer. This is // used in order to give them the indices in WasmEHPrepare. -def int_wasm_landingpad_index: Intrinsic<[], [llvm_token_ty, llvm_i32_ty], - [IntrNoMem, ImmArg>]>; +def int_wasm_landingpad_index : + DefaultAttrsIntrinsic<[], [llvm_token_ty, llvm_i32_ty], + [IntrNoMem, ImmArg>]>; // Returns LSDA address of the current function. -def int_wasm_lsda : Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>; +def int_wasm_lsda : DefaultAttrsIntrinsic<[llvm_ptr_ty], [], [IntrNoMem]>; //===----------------------------------------------------------------------===// // Atomic intrinsics //===----------------------------------------------------------------------===// // wait / notify +// These don't use default attributes, because they are not nosync. def int_wasm_memory_atomic_wait32 : Intrinsic<[llvm_i32_ty], [LLVMPointerType, llvm_i32_ty, llvm_i64_ty], @@ -157,152 +166,153 @@ //===----------------------------------------------------------------------===// def int_wasm_swizzle : - Intrinsic<[llvm_v16i8_ty], - [llvm_v16i8_ty, llvm_v16i8_ty], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_v16i8_ty], + [llvm_v16i8_ty, llvm_v16i8_ty], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_shuffle : - Intrinsic<[llvm_v16i8_ty], - [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty, llvm_i32_ty, - llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, - llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, - llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_v16i8_ty], + [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty, + llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, + llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, + llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, + llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_sub_sat_signed : - Intrinsic<[llvm_anyvector_ty], - [LLVMMatchType<0>, LLVMMatchType<0>], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_anyvector_ty], + [LLVMMatchType<0>, LLVMMatchType<0>], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_sub_sat_unsigned : - Intrinsic<[llvm_anyvector_ty], - [LLVMMatchType<0>, LLVMMatchType<0>], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_anyvector_ty], + [LLVMMatchType<0>, LLVMMatchType<0>], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_avgr_unsigned : - Intrinsic<[llvm_anyvector_ty], - [LLVMMatchType<0>, LLVMMatchType<0>], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_anyvector_ty], + [LLVMMatchType<0>, LLVMMatchType<0>], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_bitselect : - Intrinsic<[llvm_anyvector_ty], - [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_anyvector_ty], + [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_anytrue : - Intrinsic<[llvm_i32_ty], - [llvm_anyvector_ty], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_i32_ty], + [llvm_anyvector_ty], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_alltrue : - Intrinsic<[llvm_i32_ty], - [llvm_anyvector_ty], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_i32_ty], + [llvm_anyvector_ty], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_bitmask : - Intrinsic<[llvm_i32_ty], - [llvm_anyvector_ty], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_i32_ty], + [llvm_anyvector_ty], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_dot : - Intrinsic<[llvm_v4i32_ty], - [llvm_v8i16_ty, llvm_v8i16_ty], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_v4i32_ty], + [llvm_v8i16_ty, llvm_v8i16_ty], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_narrow_signed : - Intrinsic<[llvm_anyvector_ty], - [llvm_anyvector_ty, LLVMMatchType<1>], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_anyvector_ty], + [llvm_anyvector_ty, LLVMMatchType<1>], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_narrow_unsigned : - Intrinsic<[llvm_anyvector_ty], - [llvm_anyvector_ty, LLVMMatchType<1>], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_anyvector_ty], + [llvm_anyvector_ty, LLVMMatchType<1>], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_q15mulr_sat_signed : - Intrinsic<[llvm_v8i16_ty], - [llvm_v8i16_ty, llvm_v8i16_ty], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_v8i16_ty], + [llvm_v8i16_ty, llvm_v8i16_ty], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_pmin : - Intrinsic<[llvm_anyvector_ty], - [LLVMMatchType<0>, LLVMMatchType<0>], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_anyvector_ty], + [LLVMMatchType<0>, LLVMMatchType<0>], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_pmax : - Intrinsic<[llvm_anyvector_ty], - [LLVMMatchType<0>, LLVMMatchType<0>], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_anyvector_ty], + [LLVMMatchType<0>, LLVMMatchType<0>], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_extadd_pairwise_signed : - Intrinsic<[llvm_anyvector_ty], - [LLVMSubdivide2VectorType<0>], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_anyvector_ty], + [LLVMSubdivide2VectorType<0>], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_extadd_pairwise_unsigned : - Intrinsic<[llvm_anyvector_ty], - [LLVMSubdivide2VectorType<0>], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_anyvector_ty], + [LLVMSubdivide2VectorType<0>], + [IntrNoMem, IntrSpeculatable]>; //===----------------------------------------------------------------------===// // Relaxed SIMD intrinsics (experimental) //===----------------------------------------------------------------------===// def int_wasm_fma : - Intrinsic<[llvm_anyvector_ty], - [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_anyvector_ty], + [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_fms : - Intrinsic<[llvm_anyvector_ty], - [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_anyvector_ty], + [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_laneselect : - Intrinsic<[llvm_anyvector_ty], - [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_anyvector_ty], + [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_relaxed_swizzle : - Intrinsic<[llvm_v16i8_ty], - [llvm_v16i8_ty, llvm_v16i8_ty], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_v16i8_ty], + [llvm_v16i8_ty, llvm_v16i8_ty], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_relaxed_min : - Intrinsic<[llvm_anyvector_ty], - [LLVMMatchType<0>, LLVMMatchType<0>], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_anyvector_ty], + [LLVMMatchType<0>, LLVMMatchType<0>], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_relaxed_max : - Intrinsic<[llvm_anyvector_ty], - [LLVMMatchType<0>, LLVMMatchType<0>], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_anyvector_ty], + [LLVMMatchType<0>, LLVMMatchType<0>], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_relaxed_trunc_signed: - Intrinsic<[llvm_v4i32_ty], - [llvm_v4f32_ty], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_v4i32_ty], + [llvm_v4f32_ty], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_relaxed_trunc_unsigned: - Intrinsic<[llvm_v4i32_ty], - [llvm_v4f32_ty], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_v4i32_ty], + [llvm_v4f32_ty], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_relaxed_trunc_signed_zero: - Intrinsic<[llvm_v4i32_ty], - [llvm_v2f64_ty], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_v4i32_ty], + [llvm_v2f64_ty], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_relaxed_trunc_unsigned_zero: - Intrinsic<[llvm_v4i32_ty], - [llvm_v2f64_ty], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_v4i32_ty], + [llvm_v2f64_ty], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_relaxed_q15mulr_signed: - Intrinsic<[llvm_v8i16_ty], - [llvm_v8i16_ty, llvm_v8i16_ty], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_v8i16_ty], + [llvm_v8i16_ty, llvm_v8i16_ty], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_dot_i8x16_i7x16_signed: - Intrinsic<[llvm_v8i16_ty], - [llvm_v16i8_ty, llvm_v16i8_ty], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_v8i16_ty], + [llvm_v16i8_ty, llvm_v16i8_ty], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_dot_i8x16_i7x16_add_signed: - Intrinsic<[llvm_v4i32_ty], - [llvm_v16i8_ty, llvm_v16i8_ty, llvm_v4i32_ty], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_v4i32_ty], + [llvm_v16i8_ty, llvm_v16i8_ty, llvm_v4i32_ty], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_relaxed_dot_bf16x8_add_f32: - Intrinsic<[llvm_v4f32_ty], - [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v4f32_ty], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_v4f32_ty], + [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v4f32_ty], + [IntrNoMem, IntrSpeculatable]>; //===----------------------------------------------------------------------===// @@ -310,18 +320,18 @@ //===----------------------------------------------------------------------===// def int_wasm_tls_size : - Intrinsic<[llvm_anyint_ty], - [], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_anyint_ty], + [], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_tls_align : - Intrinsic<[llvm_anyint_ty], - [], - [IntrNoMem, IntrSpeculatable]>; + DefaultAttrsIntrinsic<[llvm_anyint_ty], + [], + [IntrNoMem, IntrSpeculatable]>; def int_wasm_tls_base : - Intrinsic<[llvm_ptr_ty], - [], - [IntrReadMem]>; + DefaultAttrsIntrinsic<[llvm_ptr_ty], + [], + [IntrReadMem]>; } // TargetPrefix = "wasm" Index: llvm/test/CodeGen/WebAssembly/lower-wasm-ehsjlj.ll =================================================================== --- llvm/test/CodeGen/WebAssembly/lower-wasm-ehsjlj.ll +++ llvm/test/CodeGen/WebAssembly/lower-wasm-ehsjlj.ll @@ -109,7 +109,7 @@ catchret from %2 to label %catchret.dest ; CHECK: catch: ; preds = %catch.start ; CHECK-NEXT: %exn = load i8*, i8** %exn.slot15, align 4 -; CHECK-NEXT: %5 = call i8* @__cxa_begin_catch(i8* %exn) #2 [ "funclet"(token %2) ] +; CHECK-NEXT: %5 = call i8* @__cxa_begin_catch(i8* %exn) #7 [ "funclet"(token %2) ] ; CHECK-NEXT: invoke void @__cxa_end_catch() [ "funclet"(token %2) ] ; CHECK-NEXT: to label %.noexc unwind label %catch.dispatch.longjmp