diff --git a/llvm/lib/Analysis/TargetLibraryInfo.cpp b/llvm/lib/Analysis/TargetLibraryInfo.cpp --- a/llvm/lib/Analysis/TargetLibraryInfo.cpp +++ b/llvm/lib/Analysis/TargetLibraryInfo.cpp @@ -645,7 +645,6 @@ LibFunc F, const DataLayout *DL) const { LLVMContext &Ctx = FTy.getContext(); - Type *PCharTy = Type::getInt8PtrTy(Ctx); Type *SizeTTy = DL ? DL->getIntPtrType(Ctx, /*AddressSpace=*/0) : nullptr; auto IsSizeTTy = [SizeTTy](Type *Ty) { return SizeTTy ? Ty == SizeTTy : Ty->isIntegerTy(); @@ -727,7 +726,7 @@ case LibFunc_stpcpy: return (NumParams == 2 && FTy.getReturnType() == FTy.getParamType(0) && FTy.getParamType(0) == FTy.getParamType(1) && - FTy.getParamType(0) == PCharTy); + FTy.getParamType(0)->isPointerTy()); case LibFunc_strlcat_chk: case LibFunc_strlcpy_chk: @@ -752,7 +751,7 @@ case LibFunc_stpncpy: return (NumParams == 3 && FTy.getReturnType() == FTy.getParamType(0) && FTy.getParamType(0) == FTy.getParamType(1) && - FTy.getParamType(0) == PCharTy && + FTy.getParamType(0)->isPointerTy() && IsSizeTTy(FTy.getParamType(2))); case LibFunc_strxfrm: @@ -895,7 +894,7 @@ case LibFunc_realloc: case LibFunc_reallocf: case LibFunc_vec_realloc: - return (NumParams == 2 && FTy.getReturnType() == PCharTy && + return (NumParams == 2 && FTy.getReturnType()->isPointerTy() && FTy.getParamType(0) == FTy.getReturnType() && IsSizeTTy(FTy.getParamType(1))); case LibFunc_read: @@ -1026,7 +1025,7 @@ case LibFunc_getchar_unlocked: return (NumParams == 0 && FTy.getReturnType()->isIntegerTy()); case LibFunc_gets: - return (NumParams == 1 && FTy.getParamType(0) == PCharTy); + return (NumParams == 1 && FTy.getParamType(0)->isPointerTy()); case LibFunc_getitimer: return (NumParams == 2 && FTy.getParamType(1)->isPointerTy()); case LibFunc_ungetc: @@ -1482,13 +1481,13 @@ case LibFunc_strnlen: return (NumParams == 2 && FTy.getReturnType() == FTy.getParamType(1) && - FTy.getParamType(0) == PCharTy && - FTy.getParamType(1) == SizeTTy); + FTy.getParamType(0)->isPointerTy() && + IsSizeTTy(FTy.getParamType(1))); case LibFunc_posix_memalign: return (NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) && FTy.getParamType(0)->isPointerTy() && - FTy.getParamType(1) == SizeTTy && FTy.getParamType(2) == SizeTTy); + IsSizeTTy(FTy.getParamType(1)) && IsSizeTTy(FTy.getParamType(2))); case LibFunc_wcslen: return (NumParams == 1 && FTy.getParamType(0)->isPointerTy() && diff --git a/llvm/test/Transforms/InstCombine/strcpy-nonzero-as.ll b/llvm/test/Transforms/InstCombine/strcpy-nonzero-as.ll --- a/llvm/test/Transforms/InstCombine/strcpy-nonzero-as.ll +++ b/llvm/test/Transforms/InstCombine/strcpy-nonzero-as.ll @@ -11,12 +11,11 @@ declare i8 addrspace(200)* @strncpy(i8 addrspace(200)*, i8 addrspace(200)*, i64) addrspace(200) declare i8 addrspace(200)* @stpncpy(i8 addrspace(200)*, i8 addrspace(200)*, i64) addrspace(200) -; TODO: this should be converted to a memcpy define void @test_strcpy_to_memcpy(i8 addrspace(200)* %dst) addrspace(200) nounwind { ; CHECK-LABEL: define {{[^@]+}}@test_strcpy_to_memcpy ; CHECK-SAME: (i8 addrspace(200)* [[DST:%.*]]) addrspace(200) [[ATTR0:#.*]] { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = call addrspace(200) i8 addrspace(200)* @strcpy(i8 addrspace(200)* [[DST]], i8 addrspace(200)* getelementptr inbounds ([17 x i8], [17 x i8] addrspace(200)* @str, i64 0, i64 0)) +; CHECK-NEXT: call addrspace(200) void @llvm.memcpy.p200i8.p200i8.i64(i8 addrspace(200)* align 1 dereferenceable(17) [[DST]], i8 addrspace(200)* align 1 dereferenceable(17) getelementptr inbounds ([17 x i8], [17 x i8] addrspace(200)* @str, i64 0, i64 0), i64 17, i1 false) ; CHECK-NEXT: ret void ; entry: @@ -24,12 +23,11 @@ ret void } -; TODO: this should be converted to a memcpy define void @test_stpcpy_to_memcpy(i8 addrspace(200)* %dst) addrspace(200) nounwind { ; CHECK-LABEL: define {{[^@]+}}@test_stpcpy_to_memcpy ; CHECK-SAME: (i8 addrspace(200)* [[DST:%.*]]) addrspace(200) [[ATTR0]] { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = call addrspace(200) i8 addrspace(200)* @stpcpy(i8 addrspace(200)* [[DST]], i8 addrspace(200)* getelementptr inbounds ([17 x i8], [17 x i8] addrspace(200)* @str, i64 0, i64 0)) +; CHECK-NEXT: call addrspace(200) void @llvm.memcpy.p200i8.p200i8.i128(i8 addrspace(200)* align 1 dereferenceable(17) [[DST]], i8 addrspace(200)* align 1 dereferenceable(17) getelementptr inbounds ([17 x i8], [17 x i8] addrspace(200)* @str, i64 0, i64 0), i128 17, i1 false) ; CHECK-NEXT: ret void ; entry: @@ -37,12 +35,11 @@ ret void } -; TODO: this should be converted to a memcpy define void @test_strncpy_to_memcpy(i8 addrspace(200)* %dst) addrspace(200) nounwind { ; CHECK-LABEL: define {{[^@]+}}@test_strncpy_to_memcpy ; CHECK-SAME: (i8 addrspace(200)* [[DST:%.*]]) addrspace(200) [[ATTR0]] { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = call addrspace(200) i8 addrspace(200)* @strncpy(i8 addrspace(200)* [[DST]], i8 addrspace(200)* getelementptr inbounds ([17 x i8], [17 x i8] addrspace(200)* @str, i64 0, i64 0), i64 17) +; CHECK-NEXT: call addrspace(200) void @llvm.memcpy.p200i8.p200i8.i128(i8 addrspace(200)* align 1 dereferenceable(17) [[DST]], i8 addrspace(200)* align 1 dereferenceable(17) getelementptr inbounds ([17 x i8], [17 x i8] addrspace(200)* @str, i64 0, i64 0), i128 17, i1 false) ; CHECK-NEXT: ret void ; entry: diff --git a/llvm/test/Transforms/InstCombine/strncpy_chk-2.ll b/llvm/test/Transforms/InstCombine/strncpy_chk-2.ll --- a/llvm/test/Transforms/InstCombine/strncpy_chk-2.ll +++ b/llvm/test/Transforms/InstCombine/strncpy_chk-2.ll @@ -6,16 +6,16 @@ target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" @a = common global [60 x i16] zeroinitializer, align 1 -@b = common global [60 x i16] zeroinitializer, align 1 +@b = common global [60 x i8] zeroinitializer, align 1 define void @test_no_simplify() { ; CHECK-LABEL: @test_no_simplify( %dst = getelementptr inbounds [60 x i16], [60 x i16]* @a, i32 0, i32 0 - %src = getelementptr inbounds [60 x i16], [60 x i16]* @b, i32 0, i32 0 + %src = getelementptr inbounds [60 x i8], [60 x i8]* @b, i32 0, i32 0 ; CHECK-NEXT: call i16* @__strncpy_chk - call i16* @__strncpy_chk(i16* %dst, i16* %src, i32 60, i32 60) + call i16* @__strncpy_chk(i16* %dst, i8* %src, i32 60, i32 60) ret void } -declare i16* @__strncpy_chk(i16*, i16*, i32, i32) +declare i16* @__strncpy_chk(i16*, i8*, i32, i32)