1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; Test that the memchr library call simplifier works correctly. 3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*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-n8:16:32" 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker@hello = constant [14 x i8] c"hello world\5Cn\00" 8*9880d681SAndroid Build Coastguard Worker@hellonull = constant [14 x i8] c"hello\00world\5Cn\00" 9*9880d681SAndroid Build Coastguard Worker@null = constant [1 x i8] zeroinitializer 10*9880d681SAndroid Build Coastguard Worker@newlines = constant [3 x i8] c"\0D\0A\00" 11*9880d681SAndroid Build Coastguard Worker@single = constant [2 x i8] c"\1F\00" 12*9880d681SAndroid Build Coastguard Worker@spaces = constant [4 x i8] c" \0D\0A\00" 13*9880d681SAndroid Build Coastguard Worker@negative = constant [3 x i8] c"\FF\FE\00" 14*9880d681SAndroid Build Coastguard Worker@chp = global i8* zeroinitializer 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdeclare i8* @memchr(i8*, i32, i32) 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerdefine void @test1() { 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i8* getelementptr inbounds ([14 x i8], [14 x i8]* @hello, i32 0, i32 6), i8** @chp, align 4 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 22*9880d681SAndroid Build Coastguard Worker; 23*9880d681SAndroid Build Coastguard Worker %str = getelementptr [14 x i8], [14 x i8]* @hello, i32 0, i32 0 24*9880d681SAndroid Build Coastguard Worker %dst = call i8* @memchr(i8* %str, i32 119, i32 14) 25*9880d681SAndroid Build Coastguard Worker store i8* %dst, i8** @chp 26*9880d681SAndroid Build Coastguard Worker ret void 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine void @test2() { 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i8* null, i8** @chp, align 4 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 33*9880d681SAndroid Build Coastguard Worker; 34*9880d681SAndroid Build Coastguard Worker %str = getelementptr [1 x i8], [1 x i8]* @null, i32 0, i32 0 35*9880d681SAndroid Build Coastguard Worker %dst = call i8* @memchr(i8* %str, i32 119, i32 1) 36*9880d681SAndroid Build Coastguard Worker store i8* %dst, i8** @chp 37*9880d681SAndroid Build Coastguard Worker ret void 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdefine void @test3() { 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i8* getelementptr inbounds ([14 x i8], [14 x i8]* @hello, i32 0, i32 13), i8** @chp, align 4 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 44*9880d681SAndroid Build Coastguard Worker; 45*9880d681SAndroid Build Coastguard Worker %src = getelementptr [14 x i8], [14 x i8]* @hello, i32 0, i32 0 46*9880d681SAndroid Build Coastguard Worker %dst = call i8* @memchr(i8* %src, i32 0, i32 14) 47*9880d681SAndroid Build Coastguard Worker store i8* %dst, i8** @chp 48*9880d681SAndroid Build Coastguard Worker ret void 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdefine void @test4(i32 %chr) { 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[DST:%.*]] = call i8* @memchr(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @hello, i32 0, i32 0), i32 %chr, i32 14) 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i8* [[DST]], i8** @chp, align 4 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 56*9880d681SAndroid Build Coastguard Worker; 57*9880d681SAndroid Build Coastguard Worker %src = getelementptr [14 x i8], [14 x i8]* @hello, i32 0, i32 0 58*9880d681SAndroid Build Coastguard Worker %dst = call i8* @memchr(i8* %src, i32 %chr, i32 14) 59*9880d681SAndroid Build Coastguard Worker store i8* %dst, i8** @chp 60*9880d681SAndroid Build Coastguard Worker ret void 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerdefine void @test5() { 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i8* getelementptr inbounds ([14 x i8], [14 x i8]* @hello, i32 0, i32 13), i8** @chp, align 4 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 67*9880d681SAndroid Build Coastguard Worker; 68*9880d681SAndroid Build Coastguard Worker %src = getelementptr [14 x i8], [14 x i8]* @hello, i32 0, i32 0 69*9880d681SAndroid Build Coastguard Worker %dst = call i8* @memchr(i8* %src, i32 65280, i32 14) 70*9880d681SAndroid Build Coastguard Worker store i8* %dst, i8** @chp 71*9880d681SAndroid Build Coastguard Worker ret void 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerdefine void @test6() { 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i8* getelementptr inbounds ([14 x i8], [14 x i8]* @hello, i32 0, i32 6), i8** @chp, align 4 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 78*9880d681SAndroid Build Coastguard Worker; 79*9880d681SAndroid Build Coastguard Worker %src = getelementptr [14 x i8], [14 x i8]* @hello, i32 0, i32 0 80*9880d681SAndroid Build Coastguard Worker; Overflow, but we still find the right thing. 81*9880d681SAndroid Build Coastguard Worker %dst = call i8* @memchr(i8* %src, i32 119, i32 100) 82*9880d681SAndroid Build Coastguard Worker store i8* %dst, i8** @chp 83*9880d681SAndroid Build Coastguard Worker ret void 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Workerdefine void @test7() { 87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i8* null, i8** @chp, align 4 89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 90*9880d681SAndroid Build Coastguard Worker; 91*9880d681SAndroid Build Coastguard Worker %src = getelementptr [14 x i8], [14 x i8]* @hello, i32 0, i32 0 92*9880d681SAndroid Build Coastguard Worker; Overflow 93*9880d681SAndroid Build Coastguard Worker %dst = call i8* @memchr(i8* %src, i32 120, i32 100) 94*9880d681SAndroid Build Coastguard Worker store i8* %dst, i8** @chp 95*9880d681SAndroid Build Coastguard Worker ret void 96*9880d681SAndroid Build Coastguard Worker} 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerdefine void @test8() { 99*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8( 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i8* getelementptr inbounds ([14 x i8], [14 x i8]* @hellonull, i32 0, i32 6), i8** @chp, align 4 101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 102*9880d681SAndroid Build Coastguard Worker; 103*9880d681SAndroid Build Coastguard Worker %str = getelementptr [14 x i8], [14 x i8]* @hellonull, i32 0, i32 0 104*9880d681SAndroid Build Coastguard Worker %dst = call i8* @memchr(i8* %str, i32 119, i32 14) 105*9880d681SAndroid Build Coastguard Worker store i8* %dst, i8** @chp 106*9880d681SAndroid Build Coastguard Worker ret void 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerdefine void @test9() { 110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9( 111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i8* getelementptr inbounds ([14 x i8], [14 x i8]* @hellonull, i32 0, i32 6), i8** @chp, align 4 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 113*9880d681SAndroid Build Coastguard Worker; 114*9880d681SAndroid Build Coastguard Worker %str = getelementptr [14 x i8], [14 x i8]* @hellonull, i32 0, i32 2 115*9880d681SAndroid Build Coastguard Worker %dst = call i8* @memchr(i8* %str, i32 119, i32 12) 116*9880d681SAndroid Build Coastguard Worker store i8* %dst, i8** @chp 117*9880d681SAndroid Build Coastguard Worker ret void 118*9880d681SAndroid Build Coastguard Worker} 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerdefine void @test10() { 121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10( 122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i8* null, i8** @chp, align 4 123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 124*9880d681SAndroid Build Coastguard Worker; 125*9880d681SAndroid Build Coastguard Worker %str = getelementptr [14 x i8], [14 x i8]* @hello, i32 0, i32 0 126*9880d681SAndroid Build Coastguard Worker %dst = call i8* @memchr(i8* %str, i32 119, i32 6) 127*9880d681SAndroid Build Coastguard Worker store i8* %dst, i8** @chp 128*9880d681SAndroid Build Coastguard Worker ret void 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker; Check transformation memchr("\r\n", C, 2) != nullptr -> (C & 9216) != 0 132*9880d681SAndroid Build Coastguard Workerdefine i1 @test11(i32 %C) { 133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11( 134*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 %C to i16 135*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[MEMCHR_BOUNDS:%.*]] = icmp ult i16 [[TMP1]], 16 136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = shl i16 1, [[TMP1]] 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP3:%.*]] = and i16 [[TMP2]], 9216 138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[MEMCHR_BITS:%.*]] = icmp ne i16 [[TMP3]], 0 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[MEMCHR:%.*]] = and i1 [[MEMCHR:%.*]].bounds, [[MEMCHR:%.*]].bits 140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[MEMCHR]] 141*9880d681SAndroid Build Coastguard Worker; 142*9880d681SAndroid Build Coastguard Worker %dst = call i8* @memchr(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @newlines, i64 0, i64 0), i32 %C, i32 2) 143*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8* %dst, null 144*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 145*9880d681SAndroid Build Coastguard Worker} 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker; No 64 bits here 148*9880d681SAndroid Build Coastguard Workerdefine i1 @test12(i32 %C) { 149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12( 150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[DST:%.*]] = call i8* @memchr(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @spaces, i32 0, i32 0), i32 %C, i32 3) 151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8* [[DST]], null 152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[CMP]] 153*9880d681SAndroid Build Coastguard Worker; 154*9880d681SAndroid Build Coastguard Worker %dst = call i8* @memchr(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @spaces, i64 0, i64 0), i32 %C, i32 3) 155*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8* %dst, null 156*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 157*9880d681SAndroid Build Coastguard Worker} 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workerdefine i1 @test13(i32 %C) { 160*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13( 161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[MEMCHR_BOUNDS:%.*]] = icmp ult i32 %C, 32 162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shl i32 1, %C 163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], -2147483647 164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[MEMCHR_BITS:%.*]] = icmp ne i32 [[TMP2]], 0 165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[MEMCHR:%.*]] = and i1 [[MEMCHR:%.*]].bounds, [[MEMCHR:%.*]].bits 166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[MEMCHR]] 167*9880d681SAndroid Build Coastguard Worker; 168*9880d681SAndroid Build Coastguard Worker %dst = call i8* @memchr(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @single, i64 0, i64 0), i32 %C, i32 2) 169*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8* %dst, null 170*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 171*9880d681SAndroid Build Coastguard Worker} 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Workerdefine i1 @test14(i32 %C) { 174*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14( 175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 %C, 31 176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[TMP1]] 177*9880d681SAndroid Build Coastguard Worker; 178*9880d681SAndroid Build Coastguard Worker %dst = call i8* @memchr(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @single, i64 0, i64 0), i32 %C, i32 1) 179*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8* %dst, null 180*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 181*9880d681SAndroid Build Coastguard Worker} 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Workerdefine i1 @test15(i32 %C) { 184*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15( 185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[DST:%.*]] = call i8* @memchr(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @negative, i32 0, i32 0), i32 %C, i32 3) 186*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8* [[DST]], null 187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[CMP]] 188*9880d681SAndroid Build Coastguard Worker; 189*9880d681SAndroid Build Coastguard Worker %dst = call i8* @memchr(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @negative, i64 0, i64 0), i32 %C, i32 3) 190*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i8* %dst, null 191*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 192*9880d681SAndroid Build Coastguard Worker} 193