summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/AMDGPU/write_register.ll
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2016-01-26 04:29:24 +0000
committerMatt Arsenault <Matthew.Arsenault@amd.com>2016-01-26 04:29:24 +0000
commit9a10cea7fb399ec05da5ba301b9bb7e123df543d (patch)
tree9c099c01c9b431048c0f512f188072961f91174e /llvm/test/CodeGen/AMDGPU/write_register.ll
parentcee02ccc1df62d914b695f726544429b4b5356bc (diff)
downloadbcm5719-llvm-9a10cea7fb399ec05da5ba301b9bb7e123df543d.tar.gz
bcm5719-llvm-9a10cea7fb399ec05da5ba301b9bb7e123df543d.zip
AMDGPU: Implement read_register and write_register intrinsics
Some of the special intrinsics now that now correspond to a instruction also have special setting of some registers, e.g. llvm.SI.sendmsg sets m0 as well as use s_sendmsg. Using these explicit register intrinsics may be a better option. Reading the exec mask and others may be useful for debugging. For this I'm not sure this is entirely correct because we would want this to be convergent, although it's possible this is already treated sufficently conservatively. llvm-svn: 258785
Diffstat (limited to 'llvm/test/CodeGen/AMDGPU/write_register.ll')
-rw-r--r--llvm/test/CodeGen/AMDGPU/write_register.ll80
1 files changed, 80 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/AMDGPU/write_register.ll b/llvm/test/CodeGen/AMDGPU/write_register.ll
new file mode 100644
index 00000000000..88660ba6ec6
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/write_register.ll
@@ -0,0 +1,80 @@
+; RUN: llc -march=amdgcn -mcpu=bonaire -verify-machineinstrs < %s | FileCheck %s
+
+declare void @llvm.write_register.i32(metadata, i32) #0
+declare void @llvm.write_register.i64(metadata, i64) #0
+
+; CHECK-LABEL: {{^}}test_write_m0:
+define void @test_write_m0(i32 %val) #0 {
+ call void @llvm.write_register.i32(metadata !0, i32 0)
+ call void @llvm.write_register.i32(metadata !0, i32 -1)
+ call void @llvm.write_register.i32(metadata !0, i32 %val)
+ ret void
+}
+
+; CHECK-LABEL: {{^}}test_write_exec:
+; CHECK: s_mov_b64 exec, 0
+; CHECK: s_mov_b64 exec, -1
+; CHECK: s_mov_b64 exec, s{{\[[0-9]+:[0-9]+\]}}
+define void @test_write_exec(i64 %val) #0 {
+ call void @llvm.write_register.i64(metadata !1, i64 0)
+ call void @llvm.write_register.i64(metadata !1, i64 -1)
+ call void @llvm.write_register.i64(metadata !1, i64 %val)
+ ret void
+}
+
+; CHECK-LABEL: {{^}}test_write_flat_scratch:
+; CHECK: s_mov_b64 flat_scratch, 0
+; CHECK: s_mov_b64 flat_scratch, -1
+; CHECK: s_mov_b64 flat_scratch, s{{\[[0-9]+:[0-9]+\]}}
+define void @test_write_flat_scratch(i64 %val) #0 {
+ call void @llvm.write_register.i64(metadata !2, i64 0)
+ call void @llvm.write_register.i64(metadata !2, i64 -1)
+ call void @llvm.write_register.i64(metadata !2, i64 %val)
+ ret void
+}
+
+; CHECK-LABEL: {{^}}test_write_flat_scratch_lo:
+; CHECK: s_mov_b32 flat_scratch_lo, 0
+; CHECK: s_mov_b32 flat_scratch_lo, s{{[0-9]+}}
+define void @test_write_flat_scratch_lo(i32 %val) #0 {
+ call void @llvm.write_register.i32(metadata !3, i32 0)
+ call void @llvm.write_register.i32(metadata !3, i32 %val)
+ ret void
+}
+
+; CHECK-LABEL: {{^}}test_write_flat_scratch_hi:
+; CHECK: s_mov_b32 flat_scratch_hi, 0
+; CHECK: s_mov_b32 flat_scratch_hi, s{{[0-9]+}}
+define void @test_write_flat_scratch_hi(i32 %val) #0 {
+ call void @llvm.write_register.i32(metadata !4, i32 0)
+ call void @llvm.write_register.i32(metadata !4, i32 %val)
+ ret void
+}
+
+; CHECK-LABEL: {{^}}test_write_exec_lo:
+; CHECK: s_mov_b32 exec_lo, 0
+; CHECK: s_mov_b32 exec_lo, s{{[0-9]+}}
+define void @test_write_exec_lo(i32 %val) #0 {
+ call void @llvm.write_register.i32(metadata !5, i32 0)
+ call void @llvm.write_register.i32(metadata !5, i32 %val)
+ ret void
+}
+
+; CHECK-LABEL: {{^}}test_write_exec_hi:
+; CHECK: s_mov_b32 exec_hi, 0
+; CHECK: s_mov_b32 exec_hi, s{{[0-9]+}}
+define void @test_write_exec_hi(i32 %val) #0 {
+ call void @llvm.write_register.i32(metadata !6, i32 0)
+ call void @llvm.write_register.i32(metadata !6, i32 %val)
+ ret void
+}
+
+attributes #0 = { nounwind }
+
+!0 = !{!"m0"}
+!1 = !{!"exec"}
+!2 = !{!"flat_scratch"}
+!3 = !{!"flat_scratch_lo"}
+!4 = !{!"flat_scratch_hi"}
+!5 = !{!"exec_lo"}
+!6 = !{!"exec_hi"}
OpenPOWER on IntegriCloud