summaryrefslogtreecommitdiff
path: root/test/CodeGen/NVPTX
diff options
context:
space:
mode:
authorJustin Lebar <jlebar@google.com>2016-03-01 19:24:03 +0000
committerJustin Lebar <jlebar@google.com>2016-03-01 19:24:03 +0000
commite2c35f6c8bc3a9347ba2e355fb8a00723ccc564a (patch)
tree5492423cc53c746d49bf0784287992306fbded71 /test/CodeGen/NVPTX
parenteb3a3d7544a781e46f657f54f19509b0a929c795 (diff)
[NVPTX] Use different, convergent MIs for convergent calls.
Summary: Calls sometimes need to be convergent. This is already handled at the LLVM IR level, but it also needs to be handled at the MI level. Ideally we'd propagate convergence from instructions, down through the selection DAG, and into MIs. But this is Hard, and would affect optimizations in the SDNs -- right now only SDNs with two operands have any flags at all. Instead, here's a much simpler hack: Add new opcodes for NVPTX for convergent calls, and generate these when lowering convergent LLVM calls. Reviewers: jholewinski Subscribers: jholewinski, chandlerc, joker.eph, jhen, tra, llvm-commits Differential Revision: http://reviews.llvm.org/D17423 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@262373 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/NVPTX')
-rw-r--r--test/CodeGen/NVPTX/convergent-mir-call.ll27
1 files changed, 27 insertions, 0 deletions
diff --git a/test/CodeGen/NVPTX/convergent-mir-call.ll b/test/CodeGen/NVPTX/convergent-mir-call.ll
new file mode 100644
index 00000000000..18142450490
--- /dev/null
+++ b/test/CodeGen/NVPTX/convergent-mir-call.ll
@@ -0,0 +1,27 @@
+; RUN: llc -mtriple nvptx64-nvidia-cuda -stop-after machine-cp -o - < %s 2>&1 | FileCheck %s
+
+; Check that convergent calls are emitted using convergent MIR instructions,
+; while non-convergent calls are not.
+
+target triple = "nvptx64-nvidia-cuda"
+
+declare void @conv() convergent
+declare void @not_conv()
+
+define void @test(void ()* %f) {
+ ; CHECK: ConvergentCallUniPrintCall
+ ; CHECK-NEXT: @conv
+ call void @conv()
+
+ ; CHECK: CallUniPrintCall
+ ; CHECK-NEXT: @not_conv
+ call void @not_conv()
+
+ ; CHECK: ConvergentCallPrintCall
+ call void %f() convergent
+
+ ; CHECK: CallPrintCall
+ call void %f()
+
+ ret void
+}