diff options
author | Stephen Hines <srhines@google.com> | 2014-05-29 02:49:00 -0700 |
---|---|---|
committer | Stephen Hines <srhines@google.com> | 2014-05-29 02:49:00 -0700 |
commit | dce4a407a24b04eebc6a376f8e62b41aaa7b071f (patch) | |
tree | dcebc53f2b182f145a2e659393bf9a0472cedf23 /test/CodeGen/NVPTX | |
parent | 220b921aed042f9e520c26cffd8282a94c66c3d5 (diff) | |
download | external_llvm-dce4a407a24b04eebc6a376f8e62b41aaa7b071f.zip external_llvm-dce4a407a24b04eebc6a376f8e62b41aaa7b071f.tar.gz external_llvm-dce4a407a24b04eebc6a376f8e62b41aaa7b071f.tar.bz2 |
Update LLVM for 3.5 rebase (r209712).
Change-Id: I149556c940fb7dc92d075273c87ff584f400941f
Diffstat (limited to 'test/CodeGen/NVPTX')
-rw-r--r-- | test/CodeGen/NVPTX/access-non-generic.ll | 91 | ||||
-rw-r--r-- | test/CodeGen/NVPTX/addrspacecast-gvar.ll | 9 | ||||
-rw-r--r-- | test/CodeGen/NVPTX/addrspacecast.ll | 4 | ||||
-rw-r--r-- | test/CodeGen/NVPTX/local-stack-frame.ll | 18 | ||||
-rw-r--r-- | test/CodeGen/NVPTX/surf-read.ll | 20 | ||||
-rw-r--r-- | test/CodeGen/NVPTX/surf-write.ll | 16 | ||||
-rw-r--r-- | test/CodeGen/NVPTX/tex-read.ll | 20 |
7 files changed, 167 insertions, 11 deletions
diff --git a/test/CodeGen/NVPTX/access-non-generic.ll b/test/CodeGen/NVPTX/access-non-generic.ll new file mode 100644 index 0000000..0622aa3 --- /dev/null +++ b/test/CodeGen/NVPTX/access-non-generic.ll @@ -0,0 +1,91 @@ +; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s --check-prefix PTX +; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s --check-prefix PTX +; RUN: opt < %s -S -nvptx-favor-non-generic -dce | FileCheck %s --check-prefix IR + +@array = internal addrspace(3) global [10 x float] zeroinitializer, align 4 +@scalar = internal addrspace(3) global float 0.000000e+00, align 4 + +; Verifies nvptx-favor-non-generic correctly optimizes generic address space +; usage to non-generic address space usage for the patterns we claim to handle: +; 1. load cast +; 2. store cast +; 3. load gep cast +; 4. store gep cast +; gep and cast can be an instruction or a constant expression. This function +; tries all possible combinations. +define float @ld_st_shared_f32(i32 %i, float %v) { +; IR-LABEL: @ld_st_shared_f32 +; IR-NOT: addrspacecast +; PTX-LABEL: ld_st_shared_f32( + ; load cast + %1 = load float* addrspacecast (float addrspace(3)* @scalar to float*), align 4 +; PTX: ld.shared.f32 %f{{[0-9]+}}, [scalar]; + ; store cast + store float %v, float* addrspacecast (float addrspace(3)* @scalar to float*), align 4 +; PTX: st.shared.f32 [scalar], %f{{[0-9]+}}; + ; use syncthreads to disable optimizations across components + call void @llvm.cuda.syncthreads() +; PTX: bar.sync 0; + + ; cast; load + %2 = addrspacecast float addrspace(3)* @scalar to float* + %3 = load float* %2, align 4 +; PTX: ld.shared.f32 %f{{[0-9]+}}, [scalar]; + ; cast; store + store float %v, float* %2, align 4 +; PTX: st.shared.f32 [scalar], %f{{[0-9]+}}; + call void @llvm.cuda.syncthreads() +; PTX: bar.sync 0; + + ; load gep cast + %4 = load float* getelementptr inbounds ([10 x float]* addrspacecast ([10 x float] addrspace(3)* @array to [10 x float]*), i32 0, i32 5), align 4 +; PTX: ld.shared.f32 %f{{[0-9]+}}, [array+20]; + ; store gep cast + store float %v, float* getelementptr inbounds ([10 x float]* addrspacecast ([10 x float] addrspace(3)* @array to [10 x float]*), i32 0, i32 5), align 4 +; PTX: st.shared.f32 [array+20], %f{{[0-9]+}}; + call void @llvm.cuda.syncthreads() +; PTX: bar.sync 0; + + ; gep cast; load + %5 = getelementptr inbounds [10 x float]* addrspacecast ([10 x float] addrspace(3)* @array to [10 x float]*), i32 0, i32 5 + %6 = load float* %5, align 4 +; PTX: ld.shared.f32 %f{{[0-9]+}}, [array+20]; + ; gep cast; store + store float %v, float* %5, align 4 +; PTX: st.shared.f32 [array+20], %f{{[0-9]+}}; + call void @llvm.cuda.syncthreads() +; PTX: bar.sync 0; + + ; cast; gep; load + %7 = addrspacecast [10 x float] addrspace(3)* @array to [10 x float]* + %8 = getelementptr inbounds [10 x float]* %7, i32 0, i32 %i + %9 = load float* %8, align 4 +; PTX: ld.shared.f32 %f{{[0-9]+}}, [%{{(r|rl|rd)[0-9]+}}]; + ; cast; gep; store + store float %v, float* %8, align 4 +; PTX: st.shared.f32 [%{{(r|rl|rd)[0-9]+}}], %f{{[0-9]+}}; + call void @llvm.cuda.syncthreads() +; PTX: bar.sync 0; + + %sum2 = fadd float %1, %3 + %sum3 = fadd float %sum2, %4 + %sum4 = fadd float %sum3, %6 + %sum5 = fadd float %sum4, %9 + ret float %sum5 +} + +; Verifies nvptx-favor-non-generic keeps addrspacecasts between pointers of +; different element types. +define i32 @ld_int_from_float() { +; IR-LABEL: @ld_int_from_float +; IR: addrspacecast +; PTX-LABEL: ld_int_from_float( +; PTX: cvta.shared.u{{(32|64)}} + %1 = load i32* addrspacecast(float addrspace(3)* @scalar to i32*), align 4 + ret i32 %1 +} + +declare void @llvm.cuda.syncthreads() #3 + +attributes #3 = { noduplicate nounwind } + diff --git a/test/CodeGen/NVPTX/addrspacecast-gvar.ll b/test/CodeGen/NVPTX/addrspacecast-gvar.ll new file mode 100644 index 0000000..6afbdb8 --- /dev/null +++ b/test/CodeGen/NVPTX/addrspacecast-gvar.ll @@ -0,0 +1,9 @@ +; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s + +; CHECK: .visible .global .align 4 .u32 g = 42; +; CHECK: .visible .global .align 4 .u32 g2 = generic(g); +; CHECK: .visible .global .align 4 .u32 g3 = g; + +@g = addrspace(1) global i32 42 +@g2 = addrspace(1) global i32* addrspacecast (i32 addrspace(1)* @g to i32*) +@g3 = addrspace(1) global i32 addrspace(1)* @g diff --git a/test/CodeGen/NVPTX/addrspacecast.ll b/test/CodeGen/NVPTX/addrspacecast.ll index 98ea655..03b9a98 100644 --- a/test/CodeGen/NVPTX/addrspacecast.ll +++ b/test/CodeGen/NVPTX/addrspacecast.ll @@ -1,5 +1,5 @@ -; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s -check-prefix=PTX32 -; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s -check-prefix=PTX64 +; RUN: llc < %s -march=nvptx -mcpu=sm_20 -disable-nvptx-favor-non-generic | FileCheck %s -check-prefix=PTX32 +; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 -disable-nvptx-favor-non-generic | FileCheck %s -check-prefix=PTX64 define i32 @conv1(i32 addrspace(1)* %ptr) { diff --git a/test/CodeGen/NVPTX/local-stack-frame.ll b/test/CodeGen/NVPTX/local-stack-frame.ll index 178dff1..c0d7d1c 100644 --- a/test/CodeGen/NVPTX/local-stack-frame.ll +++ b/test/CodeGen/NVPTX/local-stack-frame.ll @@ -3,16 +3,16 @@ ; Ensure we access the local stack properly -; PTX32: mov.u32 %r{{[0-9]+}}, __local_depot{{[0-9]+}}; -; PTX32: cvta.local.u32 %SP, %r{{[0-9]+}}; -; PTX32: ld.param.u32 %r{{[0-9]+}}, [foo_param_0]; -; PTX32: st.u32 [%SP+0], %r{{[0-9]+}}; -; PTX64: mov.u64 %rl{{[0-9]+}}, __local_depot{{[0-9]+}}; -; PTX64: cvta.local.u64 %SP, %rl{{[0-9]+}}; -; PTX64: ld.param.u32 %r{{[0-9]+}}, [foo_param_0]; -; PTX64: st.u32 [%SP+0], %r{{[0-9]+}}; +; PTX32: mov.u32 %r{{[0-9]+}}, __local_depot{{[0-9]+}}; +; PTX32: cvta.local.u32 %SP, %r{{[0-9]+}}; +; PTX32: ld.param.u32 %r{{[0-9]+}}, [foo_param_0]; +; PTX32: st.volatile.u32 [%SP+0], %r{{[0-9]+}}; +; PTX64: mov.u64 %rl{{[0-9]+}}, __local_depot{{[0-9]+}}; +; PTX64: cvta.local.u64 %SP, %rl{{[0-9]+}}; +; PTX64: ld.param.u32 %r{{[0-9]+}}, [foo_param_0]; +; PTX64: st.volatile.u32 [%SP+0], %r{{[0-9]+}}; define void @foo(i32 %a) { %local = alloca i32, align 4 - store i32 %a, i32* %local + store volatile i32 %a, i32* %local ret void } diff --git a/test/CodeGen/NVPTX/surf-read.ll b/test/CodeGen/NVPTX/surf-read.ll new file mode 100644 index 0000000..a69d03e --- /dev/null +++ b/test/CodeGen/NVPTX/surf-read.ll @@ -0,0 +1,20 @@ +; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s + +target triple = "nvptx-unknown-nvcl" + +declare i32 @llvm.nvvm.suld.1d.i32.trap(i64, i32) + +; CHECK: .entry foo +define void @foo(i64 %img, float* %red, i32 %idx) { +; CHECK: suld.b.1d.b32.trap {%r[[RED:[0-9]+]]}, [foo_param_0, {%r{{[0-9]+}}}] + %val = tail call i32 @llvm.nvvm.suld.1d.i32.trap(i64 %img, i32 %idx) +; CHECK: cvt.rn.f32.s32 %f[[REDF:[0-9]+]], %r[[RED]] + %ret = sitofp i32 %val to float +; CHECK: st.f32 [%r{{[0-9]+}}], %f[[REDF]] + store float %ret, float* %red + ret void +} + +!nvvm.annotations = !{!1, !2} +!1 = metadata !{void (i64, float*, i32)* @foo, metadata !"kernel", i32 1} +!2 = metadata !{void (i64, float*, i32)* @foo, metadata !"rdwrimage", i32 0} diff --git a/test/CodeGen/NVPTX/surf-write.ll b/test/CodeGen/NVPTX/surf-write.ll new file mode 100644 index 0000000..880231f --- /dev/null +++ b/test/CodeGen/NVPTX/surf-write.ll @@ -0,0 +1,16 @@ +; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s + +target triple = "nvptx-unknown-nvcl" + +declare void @llvm.nvvm.sust.b.1d.i32.trap(i64, i32, i32) + +; CHECK: .entry foo +define void @foo(i64 %img, i32 %val, i32 %idx) { +; CHECK: sust.b.1d.b32.trap [foo_param_0, {%r{{[0-9]+}}}], {%r{{[0-9]+}}} + tail call void @llvm.nvvm.sust.b.1d.i32.trap(i64 %img, i32 %idx, i32 %val) + ret void +} + +!nvvm.annotations = !{!1, !2} +!1 = metadata !{void (i64, i32, i32)* @foo, metadata !"kernel", i32 1} +!2 = metadata !{void (i64, i32, i32)* @foo, metadata !"wroimage", i32 0} diff --git a/test/CodeGen/NVPTX/tex-read.ll b/test/CodeGen/NVPTX/tex-read.ll new file mode 100644 index 0000000..291060b --- /dev/null +++ b/test/CodeGen/NVPTX/tex-read.ll @@ -0,0 +1,20 @@ +; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s + +target triple = "nvptx-unknown-nvcl" + +declare { float, float, float, float } @llvm.nvvm.tex.1d.v4f32.i32(i64, i64, i32) + +; CHECK: .entry foo +define void @foo(i64 %img, i64 %sampler, float* %red, i32 %idx) { +; CHECK: tex.1d.v4.f32.s32 {%f[[RED:[0-9]+]], %f[[GREEN:[0-9]+]], %f[[BLUE:[0-9]+]], %f[[ALPHA:[0-9]+]]}, [foo_param_0, foo_param_1, {%r{{[0-9]+}}}] + %val = tail call { float, float, float, float } @llvm.nvvm.tex.1d.v4f32.i32(i64 %img, i64 %sampler, i32 %idx) + %ret = extractvalue { float, float, float, float } %val, 0 +; CHECK: st.f32 [%r{{[0-9]+}}], %f[[RED]] + store float %ret, float* %red + ret void +} + +!nvvm.annotations = !{!1, !2, !3} +!1 = metadata !{void (i64, i64, float*, i32)* @foo, metadata !"kernel", i32 1} +!2 = metadata !{void (i64, i64, float*, i32)* @foo, metadata !"rdoimage", i32 0} +!3 = metadata !{void (i64, i64, float*, i32)* @foo, metadata !"sampler", i32 1} |