1*9880d681SAndroid Build Coastguard Worker; Test that the strncmp library call simplifier works correctly. 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker@hello = constant [6 x i8] c"hello\00" 7*9880d681SAndroid Build Coastguard Worker@hell = constant [5 x i8] c"hell\00" 8*9880d681SAndroid Build Coastguard Worker@bell = constant [5 x i8] c"bell\00" 9*9880d681SAndroid Build Coastguard Worker@null = constant [1 x i8] zeroinitializer 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdeclare i32 @strncmp(i8*, i8*, i32) 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; strncmp("", x, n) -> -*x 14*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i8* %str2) { 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 16*9880d681SAndroid Build Coastguard Worker; CHECK: %strcmpload = load i8, i8* %str 17*9880d681SAndroid Build Coastguard Worker; CHECK: %1 = zext i8 %strcmpload to i32 18*9880d681SAndroid Build Coastguard Worker; CHECK: %2 = sub nsw i32 0, %1 19*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %2 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker %str1 = getelementptr inbounds [1 x i8], [1 x i8]* @null, i32 0, i32 0 22*9880d681SAndroid Build Coastguard Worker %temp1 = call i32 @strncmp(i8* %str1, i8* %str2, i32 10) 23*9880d681SAndroid Build Coastguard Worker ret i32 %temp1 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker; strncmp(x, "", n) -> *x 27*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i8* %str1) { 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 29*9880d681SAndroid Build Coastguard Worker; CHECK: %strcmpload = load i8, i8* %str1 30*9880d681SAndroid Build Coastguard Worker; CHECK: %1 = zext i8 %strcmpload to i32 31*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %1 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker %str2 = getelementptr inbounds [1 x i8], [1 x i8]* @null, i32 0, i32 0 34*9880d681SAndroid Build Coastguard Worker %temp1 = call i32 @strncmp(i8* %str1, i8* %str2, i32 10) 35*9880d681SAndroid Build Coastguard Worker ret i32 %temp1 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker; strncmp(x, y, n) -> cnst 39*9880d681SAndroid Build Coastguard Workerdefine i32 @test3() { 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 41*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 -1 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker %str1 = getelementptr inbounds [5 x i8], [5 x i8]* @hell, i32 0, i32 0 44*9880d681SAndroid Build Coastguard Worker %str2 = getelementptr inbounds [6 x i8], [6 x i8]* @hello, i32 0, i32 0 45*9880d681SAndroid Build Coastguard Worker %temp1 = call i32 @strncmp(i8* %str1, i8* %str2, i32 10) 46*9880d681SAndroid Build Coastguard Worker ret i32 %temp1 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerdefine i32 @test4() { 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 51*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 1 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker %str1 = getelementptr inbounds [5 x i8], [5 x i8]* @hell, i32 0, i32 0 54*9880d681SAndroid Build Coastguard Worker %str2 = getelementptr inbounds [1 x i8], [1 x i8]* @null, i32 0, i32 0 55*9880d681SAndroid Build Coastguard Worker %temp1 = call i32 @strncmp(i8* %str1, i8* %str2, i32 10) 56*9880d681SAndroid Build Coastguard Worker ret i32 %temp1 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdefine i32 @test5() { 60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 61*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker %str1 = getelementptr inbounds [5 x i8], [5 x i8]* @hell, i32 0, i32 0 64*9880d681SAndroid Build Coastguard Worker %str2 = getelementptr inbounds [6 x i8], [6 x i8]* @hello, i32 0, i32 0 65*9880d681SAndroid Build Coastguard Worker %temp1 = call i32 @strncmp(i8* %str1, i8* %str2, i32 4) 66*9880d681SAndroid Build Coastguard Worker ret i32 %temp1 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker; strncmp(x,y,1) -> memcmp(x,y,1) 70*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i8* %str1, i8* %str2) { 71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 72*9880d681SAndroid Build Coastguard Worker; CHECK: [[LOAD1:%[a-z]+]] = load i8, i8* %str1, align 1 73*9880d681SAndroid Build Coastguard Worker; CHECK: [[ZEXT1:%[a-z]+]] = zext i8 [[LOAD1]] to i32 74*9880d681SAndroid Build Coastguard Worker; CHECK: [[LOAD2:%[a-z]+]] = load i8, i8* %str2, align 1 75*9880d681SAndroid Build Coastguard Worker; CHECK: [[ZEXT2:%[a-z]+]] = zext i8 [[LOAD2]] to i32 76*9880d681SAndroid Build Coastguard Worker; CHECK: [[RET:%[a-z]+]] = sub nsw i32 [[ZEXT1]], [[ZEXT2]] 77*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 [[RET]] 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker %temp1 = call i32 @strncmp(i8* %str1, i8* %str2, i32 1) 80*9880d681SAndroid Build Coastguard Worker ret i32 %temp1 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker; strncmp(x,y,0) -> 0 84*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i8* %str1, i8* %str2) { 85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 86*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker %temp1 = call i32 @strncmp(i8* %str1, i8* %str2, i32 0) 89*9880d681SAndroid Build Coastguard Worker ret i32 %temp1 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker; strncmp(x,x,n) -> 0 93*9880d681SAndroid Build Coastguard Workerdefine i32 @test8(i8* %str, i32 %n) { 94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8( 95*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker %temp1 = call i32 @strncmp(i8* %str, i8* %str, i32 %n) 98*9880d681SAndroid Build Coastguard Worker ret i32 %temp1 99*9880d681SAndroid Build Coastguard Worker} 100