151 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			LLVM
		
	
	
	
| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
 | |
| ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
 | |
| 
 | |
| ; This test hung in the BranchFolding pass during asm-goto bring up
 | |
| 
 | |
| @e = dso_local global i32 0
 | |
| @j = dso_local global i32 0
 | |
| 
 | |
| define dso_local void @n(i32* %o, i32 %p, i32 %u) nounwind {
 | |
| ; CHECK-LABEL: n:
 | |
| ; CHECK:       # %bb.0: # %entry
 | |
| ; CHECK-NEXT:    pushq %rbp
 | |
| ; CHECK-NEXT:    pushq %r15
 | |
| ; CHECK-NEXT:    pushq %r14
 | |
| ; CHECK-NEXT:    pushq %r13
 | |
| ; CHECK-NEXT:    pushq %r12
 | |
| ; CHECK-NEXT:    pushq %rbx
 | |
| ; CHECK-NEXT:    pushq %rax
 | |
| ; CHECK-NEXT:    movl %edx, %ebx
 | |
| ; CHECK-NEXT:    movl %esi, %r12d
 | |
| ; CHECK-NEXT:    movq %rdi, %r15
 | |
| ; CHECK-NEXT:    callq c
 | |
| ; CHECK-NEXT:    movl %eax, %r13d
 | |
| ; CHECK-NEXT:    movq %r15, %rdi
 | |
| ; CHECK-NEXT:    callq l
 | |
| ; CHECK-NEXT:    testl %eax, %eax
 | |
| ; CHECK-NEXT:    jne .LBB0_10
 | |
| ; CHECK-NEXT:  # %bb.1: # %if.end
 | |
| ; CHECK-NEXT:    movl %ebx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
 | |
| ; CHECK-NEXT:    cmpl $0, {{.*}}(%rip)
 | |
| ; CHECK-NEXT:    # implicit-def: $ebx
 | |
| ; CHECK-NEXT:    # implicit-def: $r14d
 | |
| ; CHECK-NEXT:    je .LBB0_4
 | |
| ; CHECK-NEXT:  # %bb.2: # %if.then4
 | |
| ; CHECK-NEXT:    movslq %r12d, %rdi
 | |
| ; CHECK-NEXT:    callq m
 | |
| ; CHECK-NEXT:    # implicit-def: $ebx
 | |
| ; CHECK-NEXT:    # implicit-def: $ebp
 | |
| ; CHECK-NEXT:  .LBB0_3: # %r
 | |
| ; CHECK-NEXT:    callq c
 | |
| ; CHECK-NEXT:    movl %ebp, %r14d
 | |
| ; CHECK-NEXT:  .LBB0_4: # %if.end8
 | |
| ; CHECK-NEXT:    movl %ebx, %edi
 | |
| ; CHECK-NEXT:    callq i
 | |
| ; CHECK-NEXT:    movl %eax, %ebp
 | |
| ; CHECK-NEXT:    orl %r14d, %ebp
 | |
| ; CHECK-NEXT:    testl %r13d, %r13d
 | |
| ; CHECK-NEXT:    je .LBB0_6
 | |
| ; CHECK-NEXT:  # %bb.5:
 | |
| ; CHECK-NEXT:    andl $4, %ebx
 | |
| ; CHECK-NEXT:    jmp .LBB0_3
 | |
| ; CHECK-NEXT:  .LBB0_6: # %if.end12
 | |
| ; CHECK-NEXT:    testl %ebp, %ebp
 | |
| ; CHECK-NEXT:    je .LBB0_9
 | |
| ; CHECK-NEXT:  # %bb.7: # %if.then14
 | |
| ; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
 | |
| ; CHECK-NEXT:    #APP
 | |
| ; CHECK-NEXT:    #NO_APP
 | |
| ; CHECK-NEXT:    jmp .LBB0_10
 | |
| ; CHECK-NEXT:  .Ltmp0: # Block address taken
 | |
| ; CHECK-NEXT:  # %bb.8: # %if.then20.critedge
 | |
| ; CHECK-NEXT:    movl {{.*}}(%rip), %edi
 | |
| ; CHECK-NEXT:    movslq %eax, %rcx
 | |
| ; CHECK-NEXT:    movl $1, %esi
 | |
| ; CHECK-NEXT:    movq %r15, %rdx
 | |
| ; CHECK-NEXT:    addq $8, %rsp
 | |
| ; CHECK-NEXT:    popq %rbx
 | |
| ; CHECK-NEXT:    popq %r12
 | |
| ; CHECK-NEXT:    popq %r13
 | |
| ; CHECK-NEXT:    popq %r14
 | |
| ; CHECK-NEXT:    popq %r15
 | |
| ; CHECK-NEXT:    popq %rbp
 | |
| ; CHECK-NEXT:    jmp k # TAILCALL
 | |
| ; CHECK-NEXT:  .LBB0_9: # %if.else
 | |
| ; CHECK-NEXT:    incq 0
 | |
| ; CHECK-NEXT:  .LBB0_10: # %cleanup
 | |
| ; CHECK-NEXT:    addq $8, %rsp
 | |
| ; CHECK-NEXT:    popq %rbx
 | |
| ; CHECK-NEXT:    popq %r12
 | |
| ; CHECK-NEXT:    popq %r13
 | |
| ; CHECK-NEXT:    popq %r14
 | |
| ; CHECK-NEXT:    popq %r15
 | |
| ; CHECK-NEXT:    popq %rbp
 | |
| ; CHECK-NEXT:    retq
 | |
| entry:
 | |
|   %call = tail call i32 @c()
 | |
|   %call1 = tail call i32 @l(i32* %o)
 | |
|   %tobool = icmp eq i32 %call1, 0
 | |
|   br i1 %tobool, label %if.end, label %cleanup
 | |
| 
 | |
| if.end:                                           ; preds = %entry
 | |
|   %0 = load i32, i32* @e
 | |
|   %tobool3 = icmp eq i32 %0, 0
 | |
|   br i1 %tobool3, label %if.end8, label %if.then4, !prof !0
 | |
| 
 | |
| if.then4:                                         ; preds = %if.end
 | |
|   %conv5 = sext i32 %p to i64
 | |
|   %call6 = tail call i32 @m(i64 %conv5)
 | |
|   br label %r
 | |
| 
 | |
| r:                                                ; preds = %if.end8, %if.then4
 | |
|   %flags.0 = phi i32 [ undef, %if.then4 ], [ %and, %if.end8 ]
 | |
|   %major.0 = phi i32 [ undef, %if.then4 ], [ %or, %if.end8 ]
 | |
|   %call7 = tail call i32 @c()
 | |
|   br label %if.end8
 | |
| 
 | |
| if.end8:                                          ; preds = %r, %if.end
 | |
|   %flags.1 = phi i32 [ %flags.0, %r ], [ undef, %if.end ]
 | |
|   %major.1 = phi i32 [ %major.0, %r ], [ undef, %if.end ]
 | |
|   %call9 = tail call i32 @i(i32 %flags.1)
 | |
|   %or = or i32 %call9, %major.1
 | |
|   %and = and i32 %flags.1, 4
 | |
|   %tobool10 = icmp eq i32 %call, 0
 | |
|   br i1 %tobool10, label %if.end12, label %r
 | |
| 
 | |
| if.end12:                                         ; preds = %if.end8
 | |
|   %tobool13 = icmp eq i32 %or, 0
 | |
|   br i1 %tobool13, label %if.else, label %if.then14
 | |
| 
 | |
| if.then14:                                        ; preds = %if.end12
 | |
|   callbr void asm sideeffect "", "X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@n, %if.then20.critedge))
 | |
|           to label %cleanup [label %if.then20.critedge]
 | |
| 
 | |
| if.then20.critedge:                               ; preds = %if.then14
 | |
|   %1 = load i32, i32* @j
 | |
|   %conv21 = sext i32 %u to i64
 | |
|   %call22 = tail call i32 @k(i32 %1, i64 1, i32* %o, i64 %conv21)
 | |
|   br label %cleanup
 | |
| 
 | |
| if.else:                                          ; preds = %if.end12
 | |
|   %2 = load i64, i64* null
 | |
|   %inc = add i64 %2, 1
 | |
|   store i64 %inc, i64* null
 | |
|   br label %cleanup
 | |
| 
 | |
| cleanup:                                          ; preds = %if.else, %if.then20.critedge, %if.then14, %entry
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| declare dso_local i32 @c()
 | |
| 
 | |
| declare dso_local i32 @l(i32*)
 | |
| 
 | |
| declare dso_local i32 @m(i64)
 | |
| 
 | |
| declare dso_local i32 @i(i32)
 | |
| 
 | |
| declare dso_local i32 @k(i32, i64, i32*, i64)
 | |
| 
 | |
| !0 = !{!"branch_weights", i32 2000, i32 1}
 |