mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-21 16:31:16 +00:00
67cb554e65
Summary: Previously the code didn't check if the before and after types for the store were pointers to different address spaces. This resulted in instcombine using a bitcast to convert between pointers to different address spaces, causing an assertion due to the invalid cast. It is not be appropriate to use addrspacecast this case because it is not guaranteed to be a no-op cast. Instead bail out and do not do the transformation. CC: llvm-commits Differential Revision: http://llvm-reviews.chandlerc.com/D3117 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204733 91177308-0d34-0410-b5e6-96231b3b80d8
36 lines
1.3 KiB
LLVM
36 lines
1.3 KiB
LLVM
; RUN: opt -S -instcombine < %s | FileCheck %s
|
|
|
|
; Instcombine should preserve metadata and alignment while
|
|
; folding a bitcast into a store.
|
|
|
|
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
|
|
|
|
%struct.A = type { i32 (...)** }
|
|
|
|
@G = external constant [5 x i8*]
|
|
|
|
; CHECK-LABEL: @foo
|
|
; CHECK: store i32 (...)** bitcast (i8** getelementptr inbounds ([5 x i8*]* @G, i64 0, i64 2) to i32 (...)**), i32 (...)*** %0, align 16, !tag !0
|
|
define void @foo(%struct.A* %a) nounwind {
|
|
entry:
|
|
%0 = bitcast %struct.A* %a to i8***
|
|
store i8** getelementptr inbounds ([5 x i8*]* @G, i64 0, i64 2), i8*** %0, align 16, !tag !0
|
|
ret void
|
|
}
|
|
|
|
; Check instcombine doesn't try and fold the following bitcast into the store.
|
|
; This transformation would not be safe since we would need to use addrspacecast
|
|
; and addrspacecast is not guaranteed to be a no-op cast.
|
|
|
|
; CHECK-LABEL: @bar
|
|
; CHECK: %cast = bitcast i8** %b to i8 addrspace(1)**
|
|
; CHECK: store i8 addrspace(1)* %a, i8 addrspace(1)** %cast
|
|
define void @bar(i8 addrspace(1)* %a, i8** %b) nounwind {
|
|
entry:
|
|
%cast = bitcast i8** %b to i8 addrspace(1)**
|
|
store i8 addrspace(1)* %a, i8 addrspace(1)** %cast
|
|
ret void
|
|
}
|
|
|
|
!0 = metadata !{metadata !"hello"}
|