diff options
author | Anna Thomas <anna@azul.com> | 2016-07-21 18:41:44 +0000 |
---|---|---|
committer | Anna Thomas <anna@azul.com> | 2016-07-21 18:41:44 +0000 |
commit | 29b24dfe44f29d6adbcc84e725aa7836fc0d4831 (patch) | |
tree | a0e578e891c5b585c0c2fd6390bed97718e27a65 /llvm/test/Transforms/InstCombine/invariant.ll | |
parent | 3c944ec81ac4716cba307379929832aad333ba3f (diff) | |
download | bcm5719-llvm-29b24dfe44f29d6adbcc84e725aa7836fc0d4831.tar.gz bcm5719-llvm-29b24dfe44f29d6adbcc84e725aa7836fc0d4831.zip |
Invariant start/end intrinsics overloaded for address space
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: tstellarAMD, reames, apilipenko
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D22519
llvm-svn: 276316
Diffstat (limited to 'llvm/test/Transforms/InstCombine/invariant.ll')
-rw-r--r-- | llvm/test/Transforms/InstCombine/invariant.ll | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/llvm/test/Transforms/InstCombine/invariant.ll b/llvm/test/Transforms/InstCombine/invariant.ll index 246f9e64041..21e5f0fe858 100644 --- a/llvm/test/Transforms/InstCombine/invariant.ll +++ b/llvm/test/Transforms/InstCombine/invariant.ll @@ -2,15 +2,27 @@ ; RUN: opt < %s -instcombine -S | FileCheck %s declare void @g(i8*) +declare void @g_addr1(i8 addrspace(1)*) -declare {}* @llvm.invariant.start(i64, i8* nocapture) nounwind readonly +declare {}* @llvm.invariant.start.p0i8(i64, i8* nocapture) nounwind readonly +declare {}* @llvm.invariant.start.p1i8(i64, i8 addrspace(1)* nocapture) nounwind readonly define i8 @f() { %a = alloca i8 ; <i8*> [#uses=4] store i8 0, i8* %a - %i = call {}* @llvm.invariant.start(i64 1, i8* %a) ; <{}*> [#uses=0] - ; CHECK: call {}* @llvm.invariant.start + %i = call {}* @llvm.invariant.start.p0i8(i64 1, i8* %a) ; <{}*> [#uses=0] + ; CHECK: call {}* @llvm.invariant.start.p0i8 call void @g(i8* %a) %r = load i8, i8* %a ; <i8> [#uses=1] ret i8 %r } + +; make sure llvm.invariant.call in non-default addrspace are also not eliminated. +define i8 @f_addrspace1(i8 addrspace(1)* %a) { + store i8 0, i8 addrspace(1)* %a + %i = call {}* @llvm.invariant.start.p1i8(i64 1, i8 addrspace(1)* %a) ; <{}*> [#uses=0] + ; CHECK: call {}* @llvm.invariant.start.p1i8 + call void @g_addr1(i8 addrspace(1)* %a) + %r = load i8, i8 addrspace(1)* %a ; <i8> [#uses=1] + ret i8 %r +} |