1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; Test that the strlen library call simplifier works correctly. 3*9880d681SAndroid Build Coastguard Worker; 4*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 5*9880d681SAndroid Build Coastguard Worker 6*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" 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker@hello = constant [6 x i8] c"hello\00" 9*9880d681SAndroid Build Coastguard Worker@longer = constant [7 x i8] c"longer\00" 10*9880d681SAndroid Build Coastguard Worker@null = constant [1 x i8] zeroinitializer 11*9880d681SAndroid Build Coastguard Worker@null_hello = constant [7 x i8] c"\00hello\00" 12*9880d681SAndroid Build Coastguard Worker@nullstring = constant i8 0 13*9880d681SAndroid Build Coastguard Worker@a = common global [32 x i8] zeroinitializer, align 1 14*9880d681SAndroid Build Coastguard Worker@null_hello_mid = constant [13 x i8] c"hello wor\00ld\00" 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdeclare i32 @strlen(i8*) 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; Check strlen(string constant) -> integer constant. 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerdefine i32 @test_simplify1() { 21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify1( 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 5 23*9880d681SAndroid Build Coastguard Worker; 24*9880d681SAndroid Build Coastguard Worker %hello_p = getelementptr [6 x i8], [6 x i8]* @hello, i32 0, i32 0 25*9880d681SAndroid Build Coastguard Worker %hello_l = call i32 @strlen(i8* %hello_p) 26*9880d681SAndroid Build Coastguard Worker ret i32 %hello_l 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine i32 @test_simplify2() { 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify2( 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 32*9880d681SAndroid Build Coastguard Worker; 33*9880d681SAndroid Build Coastguard Worker %null_p = getelementptr [1 x i8], [1 x i8]* @null, i32 0, i32 0 34*9880d681SAndroid Build Coastguard Worker %null_l = call i32 @strlen(i8* %null_p) 35*9880d681SAndroid Build Coastguard Worker ret i32 %null_l 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdefine i32 @test_simplify3() { 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify3( 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 41*9880d681SAndroid Build Coastguard Worker; 42*9880d681SAndroid Build Coastguard Worker %null_hello_p = getelementptr [7 x i8], [7 x i8]* @null_hello, i32 0, i32 0 43*9880d681SAndroid Build Coastguard Worker %null_hello_l = call i32 @strlen(i8* %null_hello_p) 44*9880d681SAndroid Build Coastguard Worker ret i32 %null_hello_l 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerdefine i32 @test_simplify4() { 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify4( 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0 50*9880d681SAndroid Build Coastguard Worker; 51*9880d681SAndroid Build Coastguard Worker %len = tail call i32 @strlen(i8* @nullstring) nounwind 52*9880d681SAndroid Build Coastguard Worker ret i32 %len 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; Check strlen(x) == 0 --> *x == 0. 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdefine i1 @test_simplify5() { 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify5( 59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 60*9880d681SAndroid Build Coastguard Worker; 61*9880d681SAndroid Build Coastguard Worker %hello_p = getelementptr [6 x i8], [6 x i8]* @hello, i32 0, i32 0 62*9880d681SAndroid Build Coastguard Worker %hello_l = call i32 @strlen(i8* %hello_p) 63*9880d681SAndroid Build Coastguard Worker %eq_hello = icmp eq i32 %hello_l, 0 64*9880d681SAndroid Build Coastguard Worker ret i1 %eq_hello 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdefine i1 @test_simplify6() { 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify6( 69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 70*9880d681SAndroid Build Coastguard Worker; 71*9880d681SAndroid Build Coastguard Worker %null_p = getelementptr [1 x i8], [1 x i8]* @null, i32 0, i32 0 72*9880d681SAndroid Build Coastguard Worker %null_l = call i32 @strlen(i8* %null_p) 73*9880d681SAndroid Build Coastguard Worker %eq_null = icmp eq i32 %null_l, 0 74*9880d681SAndroid Build Coastguard Worker ret i1 %eq_null 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker; Check strlen(x) != 0 --> *x != 0. 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerdefine i1 @test_simplify7() { 80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify7( 81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 true 82*9880d681SAndroid Build Coastguard Worker; 83*9880d681SAndroid Build Coastguard Worker %hello_p = getelementptr [6 x i8], [6 x i8]* @hello, i32 0, i32 0 84*9880d681SAndroid Build Coastguard Worker %hello_l = call i32 @strlen(i8* %hello_p) 85*9880d681SAndroid Build Coastguard Worker %ne_hello = icmp ne i32 %hello_l, 0 86*9880d681SAndroid Build Coastguard Worker ret i1 %ne_hello 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine i1 @test_simplify8() { 90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify8( 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 92*9880d681SAndroid Build Coastguard Worker; 93*9880d681SAndroid Build Coastguard Worker %null_p = getelementptr [1 x i8], [1 x i8]* @null, i32 0, i32 0 94*9880d681SAndroid Build Coastguard Worker %null_l = call i32 @strlen(i8* %null_p) 95*9880d681SAndroid Build Coastguard Worker %ne_null = icmp ne i32 %null_l, 0 96*9880d681SAndroid Build Coastguard Worker ret i1 %ne_null 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdefine i32 @test_simplify9(i1 %x) { 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify9( 101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = select i1 %x, i32 5, i32 6 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[TMP1]] 103*9880d681SAndroid Build Coastguard Worker; 104*9880d681SAndroid Build Coastguard Worker %hello = getelementptr [6 x i8], [6 x i8]* @hello, i32 0, i32 0 105*9880d681SAndroid Build Coastguard Worker %longer = getelementptr [7 x i8], [7 x i8]* @longer, i32 0, i32 0 106*9880d681SAndroid Build Coastguard Worker %s = select i1 %x, i8* %hello, i8* %longer 107*9880d681SAndroid Build Coastguard Worker %l = call i32 @strlen(i8* %s) 108*9880d681SAndroid Build Coastguard Worker ret i32 %l 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker; Check the case that should be simplified to a sub instruction. 112*9880d681SAndroid Build Coastguard Worker; strlen(@hello + x) --> 5 - x 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workerdefine i32 @test_simplify10(i32 %x) { 115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify10( 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = sub i32 5, %x 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[TMP1]] 118*9880d681SAndroid Build Coastguard Worker; 119*9880d681SAndroid Build Coastguard Worker %hello_p = getelementptr inbounds [6 x i8], [6 x i8]* @hello, i32 0, i32 %x 120*9880d681SAndroid Build Coastguard Worker %hello_l = call i32 @strlen(i8* %hello_p) 121*9880d681SAndroid Build Coastguard Worker ret i32 %hello_l 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker; strlen(@null_hello_mid + (x & 7)) --> 9 - (x & 7) 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerdefine i32 @test_simplify11(i32 %x) { 127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify11( 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 %x, 7 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = sub nsw i32 9, [[AND]] 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[TMP1]] 131*9880d681SAndroid Build Coastguard Worker; 132*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 7 133*9880d681SAndroid Build Coastguard Worker %hello_p = getelementptr inbounds [13 x i8], [13 x i8]* @null_hello_mid, i32 0, i32 %and 134*9880d681SAndroid Build Coastguard Worker %hello_l = call i32 @strlen(i8* %hello_p) 135*9880d681SAndroid Build Coastguard Worker ret i32 %hello_l 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker; Check cases that shouldn't be simplified. 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerdefine i32 @test_no_simplify1() { 141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_no_simplify1( 142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[A_L:%.*]] = call i32 @strlen(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @a, i32 0, i32 0)) 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[A_L]] 144*9880d681SAndroid Build Coastguard Worker; 145*9880d681SAndroid Build Coastguard Worker %a_p = getelementptr [32 x i8], [32 x i8]* @a, i32 0, i32 0 146*9880d681SAndroid Build Coastguard Worker %a_l = call i32 @strlen(i8* %a_p) 147*9880d681SAndroid Build Coastguard Worker ret i32 %a_l 148*9880d681SAndroid Build Coastguard Worker} 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker; strlen(@null_hello + x) should not be simplified to a sub instruction. 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerdefine i32 @test_no_simplify2(i32 %x) { 153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_no_simplify2( 154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[HELLO_P:%.*]] = getelementptr inbounds [7 x i8], [7 x i8]* @null_hello, i32 0, i32 %x 155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[HELLO_L:%.*]] = call i32 @strlen(i8* [[HELLO_P]]) 156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[HELLO_L]] 157*9880d681SAndroid Build Coastguard Worker; 158*9880d681SAndroid Build Coastguard Worker %hello_p = getelementptr inbounds [7 x i8], [7 x i8]* @null_hello, i32 0, i32 %x 159*9880d681SAndroid Build Coastguard Worker %hello_l = call i32 @strlen(i8* %hello_p) 160*9880d681SAndroid Build Coastguard Worker ret i32 %hello_l 161*9880d681SAndroid Build Coastguard Worker} 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker; strlen(@null_hello_mid + (x & 15)) should not be simplified to a sub instruction. 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Workerdefine i32 @test_no_simplify3(i32 %x) { 166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_no_simplify3( 167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 %x, 15 168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[HELLO_P:%.*]] = getelementptr inbounds [13 x i8], [13 x i8]* @null_hello_mid, i32 0, i32 [[AND]] 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[HELLO_L:%.*]] = call i32 @strlen(i8* [[HELLO_P]]) 170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[HELLO_L]] 171*9880d681SAndroid Build Coastguard Worker; 172*9880d681SAndroid Build Coastguard Worker %and = and i32 %x, 15 173*9880d681SAndroid Build Coastguard Worker %hello_p = getelementptr inbounds [13 x i8], [13 x i8]* @null_hello_mid, i32 0, i32 %and 174*9880d681SAndroid Build Coastguard Worker %hello_l = call i32 @strlen(i8* %hello_p) 175*9880d681SAndroid Build Coastguard Worker ret i32 %hello_l 176*9880d681SAndroid Build Coastguard Worker} 177*9880d681SAndroid Build Coastguard Worker 178