After move optimize from clang to backend, some pass is removed, and some pass using diff parameters, will trigger the bug in build pushmap, cause compiler_function_argument3 fail.
There maybe one loadImm/add instruction used by different loads, in set seq. So should not add to pushmap if the same argID/offset already added, also can't delete loadImm/add instruction again if have been deleted. Signed-off-by: Yang Rong <[email protected]> --- backend/src/ir/lowering.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/backend/src/ir/lowering.cpp b/backend/src/ir/lowering.cpp index 23dd120..49b6e06 100644 --- a/backend/src/ir/lowering.cpp +++ b/backend/src/ir/lowering.cpp @@ -1,4 +1,4 @@ -/* +/* * Copyright © 2012 Intel Corporation * * This library is free software; you can redistribute it and/or @@ -205,7 +205,7 @@ namespace ir { break; \ } \ } \ - if (isDead) { \ + if (isDead && !dead.contains(WHICH)) { \ dead.insert(WHICH); \ WHICH->remove(); \ } \ @@ -231,16 +231,18 @@ namespace ir { const uint32_t size = getFamilySize(family); const uint32_t offset = loadAddImm.offset + valueID * size; const PushLocation argLocation(*fn, loadAddImm.argID, offset); - if (inserted.contains(argLocation)) - continue; Register pushed; const Register reg = load->getValue(valueID); if (offset != 0) { + if(inserted.contains(argLocation)) { + pushed = argLocation.getRegister(); + } else { pushed = fn->newRegister(family); this->appendPushedConstant(pushed, argLocation); inserted.insert(argLocation); + } } else { - pushed = fn->getArg(loadAddImm.argID).reg; + pushed = fn->getArg(loadAddImm.argID).reg; } // TODO the MOV instruction can be most of the time avoided if the @@ -253,7 +255,6 @@ namespace ir { } } - // Remove all unused adds and load immediates REMOVE_INSN(add) REMOVE_INSN(loadImm) } -- 1.8.1.2 _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
