mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	Utilizing the 8 and 16 bit comparison instructions, even when an input can be folded into the comparison instruction itself, is typically not worth it. There are too many partial register stalls as a result, leading to significant slowdowns. By always performing comparisons on at least 32-bit registers, performance of the calculation chain leading to the comparison improves. Continue to use the smaller comparisons when minimizing size, as that allows better folding of loads into the comparison instructions. rdar://15386341 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@195496 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			117 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
| ; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s
 | |
| ; RUN: llc < %s -disable-simplify-libcalls -mtriple=x86_64-linux | FileCheck %s --check-prefix=NOBUILTIN
 | |
| ; RUN: llc < %s -mtriple=x86_64-win32 | FileCheck %s
 | |
| 
 | |
| ; This tests codegen time inlining/optimization of memcmp
 | |
| ; rdar://6480398
 | |
| 
 | |
| @.str = private constant [23 x i8] c"fooooooooooooooooooooo\00", align 1 ; <[23 x i8]*> [#uses=1]
 | |
| 
 | |
| declare i32 @memcmp(...)
 | |
| 
 | |
| define void @memcmp2(i8* %X, i8* %Y, i32* nocapture %P) nounwind {
 | |
| entry:
 | |
|   %0 = tail call i32 (...)* @memcmp(i8* %X, i8* %Y, i32 2) nounwind ; <i32> [#uses=1]
 | |
|   %1 = icmp eq i32 %0, 0                          ; <i1> [#uses=1]
 | |
|   br i1 %1, label %return, label %bb
 | |
| 
 | |
| bb:                                               ; preds = %entry
 | |
|   store i32 4, i32* %P, align 4
 | |
|   ret void
 | |
| 
 | |
| return:                                           ; preds = %entry
 | |
|   ret void
 | |
| ; CHECK-LABEL: memcmp2:
 | |
| ; CHECK: movzwl
 | |
| ; CHECK-NEXT: movzwl
 | |
| ; CHECK-NEXT: cmpl
 | |
| ; NOBUILTIN-LABEL: memcmp2:
 | |
| ; NOBUILTIN: callq
 | |
| }
 | |
| 
 | |
| define void @memcmp2a(i8* %X, i32* nocapture %P) nounwind {
 | |
| entry:
 | |
|   %0 = tail call i32 (...)* @memcmp(i8* %X, i8* getelementptr inbounds ([23 x i8]* @.str, i32 0, i32 1), i32 2) nounwind ; <i32> [#uses=1]
 | |
|   %1 = icmp eq i32 %0, 0                          ; <i1> [#uses=1]
 | |
|   br i1 %1, label %return, label %bb
 | |
| 
 | |
| bb:                                               ; preds = %entry
 | |
|   store i32 4, i32* %P, align 4
 | |
|   ret void
 | |
| 
 | |
| return:                                           ; preds = %entry
 | |
|   ret void
 | |
| ; CHECK-LABEL: memcmp2a:
 | |
| ; CHECK: movzwl
 | |
| ; CHECK-NEXT: cmpl    $28527,
 | |
| }
 | |
| 
 | |
| 
 | |
| define void @memcmp4(i8* %X, i8* %Y, i32* nocapture %P) nounwind {
 | |
| entry:
 | |
|   %0 = tail call i32 (...)* @memcmp(i8* %X, i8* %Y, i32 4) nounwind ; <i32> [#uses=1]
 | |
|   %1 = icmp eq i32 %0, 0                          ; <i1> [#uses=1]
 | |
|   br i1 %1, label %return, label %bb
 | |
| 
 | |
| bb:                                               ; preds = %entry
 | |
|   store i32 4, i32* %P, align 4
 | |
|   ret void
 | |
| 
 | |
| return:                                           ; preds = %entry
 | |
|   ret void
 | |
| ; CHECK-LABEL: memcmp4:
 | |
| ; CHECK: movl
 | |
| ; CHECK-NEXT: cmpl
 | |
| }
 | |
| 
 | |
| define void @memcmp4a(i8* %X, i32* nocapture %P) nounwind {
 | |
| entry:
 | |
|   %0 = tail call i32 (...)* @memcmp(i8* %X, i8* getelementptr inbounds ([23 x i8]* @.str, i32 0, i32 1), i32 4) nounwind ; <i32> [#uses=1]
 | |
|   %1 = icmp eq i32 %0, 0                          ; <i1> [#uses=1]
 | |
|   br i1 %1, label %return, label %bb
 | |
| 
 | |
| bb:                                               ; preds = %entry
 | |
|   store i32 4, i32* %P, align 4
 | |
|   ret void
 | |
| 
 | |
| return:                                           ; preds = %entry
 | |
|   ret void
 | |
| ; CHECK-LABEL: memcmp4a:
 | |
| ; CHECK: cmpl $1869573999,
 | |
| }
 | |
| 
 | |
| define void @memcmp8(i8* %X, i8* %Y, i32* nocapture %P) nounwind {
 | |
| entry:
 | |
|   %0 = tail call i32 (...)* @memcmp(i8* %X, i8* %Y, i32 8) nounwind ; <i32> [#uses=1]
 | |
|   %1 = icmp eq i32 %0, 0                          ; <i1> [#uses=1]
 | |
|   br i1 %1, label %return, label %bb
 | |
| 
 | |
| bb:                                               ; preds = %entry
 | |
|   store i32 4, i32* %P, align 4
 | |
|   ret void
 | |
| 
 | |
| return:                                           ; preds = %entry
 | |
|   ret void
 | |
| ; CHECK-LABEL: memcmp8:
 | |
| ; CHECK: movq
 | |
| ; CHECK: cmpq
 | |
| }
 | |
| 
 | |
| define void @memcmp8a(i8* %X, i32* nocapture %P) nounwind {
 | |
| entry:
 | |
|   %0 = tail call i32 (...)* @memcmp(i8* %X, i8* getelementptr inbounds ([23 x i8]* @.str, i32 0, i32 0), i32 8) nounwind ; <i32> [#uses=1]
 | |
|   %1 = icmp eq i32 %0, 0                          ; <i1> [#uses=1]
 | |
|   br i1 %1, label %return, label %bb
 | |
| 
 | |
| bb:                                               ; preds = %entry
 | |
|   store i32 4, i32* %P, align 4
 | |
|   ret void
 | |
| 
 | |
| return:                                           ; preds = %entry
 | |
|   ret void
 | |
| ; CHECK-LABEL: memcmp8a:
 | |
| ; CHECK: movabsq $8029759185026510694,
 | |
| ; CHECK: cmpq
 | |
| }
 | |
| 
 |