summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunyan He <junyan.he@linux.intel.com>2015-01-30 18:31:29 +0800
committerZhigang Gong <zhigang.gong@intel.com>2015-02-06 15:06:00 +0800
commite1c86fc8c6b06310f04b01519834a71b3e6a2db5 (patch)
tree070cee193322bc9c1df4a2d7bc952acb83d76a9c
parent56c97df60bc6d6aabf7c799091e1b4273a500cd4 (diff)
Backend: Fix one bug of printf because of ir reorder.
The llvm will generate ir which has if.else block before if.then block. We parse the printf statement before llvm_to_gen. The later if-else analysis will reorder the if-else blocks. This cause when we print out the result, we get the wrong message from another printf statement. Add printf index to the index buffer to record which one the result belongs to, and so this bug is fixed. Signed-off-by: Junyan He <junyan.he@linux.intel.com> Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com>
-rw-r--r--backend/src/ir/printf.cpp25
-rw-r--r--backend/src/ir/printf.hpp2
-rw-r--r--backend/src/llvm/llvm_printf_parser.cpp19
-rw-r--r--src/cl_command_queue_gen7.c2
4 files changed, 34 insertions, 14 deletions
diff --git a/backend/src/ir/printf.cpp b/backend/src/ir/printf.cpp
index fa108dc1..3d9b2fd6 100644
--- a/backend/src/ir/printf.cpp
+++ b/backend/src/ir/printf.cpp
@@ -34,8 +34,9 @@ namespace gbe
uint32_t PrintfSet::append(PrintfFmt* fmt, Unit& unit)
{
fmts.push_back(*fmt);
+ vector<PrintfSlot>& vp = fmts.back().first;
- for (PrintfFmt::iterator f = fmts.back().begin(); f != fmts.back().end(); ++f) {
+ for (vector<PrintfSlot>::iterator f = vp.begin(); f != vp.end(); ++f) {
if (f->type == PRINTF_SLOT_TYPE_STRING)
continue;
@@ -126,14 +127,27 @@ namespace gbe
int stmt = 0;
for (size_t count = 0; count < fmts.size(); ++count) {
- PrintfFmt& pf = fmts[count];
for (i = 0; i < global_wk_sz0; i++) {
for (j = 0; j < global_wk_sz1; j++) {
for (k = 0; k < global_wk_sz2; k++) {
- int loop_num = ((int *)index_addr)[stmt*global_wk_sz0*global_wk_sz1*global_wk_sz2
- + k*global_wk_sz0*global_wk_sz1 + j*global_wk_sz0 + i];
+ int loop_num = ((int *)index_addr)[(stmt*global_wk_sz0*global_wk_sz1*global_wk_sz2
+ + k*global_wk_sz0*global_wk_sz1 + j*global_wk_sz0 + i)*2];
+ int printf_num = ((int *)index_addr)[(stmt*global_wk_sz0*global_wk_sz1*global_wk_sz2
+ + k*global_wk_sz0*global_wk_sz1 + j*global_wk_sz0 + i)*2 + 1];
+ if (!loop_num) continue;
+
+ PrintfFmt* ppf = NULL;
+ for (auto& f : fmts) {
+ if (f.second == printf_num) {
+ ppf = &f;
+ break;
+ }
+ }
+
+ PrintfFmt& pf = *ppf;
+
for (int n = 0; n < loop_num; n++) {
- for (PrintfFmt::iterator pfit = pf.begin(); pfit != pf.end(); ++pfit) {
+ for (vector<PrintfSlot>::iterator pfit = pf.first.begin(); pfit != pf.first.end(); ++pfit) {
PrintfSlot& slot = *pfit;
pf_str = "";
int vec_num;
@@ -146,6 +160,7 @@ namespace gbe
generatePrintfFmtString(*slot.state, pf_str);
+
vec_num = slot.state->vector_n > 0 ? slot.state->vector_n : 1;
for (int vec_i = 0; vec_i < vec_num; vec_i++) {
diff --git a/backend/src/ir/printf.hpp b/backend/src/ir/printf.hpp
index f6c6bcfa..cbab7597 100644
--- a/backend/src/ir/printf.hpp
+++ b/backend/src/ir/printf.hpp
@@ -198,7 +198,7 @@ namespace gbe
}
};
- typedef vector<PrintfSlot> PrintfFmt;
+ typedef std::pair<vector<PrintfSlot>, int> PrintfFmt;
uint32_t append(PrintfFmt* fmt, Unit &unit);
uint32_t getPrintfNum(void) const {
diff --git a/backend/src/llvm/llvm_printf_parser.cpp b/backend/src/llvm/llvm_printf_parser.cpp
index 8fec683d..52da2e50 100644
--- a/backend/src/llvm/llvm_printf_parser.cpp
+++ b/backend/src/llvm/llvm_printf_parser.cpp
@@ -268,7 +268,7 @@ again:
if (p != begin) {
std::string s = std::string(begin, size_t(p - begin));
- printf_fmt->push_back(PrintfSlot(s.c_str()));
+ printf_fmt->first.push_back(PrintfSlot(s.c_str()));
}
if (p == end) // finish
@@ -279,7 +279,7 @@ again:
if (ret_char < 0)
goto error;
- printf_fmt->push_back(&state);
+ printf_fmt->first.push_back(&state);
num++;
if (rend == end)
@@ -385,14 +385,14 @@ error:
/////////////////////////////////////////////////////
/* calculate index address.
- index_addr = (index_offset + wg_offset )* sizeof(int) + index_buf_ptr
+ index_addr = (index_offset + wg_offset )* sizeof(int) * 2 + index_buf_ptr
index_offset = global_size2 * global_size1 * global_size0 * printf_num */
Value* index_offset = builder->CreateMul(g1Xg2Xg3, ConstantInt::get(intTy, printf_num));
// index_offset + offset
op0 = builder->CreateAdd(index_offset, wg_offset);
- // (index_offset + offset)* sizeof(int)
- op0 = builder->CreateMul(op0, ConstantInt::get(intTy, sizeof(int)));
+ // (index_offset + offset)* sizeof(int) * 2
+ op0 = builder->CreateMul(op0, ConstantInt::get(intTy, sizeof(int)*2));
// Final index address = index_buf_ptr + (index_offset + offset)* sizeof(int)
op0 = builder->CreateAdd(index_buf_ptr, op0);
Value* index_addr = builder->CreateIntToPtr(op0, Type::getInt32PtrTy(module->getContext(), 1));
@@ -401,9 +401,13 @@ error:
val = builder->CreateAdd(loop_num, ConstantInt::get(intTy, 1));
builder->CreateStore(val, index_addr);// The loop number.
+ op0 = builder->CreateAdd(op0, ConstantInt::get(intTy, sizeof(int)));
+ index_addr = builder->CreateIntToPtr(op0, Type::getInt32PtrTy(module->getContext(), 1));
+ builder->CreateStore(ConstantInt::get(intTy, printf_num), index_addr);// The printf number.
+
int i = 1;
Value* data_addr = NULL;
- for (auto &s : *pInfo.printf_fmt) {
+ for (auto &s : (*pInfo.printf_fmt).first) {
if (s.type == PRINTF_SLOT_TYPE_STRING)
continue;
@@ -458,6 +462,7 @@ error:
NULL)));
assert(printfs[printf_inst] == NULL);
printfs[printf_inst] = pInfo.printf_fmt;
+ printfs[printf_inst]->second = printf_num;
printf_num++;
return true;
}
@@ -499,7 +504,7 @@ error:
sizeof_size = 0;
int i = 1;
- for (auto &s : *printf_fmt) {
+ for (auto &s : (*printf_fmt).first) {
int sz = 0;
if (s.type == PRINTF_SLOT_TYPE_STRING)
continue;
diff --git a/src/cl_command_queue_gen7.c b/src/cl_command_queue_gen7.c
index eec39b43..253c4f2e 100644
--- a/src/cl_command_queue_gen7.c
+++ b/src/cl_command_queue_gen7.c
@@ -268,7 +268,7 @@ cl_bind_printf(cl_gpgpu gpgpu, cl_kernel ker, void* printf_info, int printf_num,
int32_t offset = interp_kernel_get_curbe_offset(ker->opaque, value, 0);
size_t buf_size = global_sz * sizeof(int) * printf_num;
if (offset > 0) {
- if (cl_gpgpu_set_printf_buffer(gpgpu, 0, buf_size, offset, interp_get_printf_indexbuf_bti(printf_info)) != 0)
+ if (cl_gpgpu_set_printf_buffer(gpgpu, 0, buf_size*2, offset, interp_get_printf_indexbuf_bti(printf_info)) != 0)
return -1;
}