From 1951311d955aab3ae40e1753c98926911b73f2d4 Mon Sep 17 00:00:00 2001 From: Homer Hsing Date: Tue, 24 Sep 2013 11:11:21 +0800 Subject: [PATCH] fix scalarizing of llvm phi node llvm phi node can have odd number of args. this patch also contains a test case. Signed-off-by: Homer Hsing Reviewed-by: Zhigang Gong --- backend/src/llvm/llvm_scalarize.cpp | 1 - kernels/compiler_vector_inc.cl | 13 +++++++++++ utests/CMakeLists.txt | 1 + utests/compiler_vector_inc.cpp | 46 +++++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 kernels/compiler_vector_inc.cl create mode 100644 utests/compiler_vector_inc.cpp diff --git a/backend/src/llvm/llvm_scalarize.cpp b/backend/src/llvm/llvm_scalarize.cpp index 41674b6..7a40616 100644 --- a/backend/src/llvm/llvm_scalarize.cpp +++ b/backend/src/llvm/llvm_scalarize.cpp @@ -383,7 +383,6 @@ namespace gbe { if (PHINode* phi = dyn_cast(inst)) { PHINode* res = PHINode::Create(GetBasicType(inst), phi->getNumIncomingValues()); - assert(args.size() % 2 == 0 && "Odd number of arguments for a PHI"); // Loop over pairs of operands: [Value*, BasicBlock*] for (unsigned int i = 0; i < args.size(); i++) { diff --git a/kernels/compiler_vector_inc.cl b/kernels/compiler_vector_inc.cl new file mode 100644 index 0000000..548dcb4 --- /dev/null +++ b/kernels/compiler_vector_inc.cl @@ -0,0 +1,13 @@ +kernel void compiler_vector_inc(global char *dst, global char *src) { + size_t i = get_global_id(0); + char2 dst2 = vload2(i, dst); + if (src[i] == 0) + dst2++; + else if(src[i] == 1) + ++dst2; + else if(src[i] == 2) + dst2--; + else + --dst2; + vstore2(dst2, i, dst); +} diff --git a/utests/CMakeLists.txt b/utests/CMakeLists.txt index 3726116..f18bd46 100644 --- a/utests/CMakeLists.txt +++ b/utests/CMakeLists.txt @@ -102,6 +102,7 @@ set (utests_sources compiler_get_image_info.cpp compiler_vect_compare.cpp compiler_vector_load_store.cpp + compiler_vector_inc.cpp compiler_cl_finish.cpp get_cl_info.cpp builtin_atan2.cpp diff --git a/utests/compiler_vector_inc.cpp b/utests/compiler_vector_inc.cpp new file mode 100644 index 0000000..abc5408 --- /dev/null +++ b/utests/compiler_vector_inc.cpp @@ -0,0 +1,46 @@ +#include +#include +#include +#include "utest_helper.hpp" + +void compiler_vector_inc(void) +{ + const int n = 64; + char dst[n]; + char src[n]; + + OCL_CREATE_KERNEL("compiler_vector_inc"); + OCL_CREATE_BUFFER(buf[0], 0, n, NULL); + OCL_CREATE_BUFFER(buf[1], 0, n, NULL); + OCL_SET_ARG(0, sizeof(cl_mem), &buf[0]); + OCL_SET_ARG(1, sizeof(cl_mem), &buf[1]); + globals[0] = n / 2; + locals[0] = 16; + + for (int i = 0; i < n; ++i) { + dst[i] = i; + src[i] = (i / 2) % 4; + } + OCL_MAP_BUFFER(0); + OCL_MAP_BUFFER(1); + memcpy(buf_data[0], dst, n); + memcpy(buf_data[1], src, n); + OCL_UNMAP_BUFFER(0); + OCL_UNMAP_BUFFER(1); + + OCL_NDRANGE(1); + + OCL_MAP_BUFFER(0); + char *dest = ((char *)buf_data[0]); + for (int i=0; i