| NAKAMURA Takumi | e463e07 | 2011-02-22 07:20:52 +0000 | [diff] [blame] | 1 | ; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s | 
| Bob Wilson | fa59485 | 2012-08-03 21:26:18 +0000 | [diff] [blame^] | 2 | ; RUN: llc < %s -disable-simplify-libcalls -mtriple=x86_64-linux | FileCheck %s --check-prefix=NOBUILTIN | 
| NAKAMURA Takumi | e463e07 | 2011-02-22 07:20:52 +0000 | [diff] [blame] | 3 | ; RUN: llc < %s -mtriple=x86_64-win32 | FileCheck %s | 
| Chris Lattner | 1a32ede | 2009-12-24 00:37:38 +0000 | [diff] [blame] | 4 |  | 
|  | 5 | ; This tests codegen time inlining/optimization of memcmp | 
|  | 6 | ; rdar://6480398 | 
|  | 7 |  | 
| Chris Lattner | f5e3ed6 | 2009-12-24 01:07:17 +0000 | [diff] [blame] | 8 | @.str = private constant [23 x i8] c"fooooooooooooooooooooo\00", align 1 ; <[23 x i8]*> [#uses=1] | 
| Chris Lattner | 1a32ede | 2009-12-24 00:37:38 +0000 | [diff] [blame] | 9 |  | 
|  | 10 | declare i32 @memcmp(...) | 
|  | 11 |  | 
|  | 12 | define void @memcmp2(i8* %X, i8* %Y, i32* nocapture %P) nounwind { | 
|  | 13 | entry: | 
|  | 14 | %0 = tail call i32 (...)* @memcmp(i8* %X, i8* %Y, i32 2) nounwind ; <i32> [#uses=1] | 
|  | 15 | %1 = icmp eq i32 %0, 0                          ; <i1> [#uses=1] | 
|  | 16 | br i1 %1, label %return, label %bb | 
|  | 17 |  | 
|  | 18 | bb:                                               ; preds = %entry | 
|  | 19 | store i32 4, i32* %P, align 4 | 
|  | 20 | ret void | 
|  | 21 |  | 
|  | 22 | return:                                           ; preds = %entry | 
|  | 23 | ret void | 
|  | 24 | ; CHECK: memcmp2: | 
| NAKAMURA Takumi | e463e07 | 2011-02-22 07:20:52 +0000 | [diff] [blame] | 25 | ; CHECK: movw    ([[A0:%rdi|%rcx]]), %ax | 
|  | 26 | ; CHECK: cmpw    ([[A1:%rsi|%rdx]]), %ax | 
| Bob Wilson | fa59485 | 2012-08-03 21:26:18 +0000 | [diff] [blame^] | 27 | ; NOBUILTIN: memcmp2: | 
|  | 28 | ; NOBUILTIN: callq | 
| Chris Lattner | 1a32ede | 2009-12-24 00:37:38 +0000 | [diff] [blame] | 29 | } | 
|  | 30 |  | 
|  | 31 | define void @memcmp2a(i8* %X, i32* nocapture %P) nounwind { | 
|  | 32 | entry: | 
| Chris Lattner | f5e3ed6 | 2009-12-24 01:07:17 +0000 | [diff] [blame] | 33 | %0 = tail call i32 (...)* @memcmp(i8* %X, i8* getelementptr inbounds ([23 x i8]* @.str, i32 0, i32 1), i32 2) nounwind ; <i32> [#uses=1] | 
| Chris Lattner | 1a32ede | 2009-12-24 00:37:38 +0000 | [diff] [blame] | 34 | %1 = icmp eq i32 %0, 0                          ; <i1> [#uses=1] | 
|  | 35 | br i1 %1, label %return, label %bb | 
|  | 36 |  | 
|  | 37 | bb:                                               ; preds = %entry | 
|  | 38 | store i32 4, i32* %P, align 4 | 
|  | 39 | ret void | 
|  | 40 |  | 
|  | 41 | return:                                           ; preds = %entry | 
|  | 42 | ret void | 
|  | 43 | ; CHECK: memcmp2a: | 
| NAKAMURA Takumi | e463e07 | 2011-02-22 07:20:52 +0000 | [diff] [blame] | 44 | ; CHECK: cmpw    $28527, ([[A0]]) | 
| Chris Lattner | 1a32ede | 2009-12-24 00:37:38 +0000 | [diff] [blame] | 45 | } | 
|  | 46 |  | 
|  | 47 |  | 
|  | 48 | define void @memcmp4(i8* %X, i8* %Y, i32* nocapture %P) nounwind { | 
|  | 49 | entry: | 
|  | 50 | %0 = tail call i32 (...)* @memcmp(i8* %X, i8* %Y, i32 4) nounwind ; <i32> [#uses=1] | 
|  | 51 | %1 = icmp eq i32 %0, 0                          ; <i1> [#uses=1] | 
|  | 52 | br i1 %1, label %return, label %bb | 
|  | 53 |  | 
|  | 54 | bb:                                               ; preds = %entry | 
|  | 55 | store i32 4, i32* %P, align 4 | 
|  | 56 | ret void | 
|  | 57 |  | 
|  | 58 | return:                                           ; preds = %entry | 
|  | 59 | ret void | 
|  | 60 | ; CHECK: memcmp4: | 
| NAKAMURA Takumi | e463e07 | 2011-02-22 07:20:52 +0000 | [diff] [blame] | 61 | ; CHECK: movl    ([[A0]]), %eax | 
|  | 62 | ; CHECK: cmpl    ([[A1]]), %eax | 
| Chris Lattner | 1a32ede | 2009-12-24 00:37:38 +0000 | [diff] [blame] | 63 | } | 
|  | 64 |  | 
|  | 65 | define void @memcmp4a(i8* %X, i32* nocapture %P) nounwind { | 
|  | 66 | entry: | 
| Chris Lattner | f5e3ed6 | 2009-12-24 01:07:17 +0000 | [diff] [blame] | 67 | %0 = tail call i32 (...)* @memcmp(i8* %X, i8* getelementptr inbounds ([23 x i8]* @.str, i32 0, i32 1), i32 4) nounwind ; <i32> [#uses=1] | 
| Chris Lattner | 1a32ede | 2009-12-24 00:37:38 +0000 | [diff] [blame] | 68 | %1 = icmp eq i32 %0, 0                          ; <i1> [#uses=1] | 
|  | 69 | br i1 %1, label %return, label %bb | 
|  | 70 |  | 
|  | 71 | bb:                                               ; preds = %entry | 
|  | 72 | store i32 4, i32* %P, align 4 | 
|  | 73 | ret void | 
|  | 74 |  | 
|  | 75 | return:                                           ; preds = %entry | 
|  | 76 | ret void | 
|  | 77 | ; CHECK: memcmp4a: | 
| NAKAMURA Takumi | e463e07 | 2011-02-22 07:20:52 +0000 | [diff] [blame] | 78 | ; CHECK: cmpl $1869573999, ([[A0]]) | 
| Chris Lattner | f5e3ed6 | 2009-12-24 01:07:17 +0000 | [diff] [blame] | 79 | } | 
|  | 80 |  | 
|  | 81 | define void @memcmp8(i8* %X, i8* %Y, i32* nocapture %P) nounwind { | 
|  | 82 | entry: | 
|  | 83 | %0 = tail call i32 (...)* @memcmp(i8* %X, i8* %Y, i32 8) nounwind ; <i32> [#uses=1] | 
|  | 84 | %1 = icmp eq i32 %0, 0                          ; <i1> [#uses=1] | 
|  | 85 | br i1 %1, label %return, label %bb | 
|  | 86 |  | 
|  | 87 | bb:                                               ; preds = %entry | 
|  | 88 | store i32 4, i32* %P, align 4 | 
|  | 89 | ret void | 
|  | 90 |  | 
|  | 91 | return:                                           ; preds = %entry | 
|  | 92 | ret void | 
|  | 93 | ; CHECK: memcmp8: | 
| NAKAMURA Takumi | e463e07 | 2011-02-22 07:20:52 +0000 | [diff] [blame] | 94 | ; CHECK: movq    ([[A0]]), %rax | 
|  | 95 | ; CHECK: cmpq    ([[A1]]), %rax | 
| Chris Lattner | f5e3ed6 | 2009-12-24 01:07:17 +0000 | [diff] [blame] | 96 | } | 
|  | 97 |  | 
|  | 98 | define void @memcmp8a(i8* %X, i32* nocapture %P) nounwind { | 
|  | 99 | entry: | 
|  | 100 | %0 = tail call i32 (...)* @memcmp(i8* %X, i8* getelementptr inbounds ([23 x i8]* @.str, i32 0, i32 0), i32 8) nounwind ; <i32> [#uses=1] | 
|  | 101 | %1 = icmp eq i32 %0, 0                          ; <i1> [#uses=1] | 
|  | 102 | br i1 %1, label %return, label %bb | 
|  | 103 |  | 
|  | 104 | bb:                                               ; preds = %entry | 
|  | 105 | store i32 4, i32* %P, align 4 | 
|  | 106 | ret void | 
|  | 107 |  | 
|  | 108 | return:                                           ; preds = %entry | 
|  | 109 | ret void | 
|  | 110 | ; CHECK: memcmp8a: | 
|  | 111 | ; CHECK: movabsq $8029759185026510694, %rax | 
| NAKAMURA Takumi | e463e07 | 2011-02-22 07:20:52 +0000 | [diff] [blame] | 112 | ; CHECK: cmpq	%rax, ([[A0]]) | 
| Chris Lattner | 1a32ede | 2009-12-24 00:37:38 +0000 | [diff] [blame] | 113 | } | 
|  | 114 |  |