blob: 36be1f308ccd5f8b40f1bc4745630f150c04e217 [file] [log] [blame]
Chris Lattner8047d9a2009-12-24 00:37:38 +00001; RUN: llc %s -o - -march=x86-64 | FileCheck %s
2
3; This tests codegen time inlining/optimization of memcmp
4; rdar://6480398
5
Chris Lattner04b091a2009-12-24 01:07:17 +00006@.str = private constant [23 x i8] c"fooooooooooooooooooooo\00", align 1 ; <[23 x i8]*> [#uses=1]
Chris Lattner8047d9a2009-12-24 00:37:38 +00007
8declare i32 @memcmp(...)
9
10define void @memcmp2(i8* %X, i8* %Y, i32* nocapture %P) nounwind {
11entry:
12 %0 = tail call i32 (...)* @memcmp(i8* %X, i8* %Y, i32 2) nounwind ; <i32> [#uses=1]
13 %1 = icmp eq i32 %0, 0 ; <i1> [#uses=1]
14 br i1 %1, label %return, label %bb
15
16bb: ; preds = %entry
17 store i32 4, i32* %P, align 4
18 ret void
19
20return: ; preds = %entry
21 ret void
22; CHECK: memcmp2:
Chris Lattner00e94ba2010-10-07 20:56:25 +000023; CHECK: movw (%rdi), %ax
24; CHECK: cmpw (%rsi), %ax
Chris Lattner8047d9a2009-12-24 00:37:38 +000025}
26
27define void @memcmp2a(i8* %X, i32* nocapture %P) nounwind {
28entry:
Chris Lattner04b091a2009-12-24 01:07:17 +000029 %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 Lattner8047d9a2009-12-24 00:37:38 +000030 %1 = icmp eq i32 %0, 0 ; <i1> [#uses=1]
31 br i1 %1, label %return, label %bb
32
33bb: ; preds = %entry
34 store i32 4, i32* %P, align 4
35 ret void
36
37return: ; preds = %entry
38 ret void
39; CHECK: memcmp2a:
40; CHECK: cmpw $28527, (%rdi)
41}
42
43
44define void @memcmp4(i8* %X, i8* %Y, i32* nocapture %P) nounwind {
45entry:
46 %0 = tail call i32 (...)* @memcmp(i8* %X, i8* %Y, i32 4) nounwind ; <i32> [#uses=1]
47 %1 = icmp eq i32 %0, 0 ; <i1> [#uses=1]
48 br i1 %1, label %return, label %bb
49
50bb: ; preds = %entry
51 store i32 4, i32* %P, align 4
52 ret void
53
54return: ; preds = %entry
55 ret void
56; CHECK: memcmp4:
Chris Lattner00e94ba2010-10-07 20:56:25 +000057; CHECK: movl (%rdi), %eax
58; CHECK: cmpl (%rsi), %eax
Chris Lattner8047d9a2009-12-24 00:37:38 +000059}
60
61define void @memcmp4a(i8* %X, i32* nocapture %P) nounwind {
62entry:
Chris Lattner04b091a2009-12-24 01:07:17 +000063 %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 Lattner8047d9a2009-12-24 00:37:38 +000064 %1 = icmp eq i32 %0, 0 ; <i1> [#uses=1]
65 br i1 %1, label %return, label %bb
66
67bb: ; preds = %entry
68 store i32 4, i32* %P, align 4
69 ret void
70
71return: ; preds = %entry
72 ret void
73; CHECK: memcmp4a:
Chris Lattner04b091a2009-12-24 01:07:17 +000074; CHECK: cmpl $1869573999, (%rdi)
75}
76
77define void @memcmp8(i8* %X, i8* %Y, i32* nocapture %P) nounwind {
78entry:
79 %0 = tail call i32 (...)* @memcmp(i8* %X, i8* %Y, i32 8) nounwind ; <i32> [#uses=1]
80 %1 = icmp eq i32 %0, 0 ; <i1> [#uses=1]
81 br i1 %1, label %return, label %bb
82
83bb: ; preds = %entry
84 store i32 4, i32* %P, align 4
85 ret void
86
87return: ; preds = %entry
88 ret void
89; CHECK: memcmp8:
Chris Lattner00e94ba2010-10-07 20:56:25 +000090; CHECK: movq (%rdi), %rax
91; CHECK: cmpq (%rsi), %rax
Chris Lattner04b091a2009-12-24 01:07:17 +000092}
93
94define void @memcmp8a(i8* %X, i32* nocapture %P) nounwind {
95entry:
96 %0 = tail call i32 (...)* @memcmp(i8* %X, i8* getelementptr inbounds ([23 x i8]* @.str, i32 0, i32 0), i32 8) nounwind ; <i32> [#uses=1]
97 %1 = icmp eq i32 %0, 0 ; <i1> [#uses=1]
98 br i1 %1, label %return, label %bb
99
100bb: ; preds = %entry
101 store i32 4, i32* %P, align 4
102 ret void
103
104return: ; preds = %entry
105 ret void
106; CHECK: memcmp8a:
107; CHECK: movabsq $8029759185026510694, %rax
108; CHECK: cmpq %rax, (%rdi)
Chris Lattner8047d9a2009-12-24 00:37:38 +0000109}
110