1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -disable-simplify-libcalls -mtriple=x86_64-linux | FileCheck %s --check-prefix=NOBUILTIN 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-win32 | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; This tests codegen time inlining/optimization of memcmp 6*9880d681SAndroid Build Coastguard Worker; rdar://6480398 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker@.str = private constant [23 x i8] c"fooooooooooooooooooooo\00", align 1 ; <[23 x i8]*> [#uses=1] 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerdeclare i32 @memcmp(...) 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine void @memcmp2(i8* %X, i8* %Y, i32* nocapture %P) nounwind { 13*9880d681SAndroid Build Coastguard Workerentry: 14*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 (...) @memcmp(i8* %X, i8* %Y, i32 2) nounwind ; <i32> [#uses=1] 15*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %0, 0 ; <i1> [#uses=1] 16*9880d681SAndroid Build Coastguard Worker br i1 %1, label %return, label %bb 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerbb: ; preds = %entry 19*9880d681SAndroid Build Coastguard Worker store i32 4, i32* %P, align 4 20*9880d681SAndroid Build Coastguard Worker ret void 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 23*9880d681SAndroid Build Coastguard Worker ret void 24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: memcmp2: 25*9880d681SAndroid Build Coastguard Worker; CHECK: movzwl 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmpw 27*9880d681SAndroid Build Coastguard Worker; NOBUILTIN-LABEL: memcmp2: 28*9880d681SAndroid Build Coastguard Worker; NOBUILTIN: callq 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine void @memcmp2a(i8* %X, i32* nocapture %P) nounwind { 32*9880d681SAndroid Build Coastguard Workerentry: 33*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 (...) @memcmp(i8* %X, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str, i32 0, i32 1), i32 2) nounwind ; <i32> [#uses=1] 34*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %0, 0 ; <i1> [#uses=1] 35*9880d681SAndroid Build Coastguard Worker br i1 %1, label %return, label %bb 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerbb: ; preds = %entry 38*9880d681SAndroid Build Coastguard Worker store i32 4, i32* %P, align 4 39*9880d681SAndroid Build Coastguard Worker ret void 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 42*9880d681SAndroid Build Coastguard Worker ret void 43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: memcmp2a: 44*9880d681SAndroid Build Coastguard Worker; CHECK: movzwl 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmpl $28527, 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine void @memcmp2nb(i8* %X, i8* %Y, i32* nocapture %P) nounwind { 49*9880d681SAndroid Build Coastguard Workerentry: 50*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 (...) @memcmp(i8* %X, i8* %Y, i32 2) nounwind nobuiltin ; <i32> [#uses=1] 51*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %0, 0 ; <i1> [#uses=1] 52*9880d681SAndroid Build Coastguard Worker br i1 %1, label %return, label %bb 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerbb: ; preds = %entry 55*9880d681SAndroid Build Coastguard Worker store i32 4, i32* %P, align 4 56*9880d681SAndroid Build Coastguard Worker ret void 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 59*9880d681SAndroid Build Coastguard Worker ret void 60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: memcmp2nb: 61*9880d681SAndroid Build Coastguard Worker; CHECK: callq 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerdefine void @memcmp4(i8* %X, i8* %Y, i32* nocapture %P) nounwind { 65*9880d681SAndroid Build Coastguard Workerentry: 66*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 (...) @memcmp(i8* %X, i8* %Y, i32 4) nounwind ; <i32> [#uses=1] 67*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %0, 0 ; <i1> [#uses=1] 68*9880d681SAndroid Build Coastguard Worker br i1 %1, label %return, label %bb 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerbb: ; preds = %entry 71*9880d681SAndroid Build Coastguard Worker store i32 4, i32* %P, align 4 72*9880d681SAndroid Build Coastguard Worker ret void 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 75*9880d681SAndroid Build Coastguard Worker ret void 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: memcmp4: 77*9880d681SAndroid Build Coastguard Worker; CHECK: movl 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmpl 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerdefine void @memcmp4a(i8* %X, i32* nocapture %P) nounwind { 82*9880d681SAndroid Build Coastguard Workerentry: 83*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 (...) @memcmp(i8* %X, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str, i32 0, i32 1), i32 4) nounwind ; <i32> [#uses=1] 84*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %0, 0 ; <i1> [#uses=1] 85*9880d681SAndroid Build Coastguard Worker br i1 %1, label %return, label %bb 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerbb: ; preds = %entry 88*9880d681SAndroid Build Coastguard Worker store i32 4, i32* %P, align 4 89*9880d681SAndroid Build Coastguard Worker ret void 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 92*9880d681SAndroid Build Coastguard Worker ret void 93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: memcmp4a: 94*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl $1869573999, 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerdefine void @memcmp8(i8* %X, i8* %Y, i32* nocapture %P) nounwind { 98*9880d681SAndroid Build Coastguard Workerentry: 99*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 (...) @memcmp(i8* %X, i8* %Y, i32 8) nounwind ; <i32> [#uses=1] 100*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %0, 0 ; <i1> [#uses=1] 101*9880d681SAndroid Build Coastguard Worker br i1 %1, label %return, label %bb 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerbb: ; preds = %entry 104*9880d681SAndroid Build Coastguard Worker store i32 4, i32* %P, align 4 105*9880d681SAndroid Build Coastguard Worker ret void 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 108*9880d681SAndroid Build Coastguard Worker ret void 109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: memcmp8: 110*9880d681SAndroid Build Coastguard Worker; CHECK: movq 111*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workerdefine void @memcmp8a(i8* %X, i32* nocapture %P) nounwind { 115*9880d681SAndroid Build Coastguard Workerentry: 116*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 (...) @memcmp(i8* %X, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str, i32 0, i32 0), i32 8) nounwind ; <i32> [#uses=1] 117*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %0, 0 ; <i1> [#uses=1] 118*9880d681SAndroid Build Coastguard Worker br i1 %1, label %return, label %bb 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerbb: ; preds = %entry 121*9880d681SAndroid Build Coastguard Worker store i32 4, i32* %P, align 4 122*9880d681SAndroid Build Coastguard Worker ret void 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 125*9880d681SAndroid Build Coastguard Worker ret void 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: memcmp8a: 127*9880d681SAndroid Build Coastguard Worker; CHECK: movabsq $8029759185026510694, 128*9880d681SAndroid Build Coastguard Worker; CHECK: cmpq 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131