mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
6f5ce86e80
Summary: The llvm.invariant.start and llvm.invariant.end intrinsics currently support specifying invariant memory objects only in the default address space. With this change, these intrinsics are overloaded for any adddress space for memory objects and we can use these llvm invariant intrinsics in non-default address spaces. Example: llvm.invariant.start.p1i8(i64 4, i8 addrspace(1)* %ptr) This overloaded intrinsic is needed for representing final or invariant memory in managed languages. Reviewers: apilipenko, reames Subscribers: llvm-commits llvm-svn: 276447
37 lines
1.3 KiB
LLVM
37 lines
1.3 KiB
LLVM
; RUN: llvm-as -disable-output < %s
|
|
|
|
%"struct.std::pair<int,int>" = type { i32, i32 }
|
|
|
|
declare void @_Z3barRKi(i32*)
|
|
|
|
declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind
|
|
declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind
|
|
declare {}* @llvm.invariant.start.p0i8(i64, i8* nocapture) readonly nounwind
|
|
declare void @llvm.invariant.end.p0i8({}*, i64, i8* nocapture) nounwind
|
|
|
|
define i32 @_Z4foo2v() nounwind {
|
|
entry:
|
|
%x = alloca %"struct.std::pair<int,int>"
|
|
%y = bitcast %"struct.std::pair<int,int>"* %x to i8*
|
|
|
|
;; Constructor starts here (this isn't needed since it is immediately
|
|
;; preceded by an alloca, but shown for completeness).
|
|
call void @llvm.lifetime.start(i64 8, i8* %y)
|
|
|
|
%0 = getelementptr %"struct.std::pair<int,int>", %"struct.std::pair<int,int>"* %x, i32 0, i32 0
|
|
store i32 4, i32* %0, align 8
|
|
%1 = getelementptr %"struct.std::pair<int,int>", %"struct.std::pair<int,int>"* %x, i32 0, i32 1
|
|
store i32 5, i32* %1, align 4
|
|
|
|
;; Constructor has finished here.
|
|
%inv = call {}* @llvm.invariant.start.p0i8(i64 8, i8* %y)
|
|
call void @_Z3barRKi(i32* %0) nounwind
|
|
%2 = load i32, i32* %0, align 8
|
|
|
|
;; Destructor is run here.
|
|
call void @llvm.invariant.end.p0i8({}* %inv, i64 8, i8* %y)
|
|
;; Destructor is done here.
|
|
call void @llvm.lifetime.end(i64 8, i8* %y)
|
|
ret i32 %2
|
|
}
|