diff options
Diffstat (limited to 'llvm/test/Transforms')
28 files changed, 766 insertions, 3 deletions
diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/fputs-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/fputs-b16.ll new file mode 100644 index 000000000000..cc841c6f9c5a --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/fputs-b16.ll @@ -0,0 +1,19 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare i32 @fputs(ptr, ptr) + +@hello = constant [6 x i16] [i16 104, i16 101, i16 108, i16 108, i16 111, i16 0] + +; fputs(str, stream) -> fwrite(str, strlen(str), 1, stream) +define void @test(ptr %stream) { +; CHECK-LABEL: define void @test( +; CHECK-SAME: ptr [[STREAM:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @fwrite(ptr nonnull @hello, i32 5, i32 1, ptr [[STREAM]]) +; CHECK-NEXT: ret void +; + call i32 @fputs(ptr @hello, ptr %stream) + ret void +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/fwrite-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/fwrite-b16.ll new file mode 100644 index 000000000000..07c2468da435 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/fwrite-b16.ll @@ -0,0 +1,19 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare i32 @fwrite(ptr, i32, i32, ptr) + +; fwrite(str, 1, 1, stream) -> fputc(*str, stream) +define void @test(ptr %str, ptr %stream) { +; CHECK-LABEL: define void @test( +; CHECK-SAME: ptr [[STR:%.*]], ptr [[STREAM:%.*]]) { +; CHECK-NEXT: [[CHAR:%.*]] = load i16, ptr [[STR]], align 1 +; CHECK-NEXT: [[CHARI:%.*]] = sext i16 [[CHAR]] to i32 +; CHECK-NEXT: [[FPUTC:%.*]] = call i32 @fputc(i32 [[CHARI]], ptr [[STREAM]]) +; CHECK-NEXT: ret void +; + call i32 @fwrite(ptr %str, i32 1, i32 1, ptr %stream) + ret void +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memchr-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memchr-b16.ll new file mode 100644 index 000000000000..0b48dac2c719 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memchr-b16.ll @@ -0,0 +1,34 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32-n64" + +declare ptr @memchr(ptr, i32, i32) + +; memchr(str, c, n) == str -> (unsigned char)*str == (unsigned char)c +define i1 @test_eq(ptr %str, i32 %c) { +; CHECK-LABEL: define i1 @test_eq( +; CHECK-SAME: ptr [[STR:%.*]], i32 [[C:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr [[STR]], align 1 +; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[C]] to i16 +; CHECK-NEXT: [[CHAR0CMP:%.*]] = icmp eq i16 [[TMP1]], [[TMP2]] +; CHECK-NEXT: ret i1 [[CHAR0CMP]] +; + %call = call ptr @memchr(ptr %str, i32 %c, i32 42) + %cmp = icmp eq ptr %call, %str + ret i1 %cmp +} + +; memchr(str, c, 1) -> (unsigned char)*str == (unsigned char)c ? str : null +define ptr @test_n_1(ptr %str, i32 %c) { +; CHECK-LABEL: define ptr @test_n_1( +; CHECK-SAME: ptr [[STR:%.*]], i32 [[C:%.*]]) { +; CHECK-NEXT: [[MEMCHR_CHAR0:%.*]] = load i16, ptr [[STR]], align 1 +; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[C]] to i16 +; CHECK-NEXT: [[MEMCHR_CHAR0CMP:%.*]] = icmp eq i16 [[MEMCHR_CHAR0]], [[TMP1]] +; CHECK-NEXT: [[MEMCHR_SEL:%.*]] = select i1 [[MEMCHR_CHAR0CMP]], ptr [[STR]], ptr null +; CHECK-NEXT: ret ptr [[MEMCHR_SEL]] +; + %call = call ptr @memchr(ptr %str, i32 %c, i32 1) + ret ptr %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memcmp-b32.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memcmp-b32.ll new file mode 100644 index 000000000000..a21e9b1cadde --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memcmp-b32.ll @@ -0,0 +1,32 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:32-p:32:32-n64" + +declare i32 @memcmp(ptr, ptr, i32) + +; memcmp(lhs, rhs, 1) -> *(unsigned char *)lhs <=> *(unsigned char *)rhs +define i32 @test_size_1(ptr %lhs, ptr %rhs) { +; CHECK-LABEL: define i32 @test_size_1( +; CHECK-SAME: ptr [[LHS:%.*]], ptr [[RHS:%.*]]) { +; CHECK-NEXT: [[MEMCMP_LHS0:%.*]] = load i32, ptr [[LHS]], align 1 +; CHECK-NEXT: [[MEMCMP_RHS0:%.*]] = load i32, ptr [[RHS]], align 1 +; CHECK-NEXT: [[MEMCMP_CHAR0CMP:%.*]] = call i32 @llvm.ucmp.i32.i32(i32 [[MEMCMP_LHS0]], i32 [[MEMCMP_RHS0]]) +; CHECK-NEXT: ret i32 [[MEMCMP_CHAR0CMP]] +; + %call = call i32 @memcmp(ptr %lhs, ptr %rhs, i32 1) ret i32 %call +} + +; memcmp(lhs, rhs, 2) == 0 -> (*(uint64_t *)lhs != *(uint64_t *)rhs) == 0 +define i1 @test_eq_size_2(ptr %lhs, ptr %rhs) { +; CHECK-LABEL: define i1 @test_eq_size_2( +; CHECK-SAME: ptr [[LHS:%.*]], ptr [[RHS:%.*]]) { +; CHECK-NEXT: [[LHSV:%.*]] = load i64, ptr [[LHS]], align 1 +; CHECK-NEXT: [[RHSV:%.*]] = load i64, ptr [[RHS]], align 1 +; CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i64 [[LHSV]], [[RHSV]] +; CHECK-NEXT: ret i1 [[DOTNOT]] +; + %call = call i32 @memcmp(ptr %lhs, ptr %rhs, i32 2) + %cmp = icmp eq i32 %call, 0 + ret i1 %cmp +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memcpy-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memcpy-b16.ll new file mode 100644 index 000000000000..2c59132a8a6e --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memcpy-b16.ll @@ -0,0 +1,69 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare ptr @memcpy(ptr, ptr, i32) + +define ptr @test_size_1(ptr %dst, ptr %src) { +; CHECK-LABEL: define ptr @test_size_1( +; CHECK-SAME: ptr [[DST:%.*]], ptr [[SRC:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr [[SRC]], align 1 +; CHECK-NEXT: store i16 [[TMP1]], ptr [[DST]], align 1 +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @memcpy(ptr %dst, ptr %src, i32 1) + ret ptr %call +} + +define ptr @test_size_2(ptr %dst, ptr %src) { +; CHECK-LABEL: define ptr @test_size_2( +; CHECK-SAME: ptr [[DST:%.*]], ptr [[SRC:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[SRC]], align 1 +; CHECK-NEXT: store i32 [[TMP1]], ptr [[DST]], align 1 +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @memcpy(ptr %dst, ptr %src, i32 2) + ret ptr %call +} + +define ptr @test_size_3(ptr %dst, ptr %src) { +; CHECK-LABEL: define ptr @test_size_3( +; CHECK-SAME: ptr [[DST:%.*]], ptr [[SRC:%.*]]) { +; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(3) [[DST]], ptr noundef nonnull align 1 dereferenceable(3) [[SRC]], i32 3, i1 false) +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @memcpy(ptr %dst, ptr %src, i32 3) + ret ptr %call +} + +define ptr @test_size_4(ptr %dst, ptr %src) { +; CHECK-LABEL: define ptr @test_size_4( +; CHECK-SAME: ptr [[DST:%.*]], ptr [[SRC:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr [[SRC]], align 1 +; CHECK-NEXT: store i64 [[TMP1]], ptr [[DST]], align 1 +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @memcpy(ptr %dst, ptr %src, i32 4) + ret ptr %call +} + +define ptr @test_size_5(ptr %dst, ptr %src) { +; CHECK-LABEL: define ptr @test_size_5( +; CHECK-SAME: ptr [[DST:%.*]], ptr [[SRC:%.*]]) { +; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(5) [[DST]], ptr noundef nonnull align 1 dereferenceable(5) [[SRC]], i32 5, i1 false) +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @memcpy(ptr %dst, ptr %src, i32 5) + ret ptr %call +} + +define ptr @test_size_8(ptr %dst, ptr %src) { +; CHECK-LABEL: define ptr @test_size_8( +; CHECK-SAME: ptr [[DST:%.*]], ptr [[SRC:%.*]]) { +; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(8) [[DST]], ptr noundef nonnull align 1 dereferenceable(8) [[SRC]], i32 8, i1 false) +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @memcpy(ptr %dst, ptr %src, i32 8) + ret ptr %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memcpy_chk-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memcpy_chk-b16.ll new file mode 100644 index 000000000000..f40e5fc7205f --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memcpy_chk-b16.ll @@ -0,0 +1,17 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare ptr @__memset_chk(ptr, i32, i32, i32) + +define ptr @test(ptr %dst, i32 %c, i32 %n) { +; CHECK-LABEL: define ptr @test( +; CHECK-SAME: ptr [[DST:%.*]], i32 [[C:%.*]], i32 [[N:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[C]] to i16 +; CHECK-NEXT: call void @llvm.memset.p0.i32(ptr align 1 [[DST]], i16 [[TMP1]], i32 [[N]], i1 false) +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @__memset_chk(ptr %dst, i32 %c, i32 %n, i32 -1) + ret ptr %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/mempcpy-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/mempcpy-b16.ll new file mode 100644 index 000000000000..fd6bdcd42378 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/mempcpy-b16.ll @@ -0,0 +1,17 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare ptr @mempcpy(ptr, ptr, i32) + +define ptr @test(ptr %dst, ptr %src, i32 %n) { +; CHECK-LABEL: define ptr @test( +; CHECK-SAME: ptr [[DST:%.*]], ptr [[SRC:%.*]], i32 [[N:%.*]]) { +; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 [[DST]], ptr align 1 [[SRC]], i32 [[N]], i1 false) +; CHECK-NEXT: [[CALL:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[N]] +; CHECK-NEXT: ret ptr [[CALL]] +; + %call = call ptr @mempcpy(ptr %dst, ptr %src, i32 %n) + ret ptr %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memrchr-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memrchr-b16.ll new file mode 100644 index 000000000000..985dc3c249c0 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memrchr-b16.ll @@ -0,0 +1,20 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32-n64" + +declare ptr @memrchr(ptr, i32, i32) + +; memrchr(str, c, 1) -> (unsigned char)*str == (unsigned char)c ? str : null +define ptr @test_n_1(ptr %str, i32 %c) { +; CHECK-LABEL: define ptr @test_n_1( +; CHECK-SAME: ptr [[STR:%.*]], i32 [[C:%.*]]) { +; CHECK-NEXT: [[MEMRCHR_CHAR0:%.*]] = load i16, ptr [[STR]], align 1 +; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[C]] to i16 +; CHECK-NEXT: [[MEMRCHR_CHAR0CMP:%.*]] = icmp eq i16 [[MEMRCHR_CHAR0]], [[TMP1]] +; CHECK-NEXT: [[MEMRCHR_SEL:%.*]] = select i1 [[MEMRCHR_CHAR0CMP]], ptr [[STR]], ptr null +; CHECK-NEXT: ret ptr [[MEMRCHR_SEL]] +; + %call = call ptr @memrchr(ptr %str, i32 %c, i32 1) + ret ptr %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memset-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memset-b16.ll new file mode 100644 index 000000000000..83bd0c84ae93 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/memset-b16.ll @@ -0,0 +1,66 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare ptr @memset(ptr, i32, i32) + +define ptr @test_size_1(ptr %dst) { +; CHECK-LABEL: define ptr @test_size_1( +; CHECK-SAME: ptr [[DST:%.*]]) { +; CHECK-NEXT: store i16 42, ptr [[DST]], align 1 +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @memset(ptr %dst, i32 42, i32 1) + ret ptr %call +} + +define ptr @test_size_2(ptr %dst) { +; CHECK-LABEL: define ptr @test_size_2( +; CHECK-SAME: ptr [[DST:%.*]]) { +; CHECK-NEXT: store i32 2752554, ptr [[DST]], align 1 +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @memset(ptr %dst, i32 42, i32 2) + ret ptr %call +} + +define ptr @test_size_3(ptr %dst) { +; CHECK-LABEL: define ptr @test_size_3( +; CHECK-SAME: ptr [[DST:%.*]]) { +; CHECK-NEXT: call void @llvm.memset.p0.i32(ptr noundef nonnull align 1 dereferenceable(3) [[DST]], i16 42, i32 3, i1 false) +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @memset(ptr %dst, i32 42, i32 3) + ret ptr %call +} + +define ptr @test_size_4(ptr %dst) { +; CHECK-LABEL: define ptr @test_size_4( +; CHECK-SAME: ptr [[DST:%.*]]) { +; CHECK-NEXT: store i64 11822129413226538, ptr [[DST]], align 1 +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @memset(ptr %dst, i32 42, i32 4) + ret ptr %call +} + +define ptr @test_size_5(ptr %dst) { +; CHECK-LABEL: define ptr @test_size_5( +; CHECK-SAME: ptr [[DST:%.*]]) { +; CHECK-NEXT: call void @llvm.memset.p0.i32(ptr noundef nonnull align 1 dereferenceable(5) [[DST]], i16 42, i32 5, i1 false) +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @memset(ptr %dst, i32 42, i32 5) + ret ptr %call +} + +define ptr @test_size_8(ptr %dst) { +; CHECK-LABEL: define ptr @test_size_8( +; CHECK-SAME: ptr [[DST:%.*]]) { +; CHECK-NEXT: call void @llvm.memset.p0.i32(ptr noundef nonnull align 1 dereferenceable(8) [[DST]], i16 42, i32 8, i1 false) +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @memset(ptr %dst, i32 42, i32 8) + ret ptr %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/stpcpy-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/stpcpy-b16.ll new file mode 100644 index 000000000000..119f827bf6de --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/stpcpy-b16.ll @@ -0,0 +1,31 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare ptr @stpcpy(ptr, ptr) + +@hello = constant [6 x i16] [i16 104, i16 101, i16 108, i16 108, i16 111, i16 0] + +; stpcpy(x, x) -> x + strlen(x) +define ptr @test_1(ptr %str) { +; CHECK-LABEL: define ptr @test_1( +; CHECK-SAME: ptr [[STR:%.*]]) { +; CHECK-NEXT: [[STRLEN:%.*]] = call i32 @strlen(ptr noundef nonnull dereferenceable(1) [[STR]]) +; CHECK-NEXT: [[CALL:%.*]] = getelementptr inbounds i16, ptr [[STR]], i32 [[STRLEN]] +; CHECK-NEXT: ret ptr [[CALL]] +; + %call = call ptr @stpcpy(ptr %str, ptr %str) + ret ptr %call +} + +define ptr @test_2(ptr %dst) { +; CHECK-LABEL: define ptr @test_2( +; CHECK-SAME: ptr [[DST:%.*]]) { +; CHECK-NEXT: [[CALL:%.*]] = getelementptr inbounds nuw i16, ptr [[DST]], i32 5 +; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(6) [[DST]], ptr noundef nonnull align 16 dereferenceable(6) @hello, i32 6, i1 false) +; CHECK-NEXT: ret ptr [[CALL]] +; + %call = call ptr @stpcpy(ptr %dst, ptr @hello) + ret ptr %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/stpcpy_chk-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/stpcpy_chk-b16.ll new file mode 100644 index 000000000000..9b06edfa3cc3 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/stpcpy_chk-b16.ll @@ -0,0 +1,44 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare ptr @__stpcpy_chk(ptr, ptr, i32) + +@hello = constant [6 x i16] [i16 104, i16 101, i16 108, i16 108, i16 111, i16 0] + +; __stpcpy_chk(str, str, n) -> str + strlen(x) +define ptr @test_1(ptr %str, i32 %n) { +; CHECK-LABEL: define ptr @test_1( +; CHECK-SAME: ptr [[STR:%.*]], i32 [[N:%.*]]) { +; CHECK-NEXT: [[STRLEN:%.*]] = call i32 @strlen(ptr noundef nonnull dereferenceable(1) [[STR]]) +; CHECK-NEXT: [[CALL:%.*]] = getelementptr inbounds i16, ptr [[STR]], i32 [[STRLEN]] +; CHECK-NEXT: ret ptr [[CALL]] +; + %call = call ptr @__stpcpy_chk(ptr %str, ptr %str, i32 %n) + ret ptr %call +} + +; __stpcpy_chk(dst, src, n) -> stpcpy(dst, src) +define ptr @test_2(ptr %dst) { +; CHECK-LABEL: define ptr @test_2( +; CHECK-SAME: ptr [[DST:%.*]]) { +; CHECK-NEXT: [[STPCPY:%.*]] = getelementptr inbounds nuw i16, ptr [[DST]], i32 5 +; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(6) [[DST]], ptr noundef nonnull align 16 dereferenceable(6) @hello, i32 6, i1 false) +; CHECK-NEXT: ret ptr [[STPCPY]] +; + %call = call ptr @__stpcpy_chk(ptr %dst, ptr @hello, i32 42) + ret ptr %call +} + +; __stpcpy_chk(dst, src, n) -> __memcpy_chk(dst, src, strlen(src), n), dst + strlen(src) +define ptr @test_3(ptr %dst, i32 %n) { +; CHECK-LABEL: define ptr @test_3( +; CHECK-SAME: ptr [[DST:%.*]], i32 [[N:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call ptr @__memcpy_chk(ptr [[DST]], ptr nonnull @hello, i32 6, i32 [[N]]) +; CHECK-NEXT: [[CALL:%.*]] = getelementptr inbounds nuw i16, ptr [[DST]], i32 5 +; CHECK-NEXT: ret ptr [[CALL]] +; + %call = call ptr @__stpcpy_chk(ptr %dst, ptr @hello, i32 %n) + ret ptr %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/stpncpy-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/stpncpy-b16.ll new file mode 100644 index 000000000000..2b194f5006b1 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/stpncpy-b16.ll @@ -0,0 +1,47 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare ptr @stpncpy(ptr, ptr, i32) + +@empty = constant [1 x i16] [i16 0] +@hello = constant [6 x i16] [i16 104, i16 101, i16 108, i16 108, i16 111, i16 0] + +; stpncpy(dst, src, 1) -> (*dst = *src) ? dst + 1 : dst +define ptr @test_1(ptr %dst, ptr %src) { +; CHECK-LABEL: define ptr @test_1( +; CHECK-SAME: ptr [[DST:%.*]], ptr [[SRC:%.*]]) { +; CHECK-NEXT: [[STXNCPY_CHAR0:%.*]] = load i16, ptr [[SRC]], align 1 +; CHECK-NEXT: store i16 [[STXNCPY_CHAR0]], ptr [[DST]], align 1 +; CHECK-NEXT: [[STPNCPY_CHAR0CMP:%.*]] = icmp ne i16 [[STXNCPY_CHAR0]], 0 +; CHECK-NEXT: [[STPNCPY_SEL_IDX:%.*]] = zext i1 [[STPNCPY_CHAR0CMP]] to i32 +; CHECK-NEXT: [[STPNCPY_SEL:%.*]] = getelementptr inbounds nuw i16, ptr [[DST]], i32 [[STPNCPY_SEL_IDX]] +; CHECK-NEXT: ret ptr [[STPNCPY_SEL]] +; + %call = call ptr @stpncpy(ptr %dst, ptr %src, i32 1) + ret ptr %call +} + +; stpncpy(dst, "", n) -> memset(dst, '\0', n), dst +define ptr @test_2(ptr %dst, i32 %n) { +; CHECK-LABEL: define ptr @test_2( +; CHECK-SAME: ptr [[DST:%.*]], i32 [[N:%.*]]) { +; CHECK-NEXT: call void @llvm.memset.p0.i32(ptr align 1 [[DST]], i16 0, i32 [[N]], i1 false) +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @stpncpy(ptr %dst, ptr @empty, i32 %n) + ret ptr %call +} + +; stpncpy(dst, src, n) -> memcpy(dst, src, n), dst + min(strlen(src), n) +define ptr @test_3(ptr %dst) { +; CHECK-LABEL: define ptr @test_3( +; CHECK-SAME: ptr [[DST:%.*]]) { +; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(6) [[DST]], ptr noundef nonnull align 16 dereferenceable(6) @hello, i32 6, i1 false) +; CHECK-NEXT: [[ENDPTR:%.*]] = getelementptr inbounds nuw i16, ptr [[DST]], i32 5 +; CHECK-NEXT: ret ptr [[ENDPTR]] +; + %call = call ptr @stpncpy(ptr %dst, ptr @hello, i32 6) + ret ptr %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strcat-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strcat-b16.ll new file mode 100644 index 000000000000..be22c1dc6b2c --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strcat-b16.ll @@ -0,0 +1,20 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare ptr @strcat(ptr, ptr) + +@hello = constant [6 x i16] [i16 104, i16 101, i16 108, i16 108, i16 111, i16 0] + +define ptr @test(ptr %dst) { +; CHECK-LABEL: define ptr @test( +; CHECK-SAME: ptr [[DST:%.*]]) { +; CHECK-NEXT: [[STRLEN:%.*]] = call i32 @strlen(ptr noundef nonnull dereferenceable(1) [[DST]]) +; CHECK-NEXT: [[ENDPTR:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[STRLEN]] +; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(6) [[ENDPTR]], ptr noundef nonnull align 16 dereferenceable(6) @hello, i32 6, i1 false) +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @strcat(ptr %dst, ptr @hello) + ret ptr %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strchr-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strchr-b16.ll new file mode 100644 index 000000000000..98c45b3bf192 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strchr-b16.ll @@ -0,0 +1,45 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32-n64" + +declare ptr @strchr(ptr, i32) + +@hello = constant [6 x i16] [i16 104, i16 101, i16 108, i16 108, i16 111, i16 0] + +; strchr(str, c) == str -> (unsigned char)str[0] == (unsigned char)c +define i1 @test_1(ptr %str, i32 %c) { +; CHECK-LABEL: define i1 @test_1( +; CHECK-SAME: ptr [[STR:%.*]], i32 [[C:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr [[STR]], align 1 +; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[C]] to i16 +; CHECK-NEXT: [[CHAR0CMP:%.*]] = icmp eq i16 [[TMP1]], [[TMP2]] +; CHECK-NEXT: ret i1 [[CHAR0CMP]] +; + %call = call ptr @strchr(ptr %str, i32 %c) + %cmp = icmp eq ptr %call, %str + ret i1 %cmp +} + +; strchr(str, c) -> memchr(str, c, strlen(str) + 1) +define ptr @test_2(i32 %c) { +; CHECK-LABEL: define ptr @test_2( +; CHECK-SAME: i32 [[C:%.*]]) { +; CHECK-NEXT: [[STRCHR:%.*]] = call ptr @memchr(ptr noundef nonnull dereferenceable(1) @hello, i32 [[C]], i32 6) +; CHECK-NEXT: ret ptr [[STRCHR]] +; + %call = call ptr @strchr(ptr @hello, i32 %c) + ret ptr %call +} + +; strchr(str, '\0') -> len = strlen(str), str + len +define ptr @test_3(ptr %str) { +; CHECK-LABEL: define ptr @test_3( +; CHECK-SAME: ptr [[STR:%.*]]) { +; CHECK-NEXT: [[STRLEN:%.*]] = call i32 @strlen(ptr noundef nonnull dereferenceable(1) [[STR]]) +; CHECK-NEXT: [[STRCHR:%.*]] = getelementptr inbounds i16, ptr [[STR]], i32 [[STRLEN]] +; CHECK-NEXT: ret ptr [[STRCHR]] +; + %call = call ptr @strchr(ptr %str, i32 0) + ret ptr %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strcmp-b32.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strcmp-b32.ll new file mode 100644 index 000000000000..d292ff4cfe51 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strcmp-b32.ll @@ -0,0 +1,50 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:32-p:32:32" + +declare i32 @strcmp(ptr, ptr) + +@empty = constant [1 x i32] [i32 0] +@hello = constant [6 x i32] [i32 104, i32 101, i32 108, i32 108, i32 111, i32 0] +@bell = constant [5 x i32] [i32 98, i32 101, i32 108, i32 108, i32 0] +@cell = constant [5 x i32] [i32 99, i32 101, i32 108, i32 108, i32 0] + +; strcmp("", rhs) -> sext(rhs[0] != '\0') +define i32 @test_1(ptr %rhs) { +; CHECK-LABEL: define i32 @test_1( +; CHECK-SAME: ptr [[RHS:%.*]]) { +; CHECK-NEXT: [[STRCMPLOAD:%.*]] = load i32, ptr [[RHS]], align 1 +; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 [[STRCMPLOAD]], 0 +; CHECK-NEXT: [[CALL:%.*]] = sext i1 [[TMP1]] to i32 +; CHECK-NEXT: ret i32 [[CALL]] +; + %call = call i32 @strcmp(ptr @empty, ptr %rhs) + ret i32 %call +} + +; strcmp(lhs, "") -> zext(lhs[0] != '\0') +define i32 @test_2(ptr %lhs) { +; CHECK-LABEL: define i32 @test_2( +; CHECK-SAME: ptr [[LHS:%.*]]) { +; CHECK-NEXT: [[STRCMPLOAD:%.*]] = load i32, ptr [[LHS]], align 1 +; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 [[STRCMPLOAD]], 0 +; CHECK-NEXT: [[CALL:%.*]] = zext i1 [[TMP1]] to i32 +; CHECK-NEXT: ret i32 [[CALL]] +; + %call = call i32 @strcmp(ptr %lhs, ptr @empty) + ret i32 %call +} + +; strcmp(lhs, rhs) -> memcmp(lhs, rhs, min(strlen(lhs), strlen(rhs)) + 1) +define i32 @test_3(i1 %b) { +; CHECK-LABEL: define i32 @test_3( +; CHECK-SAME: i1 [[B:%.*]]) { +; CHECK-NEXT: [[RHS:%.*]] = select i1 [[B]], ptr @bell, ptr @cell +; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(5) @hello, ptr noundef nonnull dereferenceable(5) [[RHS]], i32 5) +; CHECK-NEXT: ret i32 [[MEMCMP]] +; + %rhs = select i1 %b, ptr @bell, ptr @cell + %call = call i32 @strcmp(ptr @hello, ptr %rhs) + ret i32 %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strcpy-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strcpy-b16.ll new file mode 100644 index 000000000000..fab0ebce6e77 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strcpy-b16.ll @@ -0,0 +1,18 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare ptr @strcpy(ptr, ptr) + +@hello = constant [6 x i16] [i16 104, i16 101, i16 108, i16 108, i16 111, i16 0] + +define ptr @test(ptr %dst) { +; CHECK-LABEL: define ptr @test( +; CHECK-SAME: ptr [[DST:%.*]]) { +; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(6) [[DST]], ptr noundef nonnull align 16 dereferenceable(6) @hello, i32 6, i1 false) +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @strcpy(ptr %dst, ptr @hello) + ret ptr %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strcpy_chk-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strcpy_chk-b16.ll new file mode 100644 index 000000000000..30138d1daae2 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strcpy_chk-b16.ll @@ -0,0 +1,30 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare ptr @__strcpy_chk(ptr, ptr, i32) + +@hello = constant [6 x i16] [i16 104, i16 101, i16 108, i16 108, i16 111, i16 0] + +; __strcpy_chk(dst, src, n) -> strcpy(dst, src) +define ptr @test_2(ptr %dst) { +; CHECK-LABEL: define ptr @test_2( +; CHECK-SAME: ptr [[DST:%.*]]) { +; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(6) [[DST]], ptr noundef nonnull align 16 dereferenceable(6) @hello, i32 6, i1 false) +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @__strcpy_chk(ptr %dst, ptr @hello, i32 42) + ret ptr %call +} + +; __strcpy_chk(dst, src, n) -> __memcpy_chk(dst, src, strlen(src), n) +define ptr @test_3(ptr %dst, i32 %n) { +; CHECK-LABEL: define ptr @test_3( +; CHECK-SAME: ptr [[DST:%.*]], i32 [[N:%.*]]) { +; CHECK-NEXT: [[TMP1:%.*]] = call ptr @__memcpy_chk(ptr [[DST]], ptr nonnull @hello, i32 6, i32 [[N]]) +; CHECK-NEXT: ret ptr [[TMP1]] +; + %call = call ptr @__strcpy_chk(ptr %dst, ptr @hello, i32 %n) + ret ptr %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strlcpy-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strlcpy-b16.ll new file mode 100644 index 000000000000..82e0558b28e8 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strlcpy-b16.ll @@ -0,0 +1,18 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare i32 @strlcpy(ptr, ptr, i32) + +; strlcpy(dst, src, 1) -> *dst = 0, strlen(src) +define i32 @test_1(ptr %dst, ptr %src) { +; CHECK-LABEL: define i32 @test_1( +; CHECK-SAME: ptr [[DST:%.*]], ptr [[SRC:%.*]]) { +; CHECK-NEXT: store i16 0, ptr [[DST]], align 1 +; CHECK-NEXT: [[STRLEN:%.*]] = call i32 @strlen(ptr noundef nonnull dereferenceable(1) [[SRC]]) +; CHECK-NEXT: ret i32 [[STRLEN]] +; + %call = call i32 @strlcpy(ptr %dst, ptr %src, i32 1) + ret i32 %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strlen-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strlen-b16.ll new file mode 100644 index 000000000000..228802c7ee60 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strlen-b16.ll @@ -0,0 +1,16 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare i32 @strlen(ptr) + +@hello = constant [6 x i16] [i16 104, i16 101, i16 108, i16 108, i16 111, i16 0] + +define i32 @test() { +; CHECK-LABEL: define i32 @test() { +; CHECK-NEXT: ret i32 5 +; + %call = call i32 @strlen(ptr @hello) + ret i32 %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strncat-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strncat-b16.ll new file mode 100644 index 000000000000..415545ac85a2 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strncat-b16.ll @@ -0,0 +1,20 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare ptr @strncat(ptr, ptr, i32) + +@hello = constant [6 x i16] [i16 104, i16 101, i16 108, i16 108, i16 111, i16 0] + +define ptr @test(ptr %dst) { +; CHECK-LABEL: define ptr @test( +; CHECK-SAME: ptr [[DST:%.*]]) { +; CHECK-NEXT: [[STRLEN:%.*]] = call i32 @strlen(ptr noundef nonnull dereferenceable(1) [[DST]]) +; CHECK-NEXT: [[ENDPTR:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[STRLEN]] +; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(6) [[ENDPTR]], ptr noundef nonnull align 16 dereferenceable(6) @hello, i32 6, i1 false) +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @strncat(ptr %dst, ptr @hello, i32 42) + ret ptr %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strncmp-b32.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strncmp-b32.ll new file mode 100644 index 000000000000..1363af496596 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strncmp-b32.ll @@ -0,0 +1,34 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:32-p:32:32" + +declare i32 @strncmp(ptr, ptr, i32) + +@empty = constant [1 x i32] [i32 0] + +; strncmp("", rhs, n) -> sext(rhs[0] != '\0') +define i32 @test_1(ptr %rhs) { +; CHECK-LABEL: define i32 @test_1( +; CHECK-SAME: ptr [[RHS:%.*]]) { +; CHECK-NEXT: [[STRCMPLOAD:%.*]] = load i32, ptr [[RHS]], align 1 +; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 [[STRCMPLOAD]], 0 +; CHECK-NEXT: [[CALL:%.*]] = sext i1 [[TMP1]] to i32 +; CHECK-NEXT: ret i32 [[CALL]] +; + %call = call i32 @strncmp(ptr @empty, ptr %rhs, i32 42) + ret i32 %call +} + +; strncmp(lhs, "", n) -> zext(lhs[0] != '\0') +define i32 @test_2(ptr %lhs) { +; CHECK-LABEL: define i32 @test_2( +; CHECK-SAME: ptr [[LHS:%.*]]) { +; CHECK-NEXT: [[STRCMPLOAD:%.*]] = load i32, ptr [[LHS]], align 1 +; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 [[STRCMPLOAD]], 0 +; CHECK-NEXT: [[CALL:%.*]] = zext i1 [[TMP1]] to i32 +; CHECK-NEXT: ret i32 [[CALL]] +; + %call = call i32 @strncmp(ptr %lhs, ptr @empty, i32 42) + ret i32 %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strncpy-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strncpy-b16.ll new file mode 100644 index 000000000000..77fc354ddeb4 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strncpy-b16.ll @@ -0,0 +1,43 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare ptr @strncpy(ptr, ptr, i32) + +@empty = constant [1 x i16] [i16 0] +@hello = constant [6 x i16] [i16 104, i16 101, i16 108, i16 108, i16 111, i16 0] + +; strncpy(dst, src, 1) -> (*dst = *src), dst +define ptr @test_1(ptr %dst, ptr %src) { +; CHECK-LABEL: define ptr @test_1( +; CHECK-SAME: ptr [[DST:%.*]], ptr [[SRC:%.*]]) { +; CHECK-NEXT: [[STXNCPY_CHAR0:%.*]] = load i16, ptr [[SRC]], align 1 +; CHECK-NEXT: store i16 [[STXNCPY_CHAR0]], ptr [[DST]], align 1 +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @strncpy(ptr %dst, ptr %src, i32 1) + ret ptr %call +} + +; strncpy(dst, "", n) -> memset(dst, '\0', n), dst +define ptr @test_2(ptr %dst, i32 %n) { +; CHECK-LABEL: define ptr @test_2( +; CHECK-SAME: ptr [[DST:%.*]], i32 [[N:%.*]]) { +; CHECK-NEXT: call void @llvm.memset.p0.i32(ptr align 1 [[DST]], i16 0, i32 [[N]], i1 false) +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @strncpy(ptr %dst, ptr @empty, i32 %n) + ret ptr %call +} + +; strncpy(dst, src, n) -> memcpy(dst, src, n), dst +define ptr @test_3(ptr %dst) { +; CHECK-LABEL: define ptr @test_3( +; CHECK-SAME: ptr [[DST:%.*]]) { +; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr noundef nonnull align 1 dereferenceable(6) [[DST]], ptr noundef nonnull align 16 dereferenceable(6) @hello, i32 6, i1 false) +; CHECK-NEXT: ret ptr [[DST]] +; + %call = call ptr @strncpy(ptr %dst, ptr @hello, i32 6) + ret ptr %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strndup-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strndup-b16.ll new file mode 100644 index 000000000000..8294bf668f45 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strndup-b16.ll @@ -0,0 +1,17 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare ptr @strndup(ptr, i32) + +@hello = constant [6 x i16] [i16 104, i16 101, i16 108, i16 108, i16 111, i16 0] + +define ptr @test() { +; CHECK-LABEL: define ptr @test() { +; CHECK-NEXT: [[STRDUP:%.*]] = call dereferenceable_or_null(6) ptr @strdup(ptr nonnull @hello) +; CHECK-NEXT: ret ptr [[STRDUP]] +; + %call = call ptr @strndup(ptr @hello, i32 6) + ret ptr %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strnlen-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strnlen-b16.ll new file mode 100644 index 000000000000..641022838ff7 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/strnlen-b16.ll @@ -0,0 +1,18 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare i32 @strnlen(ptr, i32) + +@hello = constant [6 x i16] [i16 104, i16 101, i16 108, i16 108, i16 111, i16 0] + +define i32 @test(i32 %n) { +; CHECK-LABEL: define i32 @test( +; CHECK-SAME: i32 [[N:%.*]]) { +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.umin.i32(i32 [[N]], i32 5) +; CHECK-NEXT: ret i32 [[CALL]] +; + %call = call i32 @strnlen(ptr @hello, i32 %n) + ret i32 %call +} diff --git a/llvm/test/Transforms/InstCombine/SimplifyLibCalls/wcslen-b16.ll b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/wcslen-b16.ll new file mode 100644 index 000000000000..5cb31257336b --- /dev/null +++ b/llvm/test/Transforms/InstCombine/SimplifyLibCalls/wcslen-b16.ll @@ -0,0 +1,19 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -p instcombine -S %s | FileCheck %s + +target datalayout = "b:16-p:32:32" + +declare i32 @wcslen(ptr) + +@hello = constant [6 x i32] [i32 104, i32 101, i32 108, i32 108, i32 111, i32 0] + +define i32 @test() { +; CHECK-LABEL: define i32 @test() { +; CHECK-NEXT: ret i32 5 +; + %call = call i32 @wcslen(ptr @hello) + ret i32 %call +} + +!0 = !{i32 1, !"wchar_size", i32 2} +!llvm.module.flags = !{!0} diff --git a/llvm/test/Transforms/InstCombine/bcmp-1.ll b/llvm/test/Transforms/InstCombine/bcmp-1.ll index 73daae44d020..b62adcd4f038 100644 --- a/llvm/test/Transforms/InstCombine/bcmp-1.ll +++ b/llvm/test/Transforms/InstCombine/bcmp-1.ll @@ -36,8 +36,8 @@ define i32 @test_simplify2(ptr %mem1, ptr %mem2) { define i32 @test_simplify3(ptr %mem1, ptr %mem2) { ; CHECK-LABEL: @test_simplify3( ; CHECK-NEXT: [[LHSC:%.*]] = load i8, ptr [[MEM1:%.*]], align 1 -; CHECK-NEXT: [[LHSV:%.*]] = zext i8 [[LHSC]] to i32 ; CHECK-NEXT: [[RHSC:%.*]] = load i8, ptr [[MEM2:%.*]], align 1 +; CHECK-NEXT: [[LHSV:%.*]] = zext i8 [[LHSC]] to i32 ; CHECK-NEXT: [[RHSV:%.*]] = zext i8 [[RHSC]] to i32 ; CHECK-NEXT: [[CHARDIFF:%.*]] = sub nsw i32 [[LHSV]], [[RHSV]] ; CHECK-NEXT: ret i32 [[CHARDIFF]] diff --git a/llvm/test/Transforms/InstCombine/memcmp-1.ll b/llvm/test/Transforms/InstCombine/memcmp-1.ll index 054896647b51..956cb39c08da 100644 --- a/llvm/test/Transforms/InstCombine/memcmp-1.ll +++ b/llvm/test/Transforms/InstCombine/memcmp-1.ll @@ -36,8 +36,8 @@ define i32 @test_simplify2(ptr %mem1, ptr %mem2) { define i32 @test_simplify3(ptr %mem1, ptr %mem2) { ; CHECK-LABEL: @test_simplify3( ; CHECK-NEXT: [[LHSC:%.*]] = load i8, ptr %mem1, align 1 -; CHECK-NEXT: [[LHSV:%.*]] = zext i8 [[LHSC]] to i32 ; CHECK-NEXT: [[RHSC:%.*]] = load i8, ptr %mem2, align 1 +; CHECK-NEXT: [[LHSV:%.*]] = zext i8 [[LHSC]] to i32 ; CHECK-NEXT: [[RHSV:%.*]] = zext i8 [[RHSC]] to i32 ; CHECK-NEXT: [[CHARDIFF:%.*]] = sub nsw i32 [[LHSV]], [[RHSV]] ; CHECK-NEXT: ret i32 [[CHARDIFF]] diff --git a/llvm/test/Transforms/InstCombine/strncmp-1.ll b/llvm/test/Transforms/InstCombine/strncmp-1.ll index 9a33b85a4049..d5e11ca8da1f 100644 --- a/llvm/test/Transforms/InstCombine/strncmp-1.ll +++ b/llvm/test/Transforms/InstCombine/strncmp-1.ll @@ -68,8 +68,8 @@ define i32 @test5() { define i32 @test6(ptr %str1, ptr %str2) { ; CHECK-LABEL: @test6( ; CHECK-NEXT: [[LHSC:%.*]] = load i8, ptr [[STR1:%.*]], align 1 -; CHECK-NEXT: [[LHSV:%.*]] = zext i8 [[LHSC]] to i32 ; CHECK-NEXT: [[RHSC:%.*]] = load i8, ptr [[STR2:%.*]], align 1 +; CHECK-NEXT: [[LHSV:%.*]] = zext i8 [[LHSC]] to i32 ; CHECK-NEXT: [[RHSV:%.*]] = zext i8 [[RHSC]] to i32 ; CHECK-NEXT: [[CHARDIFF:%.*]] = sub nsw i32 [[LHSV]], [[RHSV]] ; CHECK-NEXT: ret i32 [[CHARDIFF]] |
