mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 15:13:49 -04:00
80ee170cb3
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@276447 91177308-0d34-0410-b5e6-96231b3b80d8
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
|
|
}
|