summaryrefslogtreecommitdiff
path: root/llvm/test/Transforms
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/fputs-b16.ll19
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/fwrite-b16.ll19
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/memchr-b16.ll34
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/memcmp-b32.ll32
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/memcpy-b16.ll69
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/memcpy_chk-b16.ll17
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/mempcpy-b16.ll17
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/memrchr-b16.ll20
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/memset-b16.ll66
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/stpcpy-b16.ll31
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/stpcpy_chk-b16.ll44
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/stpncpy-b16.ll47
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/strcat-b16.ll20
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/strchr-b16.ll45
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/strcmp-b32.ll50
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/strcpy-b16.ll18
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/strcpy_chk-b16.ll30
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/strlcpy-b16.ll18
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/strlen-b16.ll16
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/strncat-b16.ll20
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/strncmp-b32.ll34
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/strncpy-b16.ll43
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/strndup-b16.ll17
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/strnlen-b16.ll18
-rw-r--r--llvm/test/Transforms/InstCombine/SimplifyLibCalls/wcslen-b16.ll19
-rw-r--r--llvm/test/Transforms/InstCombine/bcmp-1.ll2
-rw-r--r--llvm/test/Transforms/InstCombine/memcmp-1.ll2
-rw-r--r--llvm/test/Transforms/InstCombine/strncmp-1.ll2
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]]