72 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			LLVM
		
	
	
	
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
 | 
						|
; RUN: llc -mtriple=i686-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,X86
 | 
						|
; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,X64
 | 
						|
 | 
						|
; On X86, division in expensive. BuildRemEqFold should therefore run even
 | 
						|
; when optimizing for size. Only optimizing for minimum size retains a plain div.
 | 
						|
 | 
						|
define i32 @test_minsize(i32 %X) optsize minsize nounwind readnone {
 | 
						|
; X86-LABEL: test_minsize:
 | 
						|
; X86:       # %bb.0:
 | 
						|
; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
 | 
						|
; X86-NEXT:    pushl $5
 | 
						|
; X86-NEXT:    popl %ecx
 | 
						|
; X86-NEXT:    xorl %edx, %edx
 | 
						|
; X86-NEXT:    divl %ecx
 | 
						|
; X86-NEXT:    testl %edx, %edx
 | 
						|
; X86-NEXT:    je .LBB0_1
 | 
						|
; X86-NEXT:  # %bb.2:
 | 
						|
; X86-NEXT:    pushl $-10
 | 
						|
; X86-NEXT:    popl %eax
 | 
						|
; X86-NEXT:    retl
 | 
						|
; X86-NEXT:  .LBB0_1:
 | 
						|
; X86-NEXT:    pushl $42
 | 
						|
; X86-NEXT:    popl %eax
 | 
						|
; X86-NEXT:    retl
 | 
						|
;
 | 
						|
; X64-LABEL: test_minsize:
 | 
						|
; X64:       # %bb.0:
 | 
						|
; X64-NEXT:    movl %edi, %eax
 | 
						|
; X64-NEXT:    pushq $5
 | 
						|
; X64-NEXT:    popq %rcx
 | 
						|
; X64-NEXT:    xorl %edx, %edx
 | 
						|
; X64-NEXT:    divl %ecx
 | 
						|
; X64-NEXT:    testl %edx, %edx
 | 
						|
; X64-NEXT:    pushq $42
 | 
						|
; X64-NEXT:    popq %rcx
 | 
						|
; X64-NEXT:    pushq $-10
 | 
						|
; X64-NEXT:    popq %rax
 | 
						|
; X64-NEXT:    cmovel %ecx, %eax
 | 
						|
; X64-NEXT:    retq
 | 
						|
  %rem = urem i32 %X, 5
 | 
						|
  %cmp = icmp eq i32 %rem, 0
 | 
						|
  %ret = select i1 %cmp, i32 42, i32 -10
 | 
						|
  ret i32 %ret
 | 
						|
}
 | 
						|
 | 
						|
define i32 @test_optsize(i32 %X) optsize nounwind readnone {
 | 
						|
; X86-LABEL: test_optsize:
 | 
						|
; X86:       # %bb.0:
 | 
						|
; X86-NEXT:    imull $-858993459, {{[0-9]+}}(%esp), %eax # imm = 0xCCCCCCCD
 | 
						|
; X86-NEXT:    cmpl $858993460, %eax # imm = 0x33333334
 | 
						|
; X86-NEXT:    movl $42, %eax
 | 
						|
; X86-NEXT:    jb .LBB1_2
 | 
						|
; X86-NEXT:  # %bb.1:
 | 
						|
; X86-NEXT:    movl $-10, %eax
 | 
						|
; X86-NEXT:  .LBB1_2:
 | 
						|
; X86-NEXT:    retl
 | 
						|
;
 | 
						|
; X64-LABEL: test_optsize:
 | 
						|
; X64:       # %bb.0:
 | 
						|
; X64-NEXT:    imull $-858993459, %edi, %eax # imm = 0xCCCCCCCD
 | 
						|
; X64-NEXT:    cmpl $858993460, %eax # imm = 0x33333334
 | 
						|
; X64-NEXT:    movl $42, %ecx
 | 
						|
; X64-NEXT:    movl $-10, %eax
 | 
						|
; X64-NEXT:    cmovbl %ecx, %eax
 | 
						|
; X64-NEXT:    retq
 | 
						|
  %rem = urem i32 %X, 5
 | 
						|
  %cmp = icmp eq i32 %rem, 0
 | 
						|
  %ret = select i1 %cmp, i32 42, i32 -10
 | 
						|
  ret i32 %ret
 | 
						|
}
 |