1*9880d681SAndroid Build Coastguard Worker; Test that the strcmp 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 @strcmp(i8*, i8*) 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; strcmp("", x) -> -*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 @strcmp(i8* %str1, i8* %str2) 23*9880d681SAndroid Build Coastguard Worker ret i32 %temp1 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; strcmp(x, "") -> *x 28*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i8* %str1) { 29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 30*9880d681SAndroid Build Coastguard Worker; CHECK: %strcmpload = load i8, i8* %str 31*9880d681SAndroid Build Coastguard Worker; CHECK: %1 = zext i8 %strcmpload to i32 32*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %1 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker %str2 = getelementptr inbounds [1 x i8], [1 x i8]* @null, i32 0, i32 0 35*9880d681SAndroid Build Coastguard Worker %temp1 = call i32 @strcmp(i8* %str1, i8* %str2) 36*9880d681SAndroid Build Coastguard Worker ret i32 %temp1 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; strcmp(x, y) -> cnst 40*9880d681SAndroid Build Coastguard Workerdefine i32 @test3() { 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 42*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 -1 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker %str1 = getelementptr inbounds [5 x i8], [5 x i8]* @hell, i32 0, i32 0 45*9880d681SAndroid Build Coastguard Worker %str2 = getelementptr inbounds [6 x i8], [6 x i8]* @hello, i32 0, i32 0 46*9880d681SAndroid Build Coastguard Worker %temp1 = call i32 @strcmp(i8* %str1, i8* %str2) 47*9880d681SAndroid Build Coastguard Worker ret i32 %temp1 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine i32 @test4() { 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 52*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 1 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker %str1 = getelementptr inbounds [5 x i8], [5 x i8]* @hell, i32 0, i32 0 55*9880d681SAndroid Build Coastguard Worker %str2 = getelementptr inbounds [1 x i8], [1 x i8]* @null, i32 0, i32 0 56*9880d681SAndroid Build Coastguard Worker %temp1 = call i32 @strcmp(i8* %str1, i8* %str2) 57*9880d681SAndroid Build Coastguard Worker ret i32 %temp1 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; strcmp(x, y) -> memcmp(x, y, <known length>) 61*9880d681SAndroid Build Coastguard Worker; (This transform is rather difficult to trigger in a useful manner) 62*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i1 %b) { 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 64*9880d681SAndroid Build Coastguard Worker; CHECK: %memcmp = call i32 @memcmp(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @hello, i32 0, i32 0), i8* %str2, i32 5) 65*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %memcmp 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker %str1 = getelementptr inbounds [6 x i8], [6 x i8]* @hello, i32 0, i32 0 68*9880d681SAndroid Build Coastguard Worker %temp1 = getelementptr inbounds [5 x i8], [5 x i8]* @hell, i32 0, i32 0 69*9880d681SAndroid Build Coastguard Worker %temp2 = getelementptr inbounds [5 x i8], [5 x i8]* @bell, i32 0, i32 0 70*9880d681SAndroid Build Coastguard Worker %str2 = select i1 %b, i8* %temp1, i8* %temp2 71*9880d681SAndroid Build Coastguard Worker %temp3 = call i32 @strcmp(i8* %str1, i8* %str2) 72*9880d681SAndroid Build Coastguard Worker ret i32 %temp3 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker; strcmp(x,x) -> 0 76*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i8* %str) { 77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 78*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker %temp1 = call i32 @strcmp(i8* %str, i8* %str) 81*9880d681SAndroid Build Coastguard Worker ret i32 %temp1 82*9880d681SAndroid Build Coastguard Worker} 83