Skip to content

Commit 10c2596

Browse files
[NVPTX] Add support for isspacep instruction
llvm-svn: 211931
1 parent 124fc19 commit 10c2596

File tree

4 files changed

+93
-0
lines changed

4 files changed

+93
-0
lines changed

llvm/include/llvm/IR/IntrinsicsNVVM.td

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,24 @@ def int_nvvm_compiler_error :
889889
def int_nvvm_compiler_warn :
890890
Intrinsic<[], [llvm_anyptr_ty], [], "llvm.nvvm.compiler.warn">;
891891

892+
// isspacep.{const, global, local, shared}
893+
def int_nvvm_isspacep_const
894+
: Intrinsic<[llvm_i1_ty], [llvm_ptr_ty], [IntrNoMem],
895+
"llvm.nvvm.isspacep.const">,
896+
GCCBuiltin<"__nvvm_isspacep_const">;
897+
def int_nvvm_isspacep_global
898+
: Intrinsic<[llvm_i1_ty], [llvm_ptr_ty], [IntrNoMem],
899+
"llvm.nvvm.isspacep.global">,
900+
GCCBuiltin<"__nvvm_isspacep_global">;
901+
def int_nvvm_isspacep_local
902+
: Intrinsic<[llvm_i1_ty], [llvm_ptr_ty], [IntrNoMem],
903+
"llvm.nvvm.isspacep.local">,
904+
GCCBuiltin<"__nvvm_isspacep_local">;
905+
def int_nvvm_isspacep_shared
906+
: Intrinsic<[llvm_i1_ty], [llvm_ptr_ty], [IntrNoMem],
907+
"llvm.nvvm.isspacep.shared">,
908+
GCCBuiltin<"__nvvm_isspacep_shared">;
909+
892910
// Environment register read
893911
def int_nvvm_read_ptx_sreg_envreg0
894912
: Intrinsic<[llvm_i32_ty], [], [IntrNoMem],

llvm/lib/Target/NVPTX/NVPTXInstrInfo.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,8 @@ def hasHWROT32 : Predicate<"Subtarget.hasHWROT32()">;
161161

162162
def true : Predicate<"1">;
163163

164+
def hasPTX31 : Predicate<"Subtarget.getPTXVersion() >= 31">;
165+
164166

165167
//===----------------------------------------------------------------------===//
166168
// Some Common Instruction Class Templates

llvm/lib/Target/NVPTX/NVPTXIntrinsics.td

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1689,6 +1689,44 @@ def INT_NVVM_COMPILER_ERROR_64 : NVPTXInst<(outs), (ins Int64Regs:$a),
16891689
[(int_nvvm_compiler_error Int64Regs:$a)]>;
16901690

16911691

1692+
// isspacep
1693+
1694+
def ISSPACEP_CONST_32
1695+
: NVPTXInst<(outs Int1Regs:$d), (ins Int32Regs:$a),
1696+
"isspacep.const \t$d, $a;",
1697+
[(set Int1Regs:$d, (int_nvvm_isspacep_const Int32Regs:$a))]>,
1698+
Requires<[hasPTX31]>;
1699+
def ISSPACEP_CONST_64
1700+
: NVPTXInst<(outs Int1Regs:$d), (ins Int64Regs:$a),
1701+
"isspacep.const \t$d, $a;",
1702+
[(set Int1Regs:$d, (int_nvvm_isspacep_const Int64Regs:$a))]>,
1703+
Requires<[hasPTX31]>;
1704+
def ISSPACEP_GLOBAL_32
1705+
: NVPTXInst<(outs Int1Regs:$d), (ins Int32Regs:$a),
1706+
"isspacep.global \t$d, $a;",
1707+
[(set Int1Regs:$d, (int_nvvm_isspacep_global Int32Regs:$a))]>;
1708+
def ISSPACEP_GLOBAL_64
1709+
: NVPTXInst<(outs Int1Regs:$d), (ins Int64Regs:$a),
1710+
"isspacep.global \t$d, $a;",
1711+
[(set Int1Regs:$d, (int_nvvm_isspacep_global Int64Regs:$a))]>;
1712+
def ISSPACEP_LOCAL_32
1713+
: NVPTXInst<(outs Int1Regs:$d), (ins Int32Regs:$a),
1714+
"isspacep.local \t$d, $a;",
1715+
[(set Int1Regs:$d, (int_nvvm_isspacep_local Int32Regs:$a))]>;
1716+
def ISSPACEP_LOCAL_64
1717+
: NVPTXInst<(outs Int1Regs:$d), (ins Int64Regs:$a),
1718+
"isspacep.local \t$d, $a;",
1719+
[(set Int1Regs:$d, (int_nvvm_isspacep_local Int64Regs:$a))]>;
1720+
def ISSPACEP_SHARED_32
1721+
: NVPTXInst<(outs Int1Regs:$d), (ins Int32Regs:$a),
1722+
"isspacep.shared \t$d, $a;",
1723+
[(set Int1Regs:$d, (int_nvvm_isspacep_shared Int32Regs:$a))]>;
1724+
def ISSPACEP_SHARED_64
1725+
: NVPTXInst<(outs Int1Regs:$d), (ins Int64Regs:$a),
1726+
"isspacep.shared \t$d, $a;",
1727+
[(set Int1Regs:$d, (int_nvvm_isspacep_shared Int64Regs:$a))]>;
1728+
1729+
16921730
// Special register reads
16931731
def MOV_SPECIAL : NVPTXInst<(outs Int32Regs:$d),
16941732
(ins SpecialRegs:$r),

llvm/test/CodeGen/NVPTX/isspacep.ll

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s
2+
3+
declare i1 @llvm.nvvm.isspacep.const(i8*) readnone noinline
4+
declare i1 @llvm.nvvm.isspacep.global(i8*) readnone noinline
5+
declare i1 @llvm.nvvm.isspacep.local(i8*) readnone noinline
6+
declare i1 @llvm.nvvm.isspacep.shared(i8*) readnone noinline
7+
8+
; CHECK: is_const
9+
define i1 @is_const(i8* %addr) {
10+
; CHECK: isspacep.const
11+
%v = tail call i1 @llvm.nvvm.isspacep.const(i8* %addr)
12+
ret i1 %v
13+
}
14+
15+
; CHECK: is_global
16+
define i1 @is_global(i8* %addr) {
17+
; CHECK: isspacep.global
18+
%v = tail call i1 @llvm.nvvm.isspacep.global(i8* %addr)
19+
ret i1 %v
20+
}
21+
22+
; CHECK: is_local
23+
define i1 @is_local(i8* %addr) {
24+
; CHECK: isspacep.local
25+
%v = tail call i1 @llvm.nvvm.isspacep.local(i8* %addr)
26+
ret i1 %v
27+
}
28+
29+
; CHECK: is_shared
30+
define i1 @is_shared(i8* %addr) {
31+
; CHECK: isspacep.shared
32+
%v = tail call i1 @llvm.nvvm.isspacep.shared(i8* %addr)
33+
ret i1 %v
34+
}
35+

0 commit comments

Comments
 (0)