mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
6fa6d1d712
Summary: While walking defs of pointer operands we were assuming that the pointer size would remain constant. This is not true, because addresspacecast instructions may cast the pointer to an address space with a different pointer width. This partial reverts r282612, which was a more conservative solution to this problem. Reviewers: reames, sanjoy, apilipenko Subscribers: wdng, llvm-commits Differential Revision: https://reviews.llvm.org/D24772 llvm-svn: 283557
27 lines
1.1 KiB
LLVM
27 lines
1.1 KiB
LLVM
; RUN: opt -gvn -S < %s | FileCheck %s
|
|
|
|
; Make sure we don't crash when analyzing an addrspacecast in
|
|
; GetPointerBaseWithConstantOffset()
|
|
|
|
target datalayout = "e-p:32:32-p4:64:64"
|
|
|
|
define i32 @addrspacecast-crash() {
|
|
; CHECK-LABEL: @addrspacecast-crash
|
|
; CHECK: %tmp = alloca [25 x i64]
|
|
; CHECK: %tmp1 = getelementptr inbounds [25 x i64], [25 x i64]* %tmp, i32 0, i32 0
|
|
; CHECK: %tmp2 = addrspacecast i64* %tmp1 to <8 x i64> addrspace(4)*
|
|
; CHECK: store <8 x i64> zeroinitializer, <8 x i64> addrspace(4)* %tmp2
|
|
; CHECK-NOT: load
|
|
bb:
|
|
%tmp = alloca [25 x i64]
|
|
%tmp1 = getelementptr inbounds [25 x i64], [25 x i64]* %tmp, i32 0, i32 0
|
|
%tmp2 = addrspacecast i64* %tmp1 to <8 x i64> addrspace(4)*
|
|
%tmp3 = getelementptr inbounds <8 x i64>, <8 x i64> addrspace(4)* %tmp2, i64 0
|
|
store <8 x i64> zeroinitializer, <8 x i64> addrspace(4)* %tmp3
|
|
%tmp4 = getelementptr inbounds [25 x i64], [25 x i64]* %tmp, i32 0, i32 0
|
|
%tmp5 = addrspacecast i64* %tmp4 to i32 addrspace(4)*
|
|
%tmp6 = getelementptr inbounds i32, i32 addrspace(4)* %tmp5, i64 10
|
|
%tmp7 = load i32, i32 addrspace(4)* %tmp6, align 4
|
|
ret i32 %tmp7
|
|
}
|