diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2014-01-22 19:24:14 +0000 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2014-01-22 19:24:14 +0000 |
commit | 7dd37ae57a00f1c664b9ae0e9451c1717cf5348d (patch) | |
tree | 5d8dbdcdb3fd9d7086591a870d716f12ed8941ca /test | |
parent | 79e3fb53d618d12e239275ef055200bbd6f8253e (diff) | |
download | llvm-7dd37ae57a00f1c664b9ae0e9451c1717cf5348d.tar.gz llvm-7dd37ae57a00f1c664b9ae0e9451c1717cf5348d.tar.bz2 llvm-7dd37ae57a00f1c664b9ae0e9451c1717cf5348d.tar.xz |
R600/SI: Add support for i8 and i16 private loads/stores
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199823 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/CodeGen/R600/extload.ll | 14 | ||||
-rw-r--r-- | test/CodeGen/R600/private-memory.ll | 59 |
2 files changed, 59 insertions, 14 deletions
diff --git a/test/CodeGen/R600/extload.ll b/test/CodeGen/R600/extload.ll index aa660b3883..f78cdc4fb0 100644 --- a/test/CodeGen/R600/extload.ll +++ b/test/CodeGen/R600/extload.ll @@ -2,7 +2,7 @@ ; EG-LABEL: @anyext_load_i8: ; EG: AND_INT -; EG-NEXT: 255 +; EG: 255 define void @anyext_load_i8(i8 addrspace(1)* nocapture noalias %out, i8 addrspace(1)* nocapture noalias %src) nounwind { %cast = bitcast i8 addrspace(1)* %src to i32 addrspace(1)* %load = load i32 addrspace(1)* %cast, align 1 @@ -14,8 +14,9 @@ define void @anyext_load_i8(i8 addrspace(1)* nocapture noalias %out, i8 addrspac ; EG-LABEL: @anyext_load_i16: ; EG: AND_INT -; EG: LSHL -; EG: 65535 +; EG: AND_INT +; EG-DAG: 65535 +; EG-DAG: -65536 define void @anyext_load_i16(i16 addrspace(1)* nocapture noalias %out, i16 addrspace(1)* nocapture noalias %src) nounwind { %cast = bitcast i16 addrspace(1)* %src to i32 addrspace(1)* %load = load i32 addrspace(1)* %cast, align 1 @@ -27,7 +28,7 @@ define void @anyext_load_i16(i16 addrspace(1)* nocapture noalias %out, i16 addrs ; EG-LABEL: @anyext_load_lds_i8: ; EG: AND_INT -; EG-NEXT: 255 +; EG: 255 define void @anyext_load_lds_i8(i8 addrspace(3)* nocapture noalias %out, i8 addrspace(3)* nocapture noalias %src) nounwind { %cast = bitcast i8 addrspace(3)* %src to i32 addrspace(3)* %load = load i32 addrspace(3)* %cast, align 1 @@ -39,8 +40,9 @@ define void @anyext_load_lds_i8(i8 addrspace(3)* nocapture noalias %out, i8 addr ; EG-LABEL: @anyext_load_lds_i16: ; EG: AND_INT -; EG: LSHL -; EG: 65535 +; EG: AND_INT +; EG-DAG: 65535 +; EG-DAG: -65536 define void @anyext_load_lds_i16(i16 addrspace(3)* nocapture noalias %out, i16 addrspace(3)* nocapture noalias %src) nounwind { %cast = bitcast i16 addrspace(3)* %src to i32 addrspace(3)* %load = load i32 addrspace(3)* %cast, align 1 diff --git a/test/CodeGen/R600/private-memory.ll b/test/CodeGen/R600/private-memory.ll index 848d164eeb..3fd67d75bb 100644 --- a/test/CodeGen/R600/private-memory.ll +++ b/test/CodeGen/R600/private-memory.ll @@ -1,10 +1,11 @@ -; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s --check-prefix=R600-CHECK -; RUN: llc < %s -march=r600 -mcpu=SI | FileCheck %s --check-prefix=SI-CHECK +; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s --check-prefix=R600-CHECK --check-prefix=FUNC +; RUN: llc < %s -march=r600 -mcpu=SI | FileCheck %s --check-prefix=SI-CHECK --check-prefix=FUNC ; This test checks that uses and defs of the AR register happen in the same ; instruction clause. -; R600-CHECK-LABEL: @mova_same_clause +; FUNC-LABEL: @mova_same_clause + ; R600-CHECK: MOVA_INT ; R600-CHECK-NOT: ALU clause ; R600-CHECK: 0 + AR.x @@ -12,7 +13,6 @@ ; R600-CHECK-NOT: ALU clause ; R600-CHECK: 0 + AR.x -; SI-CHECK-LABEL: @mova_same_clause ; SI-CHECK: V_READFIRSTLANE ; SI-CHECK: V_MOVRELD ; SI-CHECK: S_CBRANCH @@ -46,9 +46,8 @@ entry: ; XXX: This generated code has unnecessary MOVs, we should be able to optimize ; this. -; R600-CHECK-LABEL: @multiple_structs +; FUNC-LABEL: @multiple_structs ; R600-CHECK-NOT: MOVA_INT -; SI-CHECK-LABEL: @multiple_structs ; SI-CHECK-NOT: V_MOVREL %struct.point = type { i32, i32 } @@ -77,9 +76,8 @@ entry: ; loads and stores should be lowered to copies, so there shouldn't be any ; MOVA instructions. -; R600-CHECK-LABEL: @direct_loop +; FUNC-LABEL: @direct_loop ; R600-CHECK-NOT: MOVA_INT -; SI-CHECK-LABEL: @direct_loop ; SI-CHECK-NOT: V_MOVREL define void @direct_loop(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { @@ -113,3 +111,48 @@ for.end: store i32 %value, i32 addrspace(1)* %out ret void } + +; FUNC-LABEL: @short_array + +; R600-CHECK: MOV {{\** *}}T{{[0-9]\.[XYZW]}}, literal +; R600-CHECK: 65536 +; R600-CHECK: MOVA_INT + +; SI-CHECK: V_MOV_B32_e32 v{{[0-9]}}, 65536 +; SI-CHECK: V_MOVRELS_B32_e32 +define void @short_array(i32 addrspace(1)* %out, i32 %index) { +entry: + %0 = alloca [2 x i16] + %1 = getelementptr [2 x i16]* %0, i32 0, i32 0 + %2 = getelementptr [2 x i16]* %0, i32 0, i32 1 + store i16 0, i16* %1 + store i16 1, i16* %2 + %3 = getelementptr [2 x i16]* %0, i32 0, i32 %index + %4 = load i16* %3 + %5 = sext i16 %4 to i32 + store i32 %5, i32 addrspace(1)* %out + ret void +} + +; FUNC-LABEL: @char_array + +; R600-CHECK: OR_INT {{\** *}}T{{[0-9]\.[XYZW]}}, {{[PVT0-9]+\.[XYZW]}}, literal +; R600-CHECK: 256 +; R600-CHECK: MOVA_INT + +; SI-CHECK: V_OR_B32_e32 v{{[0-9]}}, 256 +; SI-CHECK: V_MOVRELS_B32_e32 +define void @char_array(i32 addrspace(1)* %out, i32 %index) { +entry: + %0 = alloca [2 x i8] + %1 = getelementptr [2 x i8]* %0, i32 0, i32 0 + %2 = getelementptr [2 x i8]* %0, i32 0, i32 1 + store i8 0, i8* %1 + store i8 1, i8* %2 + %3 = getelementptr [2 x i8]* %0, i32 0, i32 %index + %4 = load i8* %3 + %5 = sext i8 %4 to i32 + store i32 %5, i32 addrspace(1)* %out + ret void + +} |