mirror of
https://github.com/RPCS3/llvm.git
synced 2026-01-31 01:25:19 +01:00
rL306209 taught SelectionDAG how to add the dereferenceable flag when expanding memcpy and memmove. The fix however contained a nit where the offset + size was constructed as an APInt of PointerSize rather than PointerSizeInBits. This lead to isDereferenceableAndAlignedPointer() get truncated values or values which would be sign extended within that function leading to incorrect results. Thanks to Alex Crichton for reporting the issue! This resolves PR33978. Reviewers: inouehrs Differential Revision: https://reviews.llvm.org/D36236 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309930 91177308-0d34-0410-b5e6-96231b3b80d8
21 lines
795 B
LLVM
21 lines
795 B
LLVM
; RUN: llc -march=mips -mcpu=mips32r2 < %s -o /dev/null
|
|
|
|
; Test that SelectionDAG does not crash during DAGCombine when two pointers
|
|
; to the stack match with differing bases and offsets when expanding memcpy.
|
|
; This could result in one of the pointers being considered dereferenceable
|
|
; and other not.
|
|
|
|
define void @foo(i8*) {
|
|
start:
|
|
%a = alloca [22 x i8]
|
|
%b = alloca [22 x i8]
|
|
%c = bitcast [22 x i8]* %a to i8*
|
|
%d = getelementptr inbounds [22 x i8], [22 x i8]* %b, i32 0, i32 2
|
|
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %c, i8* %d, i32 20, i32 1, i1 false)
|
|
%e = getelementptr inbounds [22 x i8], [22 x i8]* %b, i32 0, i32 6
|
|
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %0, i8* %e, i32 12, i32 1, i1 false)
|
|
ret void
|
|
}
|
|
|
|
declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1)
|