93 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			LLVM
		
	
	
	
| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
 | |
| ; RUN: llc -mtriple=thumbv8m.main-none-none-eabi %s -o - -verify-machineinstrs | FileCheck %s
 | |
| 
 | |
| declare i32 @fn(i32) #0
 | |
| 
 | |
| define i32 @f1(i32 %a) #0 {
 | |
| ; CHECK-LABEL: f1:
 | |
| ; CHECK:       @ %bb.0: @ %entry
 | |
| ; CHECK-NEXT:    .save {r4, lr}
 | |
| ; CHECK-NEXT:    push {r4, lr}
 | |
| ; CHECK-NEXT:    mov r4, r0
 | |
| ; CHECK-NEXT:    bl fn
 | |
| ; CHECK-NEXT:    movs r0, #0
 | |
| ; CHECK-NEXT:    cbz r4, .LBB0_2
 | |
| ; CHECK-NEXT:  @ %bb.1: @ %return
 | |
| ; CHECK-NEXT:    pop {r4, pc}
 | |
| ; CHECK-NEXT:  .LBB0_2: @ %if.end
 | |
| ; CHECK-NEXT:    bl fn
 | |
| ; CHECK-NEXT:    adds r0, #1
 | |
| ; CHECK-NEXT:    pop {r4, pc}
 | |
| entry:
 | |
|   %call = tail call i32 @fn(i32 %a) #2
 | |
|   %tobool = icmp eq i32 %a, 0
 | |
|   br i1 %tobool, label %if.end, label %return
 | |
| 
 | |
| if.end:                                           ; preds = %entry
 | |
|   %call1 = tail call i32 @fn(i32 0) #2
 | |
|   %add = add nsw i32 %call1, 1
 | |
|   br label %return
 | |
| 
 | |
| return:                                           ; preds = %entry, %if.end
 | |
|   %retval.0 = phi i32 [ %add, %if.end ], [ 0, %entry ]
 | |
|   ret i32 %retval.0
 | |
| }
 | |
| 
 | |
| define i32 @f2(i32 %a) #0 {
 | |
| ; CHECK-LABEL: f2:
 | |
| ; CHECK:       @ %bb.0: @ %entry
 | |
| ; CHECK-NEXT:    .save {r4, lr}
 | |
| ; CHECK-NEXT:    push {r4, lr}
 | |
| ; CHECK-NEXT:    mov r4, r0
 | |
| ; CHECK-NEXT:    bl fn
 | |
| ; CHECK-NEXT:    movs r0, #0
 | |
| ; CHECK-NEXT:    cmp r4, #1
 | |
| ; CHECK-NEXT:    bne .LBB1_2
 | |
| ; CHECK-NEXT:  @ %bb.1: @ %if.end
 | |
| ; CHECK-NEXT:    bl fn
 | |
| ; CHECK-NEXT:    adds r0, #1
 | |
| ; CHECK-NEXT:  .LBB1_2: @ %return
 | |
| ; CHECK-NEXT:    pop {r4, pc}
 | |
| entry:
 | |
|   %call = tail call i32 @fn(i32 %a) #2
 | |
|   %tobool = icmp eq i32 %a, 1
 | |
|   br i1 %tobool, label %if.end, label %return
 | |
| 
 | |
| if.end:                                           ; preds = %entry
 | |
|   %call1 = tail call i32 @fn(i32 0) #2
 | |
|   %add = add nsw i32 %call1, 1
 | |
|   br label %return
 | |
| 
 | |
| return:                                           ; preds = %entry, %if.end
 | |
|   %retval.0 = phi i32 [ %add, %if.end ], [ 0, %entry ]
 | |
|   ret i32 %retval.0
 | |
| }
 | |
| 
 | |
| define void @f3(i32 %x) #0 {
 | |
| ; CHECK-LABEL: f3:
 | |
| ; CHECK:       @ %bb.0: @ %entry
 | |
| ; CHECK-NEXT:    cmp r0, #1
 | |
| ; CHECK-NEXT:    bne .LBB2_2
 | |
| ; CHECK-NEXT:  @ %bb.1: @ %t
 | |
| ; CHECK-NEXT:    .save {r7, lr}
 | |
| ; CHECK-NEXT:    push {r7, lr}
 | |
| ; CHECK-NEXT:    movs r0, #0
 | |
| ; CHECK-NEXT:    bl fn
 | |
| ; CHECK-NEXT:    pop.w {r7, lr}
 | |
| ; CHECK-NEXT:  .LBB2_2: @ %f
 | |
| ; CHECK-NEXT:    bx lr
 | |
| entry:
 | |
|   %p = icmp eq i32 %x, 1
 | |
|   br i1 %p, label %t, label %f
 | |
| 
 | |
| t:
 | |
|   call i32 @fn(i32 0)
 | |
|   br label %f
 | |
| 
 | |
| f:
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| attributes #0 = { minsize nounwind optsize }
 | |
| 
 |