1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; Test that the strcspn library call simplifier works correctly. 3; 4; RUN: opt < %s -passes=instcombine -S | FileCheck %s 5 6target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" 7 8@abcba = constant [6 x i8] c"abcba\00" 9@abc = constant [4 x i8] c"abc\00" 10@null = constant [1 x i8] zeroinitializer 11 12declare i64 @strcspn(ptr, ptr) 13 14; Check strcspn(s, "") -> strlen(s). 15 16define i64 @test_simplify1(ptr %str) { 17; CHECK-LABEL: @test_simplify1( 18; CHECK-NEXT: [[STRLEN:%.*]] = call i64 @strlen(ptr noundef nonnull dereferenceable(1) [[STR:%.*]]) 19; CHECK-NEXT: ret i64 [[STRLEN]] 20; 21 22 %ret = call i64 @strcspn(ptr %str, ptr @null) 23 ret i64 %ret 24} 25 26; Check strcspn("", s) -> 0. 27 28define i64 @test_simplify2(ptr %pat) { 29; CHECK-LABEL: @test_simplify2( 30; CHECK-NEXT: ret i64 0 31; 32 33 %ret = call i64 @strcspn(ptr @null, ptr %pat) 34 ret i64 %ret 35} 36 37; Check strcspn(s1, s2), where s1 and s2 are constants. 38 39define i64 @test_simplify3() { 40; CHECK-LABEL: @test_simplify3( 41; CHECK-NEXT: ret i64 0 42; 43 44 %ret = call i64 @strcspn(ptr @abcba, ptr @abc) 45 ret i64 %ret 46} 47 48; Check cases that shouldn't be simplified. 49 50define i64 @test_no_simplify1(ptr %str, ptr %pat) { 51; CHECK-LABEL: @test_no_simplify1( 52; CHECK-NEXT: [[RET:%.*]] = call i64 @strcspn(ptr [[STR:%.*]], ptr [[PAT:%.*]]) 53; CHECK-NEXT: ret i64 [[RET]] 54; 55 56 %ret = call i64 @strcspn(ptr %str, ptr %pat) 57 ret i64 %ret 58} 59