brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · 7362916 Raw
100 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 memrchr calls with a string consisting of all the same5; characters are folded and those with mixed strings are not.6 7declare ptr @memrchr(ptr, i32, i64)8 9@a11111 = constant [5 x i8] c"\01\01\01\01\01"10@a1110111 = constant [7 x i8] c"\01\01\01\00\01\01\01"11 12 13; Fold memrchr(a11111, C, 5) to *a11111 == C ? a11111 + 5 - 1 : null.14 15define ptr @fold_memrchr_a11111_c_5(i32 %C) {16; CHECK-LABEL: @fold_memrchr_a11111_c_5(17; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 [[C:%.*]] to i818; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 119; CHECK-NEXT:    [[MEMRCHR_SEL:%.*]] = select i1 [[TMP2]], ptr getelementptr inbounds nuw (i8, ptr @a11111, i64 4), ptr null20; CHECK-NEXT:    ret ptr [[MEMRCHR_SEL]]21;22 23  %ret = call ptr @memrchr(ptr @a11111, i32 %C, i64 5)24  ret ptr %ret25}26 27 28; Fold memrchr(a11111, C, N) to N && *a11111 == C ? a11111 + N - 1 : null,29; on the assumption that N is in bounds.30 31define ptr @fold_memrchr_a11111_c_n(i32 %C, i64 %N) {32; CHECK-LABEL: @fold_memrchr_a11111_c_n(33; CHECK-NEXT:    [[TMP1:%.*]] = icmp ne i64 [[N:%.*]], 034; CHECK-NEXT:    [[TMP2:%.*]] = trunc i32 [[C:%.*]] to i835; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8 [[TMP2]], 136; CHECK-NEXT:    [[TMP4:%.*]] = select i1 [[TMP1]], i1 [[TMP3]], i1 false37; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr @a11111, i64 [[N]]38; CHECK-NEXT:    [[MEMRCHR_PTR_PLUS:%.*]] = getelementptr i8, ptr [[TMP5]], i64 -139; CHECK-NEXT:    [[MEMRCHR_SEL:%.*]] = select i1 [[TMP4]], ptr [[MEMRCHR_PTR_PLUS]], ptr null40; CHECK-NEXT:    ret ptr [[MEMRCHR_SEL]]41;42 43  %ret = call ptr @memrchr(ptr @a11111, i32 %C, i64 %N)44  ret ptr %ret45}46 47 48; Fold memrchr(a1110111, C, 3) to a1110111[2] == C ? a1110111 + 2 : null.49 50define ptr @fold_memrchr_a1110111_c_3(i32 %C) {51; CHECK-LABEL: @fold_memrchr_a1110111_c_3(52; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 [[C:%.*]] to i853; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 154; CHECK-NEXT:    [[MEMRCHR_SEL:%.*]] = select i1 [[TMP2]], ptr getelementptr inbounds nuw (i8, ptr @a1110111, i64 2), ptr null55; CHECK-NEXT:    ret ptr [[MEMRCHR_SEL]]56;57 58  %ret = call ptr @memrchr(ptr @a1110111, i32 %C, i64 3)59  ret ptr %ret60}61 62 63; Don't fold memrchr(a1110111, C, 4).64 65define ptr @call_memrchr_a1110111_c_4(i32 %C) {66; CHECK-LABEL: @call_memrchr_a1110111_c_4(67; CHECK-NEXT:    [[RET:%.*]] = call ptr @memrchr(ptr noundef nonnull dereferenceable(4) @a1110111, i32 [[C:%.*]], i64 4)68; CHECK-NEXT:    ret ptr [[RET]]69;70 71  %ret = call ptr @memrchr(ptr @a1110111, i32 %C, i64 4)72  ret ptr %ret73}74 75 76; Don't fold memrchr(a1110111, C, 7).77 78define ptr @call_memrchr_a1110111_c_7(i32 %C) {79; CHECK-LABEL: @call_memrchr_a1110111_c_7(80; CHECK-NEXT:    [[RET:%.*]] = call ptr @memrchr(ptr noundef nonnull dereferenceable(7) @a1110111, i32 [[C:%.*]], i64 7)81; CHECK-NEXT:    ret ptr [[RET]]82;83 84  %ret = call ptr @memrchr(ptr @a1110111, i32 %C, i64 7)85  ret ptr %ret86}87 88 89; Don't fold memrchr(a1110111, C, N).90 91define ptr @call_memrchr_a1110111_c_n(i32 %C, i64 %N) {92; CHECK-LABEL: @call_memrchr_a1110111_c_n(93; CHECK-NEXT:    [[RET:%.*]] = call ptr @memrchr(ptr nonnull @a1110111, i32 [[C:%.*]], i64 [[N:%.*]])94; CHECK-NEXT:    ret ptr [[RET]]95;96 97  %ret = call ptr @memrchr(ptr @a1110111, i32 %C, i64 %N)98  ret ptr %ret99}100