brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · 3c55f41 Raw
141 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3;4; Verify that memchr calls with a string consisting of all the same5; characters are folded and those with mixed strings are not.6 7declare ptr @memchr(ptr, i32, i64)8 9@a00000 = constant [5 x i8] zeroinitializer10@a11111 = constant [5 x i8] c"\01\01\01\01\01"11@a111122 = constant [6 x i8] c"\01\01\01\01\02\02"12@a1110111 = constant [7 x i8] c"\01\01\01\00\01\01\01"13 14 15; Fold memchr(a00000, C, 5) to *a00000 == C ? a00000 : null.16; TODO: This depends on getConstantStringInfo() being able to handle17; implicitly zeroed out constants.18 19define ptr @fold_memchr_a00000_c_5(i32 %C) {20; CHECK-LABEL: @fold_memchr_a00000_c_5(21; CHECK-NEXT:    [[RET:%.*]] = call ptr @memchr(ptr noundef nonnull dereferenceable(1) @a00000, i32 [[C:%.*]], i64 5)22; CHECK-NEXT:    ret ptr [[RET]]23;24 25  %ret = call ptr @memchr(ptr @a00000, i32 %C, i64 5)26  ret ptr %ret27}28 29 30; Fold memchr(a11111, C, 5) to *a11111 == C ? a11111 : null.31 32define ptr @fold_memchr_a11111_c_5(i32 %C) {33; CHECK-LABEL: @fold_memchr_a11111_c_5(34; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 [[C:%.*]] to i835; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 136; CHECK-NEXT:    [[MEMCHR_SEL2:%.*]] = select i1 [[TMP2]], ptr @a11111, ptr null37; CHECK-NEXT:    ret ptr [[MEMCHR_SEL2]]38;39 40  %ret = call ptr @memchr(ptr @a11111, i32 %C, i64 5)41  ret ptr %ret42}43 44 45; Fold memchr(a11111, C, N) to N && *a11111 == C ? a11111 : null,46; on the assumption that N is in bounds.47 48define ptr @fold_memchr_a11111_c_n(i32 %C, i64 %N) {49; CHECK-LABEL: @fold_memchr_a11111_c_n(50; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 [[C:%.*]] to i851; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 152; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i64 [[N:%.*]], 053; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[TMP3]], [[TMP2]]54; CHECK-NEXT:    [[MEMCHR_SEL2:%.*]] = select i1 [[TMP4]], ptr @a11111, ptr null55; CHECK-NEXT:    ret ptr [[MEMCHR_SEL2]]56;57 58  %ret = call ptr @memchr(ptr @a11111, i32 %C, i64 %N)59  ret ptr %ret60}61 62 63; Fold memchr(a111122, C, N) to64;   N != 0 && C == 1 ? a111122 : N > 4 && C == 2 ? a111122 + 4 : null.65 66define ptr @fold_memchr_a111122_c_n(i32 %C, i64 %N) {67; CHECK-LABEL: @fold_memchr_a111122_c_n(68; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 [[C:%.*]] to i869; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 270; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt i64 [[N:%.*]], 471; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[TMP2]], [[TMP3]]72; CHECK-NEXT:    [[MEMCHR_SEL1:%.*]] = select i1 [[TMP4]], ptr getelementptr inbounds nuw (i8, ptr @a111122, i64 4), ptr null73; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i8 [[TMP1]], 174; CHECK-NEXT:    [[TMP6:%.*]] = icmp ne i64 [[N]], 075; CHECK-NEXT:    [[TMP7:%.*]] = and i1 [[TMP6]], [[TMP5]]76; CHECK-NEXT:    [[MEMCHR_SEL2:%.*]] = select i1 [[TMP7]], ptr @a111122, ptr [[MEMCHR_SEL1]]77; CHECK-NEXT:    ret ptr [[MEMCHR_SEL2]]78;79 80  %ret = call ptr @memchr(ptr @a111122, i32 %C, i64 %N)81  ret ptr %ret82}83 84 85; Fold memchr(a1110111, C, 3) to a1110111[2] == C ? a1110111 : null.86 87define ptr @fold_memchr_a1110111_c_3(i32 %C) {88; CHECK-LABEL: @fold_memchr_a1110111_c_3(89; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 [[C:%.*]] to i890; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 191; CHECK-NEXT:    [[MEMCHR_SEL2:%.*]] = select i1 [[TMP2]], ptr @a1110111, ptr null92; CHECK-NEXT:    ret ptr [[MEMCHR_SEL2]]93;94 95  %ret = call ptr @memchr(ptr @a1110111, i32 %C, i64 3)96  ret ptr %ret97}98 99 100; Don't fold memchr(a1110111, C, 4).101 102define ptr @call_memchr_a1110111_c_4(i32 %C) {103; CHECK-LABEL: @call_memchr_a1110111_c_4(104; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 [[C:%.*]] to i8105; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0106; CHECK-NEXT:    [[MEMCHR_SEL1:%.*]] = select i1 [[TMP2]], ptr getelementptr inbounds nuw (i8, ptr @a1110111, i64 3), ptr null107; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8 [[TMP1]], 1108; CHECK-NEXT:    [[MEMCHR_SEL2:%.*]] = select i1 [[TMP3]], ptr @a1110111, ptr [[MEMCHR_SEL1]]109; CHECK-NEXT:    ret ptr [[MEMCHR_SEL2]]110;111 112  %ret = call ptr @memchr(ptr @a1110111, i32 %C, i64 4)113  ret ptr %ret114}115 116 117; Don't fold memchr(a1110111, C, 7).118 119define ptr @call_memchr_a1110111_c_7(i32 %C) {120; CHECK-LABEL: @call_memchr_a1110111_c_7(121; CHECK-NEXT:    [[RET:%.*]] = call ptr @memchr(ptr noundef nonnull dereferenceable(1) @a1110111, i32 [[C:%.*]], i64 7)122; CHECK-NEXT:    ret ptr [[RET]]123;124 125  %ret = call ptr @memchr(ptr @a1110111, i32 %C, i64 7)126  ret ptr %ret127}128 129 130; Don't fold memchr(a1110111, C, N).131 132define ptr @call_memchr_a1110111_c_n(i32 %C, i64 %N) {133; CHECK-LABEL: @call_memchr_a1110111_c_n(134; CHECK-NEXT:    [[RET:%.*]] = call ptr @memchr(ptr nonnull @a1110111, i32 [[C:%.*]], i64 [[N:%.*]])135; CHECK-NEXT:    ret ptr [[RET]]136;137 138  %ret = call ptr @memchr(ptr @a1110111, i32 %C, i64 %N)139  ret ptr %ret140}141