# Assembly generated from building the followingC++ code with the following
# command using trunk clang. Then, basic block at .LBB1_7 was moved before the
# landing pad.
#
# clang --target=x86_64-linux -O2 -fPIC -fno-inline exceptions-failed-split.cpp
#
#		#include <stdio.h>
#		#include <stdint.h>
#
#		void bar(int a) {
#			if (a > 2 && a % 2)
#				throw new int();
#		}
#
#		uint64_t throw_test(int argc, char **argv) {
#			uint64_t rv = 0;
#
#			if (argc == 99)
#				return 0;
#
#			uint64_t limit = (argc >= 2 ? 10 : 5000);
#			for (uint64_t i = 0; i < limit; ++i) {
#				rv += i;
#				try  {
#					bar(argc);
#				} catch (...) {
#				}
#			}
#
#			if (argc == 5)
#				return 0;
#
#			if (argc == 7)
#				return 0;
#
#			if (argc >= 103 && argc <= 203)
#				return 0;
#
#			if (*argv == 0)
#				return 0;
#
#			if (argc >= 13 && argc <= 23)
#				return 0;
#
#			return rv;
#		}
#
#		int main(int argc, char **argv) {
#			return !throw_test(argc, argv);
#		}

	.text
	.file	"exceptions-failed-split.cpp"
	.globl	_Z3bari                         # -- Begin function _Z3bari
	.p2align	4, 0x90
	.type	_Z3bari,@function
_Z3bari:                                # @_Z3bari
.Lfunc_begin0:
	.cfi_startproc
	.cfi_personality 155, DW.ref.__gxx_personality_v0
	.cfi_lsda 27, .Lexception0
# %bb.0:                                # %entry
	pushq	%r14
	.cfi_def_cfa_offset 16
	pushq	%rbx
	.cfi_def_cfa_offset 24
	pushq	%rax
	.cfi_def_cfa_offset 32
	.cfi_offset %rbx, -24
	.cfi_offset %r14, -16
	cmpl	$3, %edi
	jl	.LBB0_5
# %bb.1:                                # %entry
	andl	$1, %edi
	jne	.LBB0_2
.LBB0_5:                                # %if.end
	addq	$8, %rsp
	.cfi_def_cfa_offset 24
	popq	%rbx
	.cfi_def_cfa_offset 16
	popq	%r14
	.cfi_def_cfa_offset 8
	retq
.LBB0_2:                                # %if.then
	.cfi_def_cfa_offset 32
	movl	$8, %edi
	callq	__cxa_allocate_exception@PLT
	movq	%rax, %rbx
.Ltmp0:
	movl	$4, %edi
	callq	_Znwm@PLT
.Ltmp1:
# %bb.3:                                # %invoke.cont
	movl	$0, (%rax)
	movq	%rax, (%rbx)
	movq	_ZTIPi@GOTPCREL(%rip), %rsi
	movq	%rbx, %rdi
	xorl	%edx, %edx
	callq	__cxa_throw@PLT
.LBB0_4:                                # %lpad
.Ltmp2:
	movq	%rax, %r14
	movq	%rbx, %rdi
	callq	__cxa_free_exception@PLT
	movq	%r14, %rdi
	callq	_Unwind_Resume@PLT
.Lfunc_end0:
	.size	_Z3bari, .Lfunc_end0-_Z3bari
	.cfi_endproc
	.section	.gcc_except_table,"a",@progbits
	.p2align	2
GCC_except_table0:
.Lexception0:
	.byte	255                             # @LPStart Encoding = omit
	.byte	255                             # @TType Encoding = omit
	.byte	1                               # Call site Encoding = uleb128
	.uleb128 .Lcst_end0-.Lcst_begin0
.Lcst_begin0:
	.uleb128 .Lfunc_begin0-.Lfunc_begin0    # >> Call Site 1 <<
	.uleb128 .Ltmp0-.Lfunc_begin0           #   Call between .Lfunc_begin0 and .Ltmp0
	.byte	0                               #     has no landing pad
	.byte	0                               #   On action: cleanup
	.uleb128 .Ltmp0-.Lfunc_begin0           # >> Call Site 2 <<
	.uleb128 .Ltmp1-.Ltmp0                  #   Call between .Ltmp0 and .Ltmp1
	.uleb128 .Ltmp2-.Lfunc_begin0           #     jumps to .Ltmp2
	.byte	0                               #   On action: cleanup
	.uleb128 .Ltmp1-.Lfunc_begin0           # >> Call Site 3 <<
	.uleb128 .Lfunc_end0-.Ltmp1             #   Call between .Ltmp1 and .Lfunc_end0
	.byte	0                               #     has no landing pad
	.byte	0                               #   On action: cleanup
.Lcst_end0:
	.p2align	2
                                        # -- End function
	.text
	.globl	_Z10throw_testiPPc              # -- Begin function _Z10throw_testiPPc
	.p2align	4, 0x90
	.type	_Z10throw_testiPPc,@function
_Z10throw_testiPPc:                     # @_Z10throw_testiPPc
.Lfunc_begin1:
	.cfi_startproc
	.cfi_personality 155, DW.ref.__gxx_personality_v0
	.cfi_lsda 27, .Lexception1
# %bb.0:                                # %entry
	pushq	%r15
	.cfi_def_cfa_offset 16
	pushq	%r14
	.cfi_def_cfa_offset 24
	pushq	%r13
	.cfi_def_cfa_offset 32
	pushq	%r12
	.cfi_def_cfa_offset 40
	pushq	%rbx
	.cfi_def_cfa_offset 48
	.cfi_offset %rbx, -48
	.cfi_offset %r12, -40
	.cfi_offset %r13, -32
	.cfi_offset %r14, -24
	.cfi_offset %r15, -16
	cmpl	$99, %edi
	je	.LBB1_7
# %bb.2:                                # %if.end
	movq	%rsi, %r15
	movl	%edi, %r14d
	cmpl	$2, %edi
	movl	$10, %eax
	movl	$5000, %r12d                    # imm = 0x1388
	cmovgeq	%rax, %r12
	xorl	%r13d, %r13d
	xorl	%ebx, %ebx
	.p2align	4, 0x90
.LBB1_3:                                # %for.body
                                        # =>This Inner Loop Header: Depth=1
.Ltmp3:
	movl	%r14d, %edi
	callq	_Z3bari@PLT
.Ltmp4:
.LBB1_4:                                # %for.inc
                                        #   in Loop: Header=BB1_3 Depth=1
	addq	%rbx, %r13
	incq	%rbx
	cmpq	%rbx, %r12
	jne	.LBB1_3
	jmp	.LBB1_6
.LBB1_7:
	xorl	%r13d, %r13d
  jmp .LBB1_8
.LBB1_5:                                # %lpad
                                        #   in Loop: Header=BB1_3 Depth=1
.Ltmp5:
	movq	%rax, %rdi
	callq	__cxa_begin_catch@PLT
	callq	__cxa_end_catch@PLT
	jmp	.LBB1_4
.LBB1_6:                                # %for.cond.cleanup
	movl	%r14d, %eax
	orl	$2, %eax
	cmpl	$7, %eax
	jne	.LBB1_9
  jmp .LBB1_7
.LBB1_8:                                # %cleanup21
	movq	%r13, %rax
	popq	%rbx
	.cfi_def_cfa_offset 40
	popq	%r12
	.cfi_def_cfa_offset 32
	popq	%r13
	.cfi_def_cfa_offset 24
	popq	%r14
	.cfi_def_cfa_offset 16
	popq	%r15
	.cfi_def_cfa_offset 8
	retq
.LBB1_9:                                # %if.end8
	.cfi_def_cfa_offset 48
	leal	-103(%r14), %eax
	cmpl	$101, %eax
	jb	.LBB1_7
# %bb.11:                               # %if.end12
	cmpq	$0, (%r15)
	je	.LBB1_7
# %bb.12:                               # %if.end15
	addl	$-13, %r14d
	xorl	%eax, %eax
	cmpl	$11, %r14d
	cmovbq	%rax, %r13
	jmp	.LBB1_8
.Lfunc_end1:
	.size	_Z10throw_testiPPc, .Lfunc_end1-_Z10throw_testiPPc
	.cfi_endproc
	.section	.gcc_except_table,"a",@progbits
	.p2align	2
GCC_except_table1:
.Lexception1:
	.byte	255                             # @LPStart Encoding = omit
	.byte	155                             # @TType Encoding = indirect pcrel sdata4
	.uleb128 .Lttbase0-.Lttbaseref0
.Lttbaseref0:
	.byte	1                               # Call site Encoding = uleb128
	.uleb128 .Lcst_end1-.Lcst_begin1
.Lcst_begin1:
	.uleb128 .Ltmp3-.Lfunc_begin1           # >> Call Site 1 <<
	.uleb128 .Ltmp4-.Ltmp3                  #   Call between .Ltmp3 and .Ltmp4
	.uleb128 .Ltmp5-.Lfunc_begin1           #     jumps to .Ltmp5
	.byte	1                               #   On action: 1
	.uleb128 .Ltmp4-.Lfunc_begin1           # >> Call Site 2 <<
	.uleb128 .Lfunc_end1-.Ltmp4             #   Call between .Ltmp4 and .Lfunc_end1
	.byte	0                               #     has no landing pad
	.byte	0                               #   On action: cleanup
.Lcst_end1:
	.byte	1                               # >> Action Record 1 <<
                                        #   Catch TypeInfo 1
	.byte	0                               #   No further actions
	.p2align	2
                                        # >> Catch TypeInfos <<
	.long	0                               # TypeInfo 1
.Lttbase0:
	.p2align	2
                                        # -- End function
	.text
	.globl	main                            # -- Begin function main
	.p2align	4, 0x90
	.type	main,@function
main:                                   # @main
	.cfi_startproc
# %bb.0:                                # %entry
	pushq	%rax
	.cfi_def_cfa_offset 16
	callq	_Z10throw_testiPPc@PLT
	xorl	%ecx, %ecx
	testq	%rax, %rax
	sete	%cl
	movl	%ecx, %eax
	popq	%rcx
	.cfi_def_cfa_offset 8
	retq
.Lfunc_end2:
	.size	main, .Lfunc_end2-main
	.cfi_endproc
                                        # -- End function
	.hidden	DW.ref.__gxx_personality_v0
	.weak	DW.ref.__gxx_personality_v0
	.section	.data.DW.ref.__gxx_personality_v0,"aGw",@progbits,DW.ref.__gxx_personality_v0,comdat
	.p2align	3
	.type	DW.ref.__gxx_personality_v0,@object
	.size	DW.ref.__gxx_personality_v0, 8
DW.ref.__gxx_personality_v0:
	.quad	__gxx_personality_v0
	.ident	"clang version 15.0.0"
	.section	".note.GNU-stack","",@progbits
	.addrsig
	.addrsig_sym __gxx_personality_v0
	.addrsig_sym _Unwind_Resume
	.addrsig_sym _ZTIPi
