mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
6ae0a3f9c3
The current logic in TargetLibraryInfoImpl::getLibFunc() was only treating strcpy, etc. with i8* arguments in address space zero as a valid library function. However, in the CHERI and Morello targets we expect all libc functions to use address space 200 arguments. This commit updates isValidProtoForLibFunc() to check that the argument is a pointer type. This also drops the check for i8* since we should not be checking the pointee type any more. Reviewed By: arsenm Differential Revision: https://reviews.llvm.org/D95142
62 lines
3.8 KiB
LLVM
62 lines
3.8 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes
|
|
; Test that the strcpy library call simplifier also works when the string
|
|
; libcall arguments are in a non-zero address space.
|
|
; RUN: opt < %s -instcombine -S | FileCheck %s
|
|
target datalayout = "e-m:e-p200:128:128:128:64-p:64:64-A200-P200-G200"
|
|
|
|
@str = private unnamed_addr addrspace(200) constant [17 x i8] c"exactly 16 chars\00", align 1
|
|
|
|
declare i8 addrspace(200)* @strcpy(i8 addrspace(200)*, i8 addrspace(200)*) addrspace(200)
|
|
declare i8 addrspace(200)* @stpcpy(i8 addrspace(200)*, i8 addrspace(200)*) addrspace(200)
|
|
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)
|
|
|
|
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 addrspace(200) void @llvm.memcpy.p200i8.p200i8.i64(i8 addrspace(200)* noundef align 1 dereferenceable(17) [[DST]], i8 addrspace(200)* noundef 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:
|
|
%call = call 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))
|
|
ret void
|
|
}
|
|
|
|
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 addrspace(200) void @llvm.memcpy.p200i8.p200i8.i128(i8 addrspace(200)* noundef align 1 dereferenceable(17) [[DST]], i8 addrspace(200)* noundef 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:
|
|
%call = call 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))
|
|
ret void
|
|
}
|
|
|
|
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 addrspace(200) void @llvm.memcpy.p200i8.p200i8.i128(i8 addrspace(200)* noundef align 1 dereferenceable(17) [[DST]], i8 addrspace(200)* noundef 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:
|
|
%call = call 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)
|
|
ret void
|
|
}
|
|
|
|
; Note: stpncpy is not handled by SimplifyLibcalls yet, so this should not be changed.
|
|
define void @test_stpncpy_to_memcpy(i8 addrspace(200)* %dst) addrspace(200) nounwind {
|
|
; CHECK-LABEL: define {{[^@]+}}@test_stpncpy_to_memcpy
|
|
; CHECK-SAME: (i8 addrspace(200)* [[DST:%.*]]) addrspace(200) [[ATTR0]] {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[CALL:%.*]] = call addrspace(200) i8 addrspace(200)* @stpncpy(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: ret void
|
|
;
|
|
entry:
|
|
%call = call i8 addrspace(200)* @stpncpy(i8 addrspace(200)* %dst, i8 addrspace(200)* getelementptr inbounds ([17 x i8], [17 x i8] addrspace(200)* @str, i64 0, i64 0), i64 17)
|
|
ret void
|
|
}
|