Please ignore this patch, there is still something not correct. Thanks.
-Original Message-
From: Guo, Yejun
Sent: Wednesday, April 26, 2017 4:43 PM
To: beignet@lists.freedesktop.org
Cc: Guo, Yejun
Subject: [PATCH] defer dead insn removal since lowerIndirectRead still needs
them
---
backend/src/ir/lowering.cpp | 54 ++---
1 file changed, 26 insertions(+), 28 deletions(-)
diff --git a/backend/src/ir/lowering.cpp b/backend/src/ir/lowering.cpp
index 93bd96a..53aafa4 100644
--- a/backend/src/ir/lowering.cpp
+++ b/backend/src/ir/lowering.cpp
@@ -117,7 +117,7 @@ namespace ir {
/*! Lower the given function argument accesses */
ArgUse lower(uint32_t argID);
/*! Build the constant push for the function */
-void buildConstantPush(void);
+void buildConstantPush(set& dead);
/* Lower indirect Read to indirct Mov */
void lowerIndirectRead(uint32_t argID);
/* Convert indirectLoad to indirect Mov */
@@ -192,6 +192,25 @@ namespace ir {
GBE_SAFE_DELETE(liveness);
}
+// Remove all the given instructions from the stream (if dead)
+#define REMOVE_INSN(WHICH) \
+ for (const auto &loadAddImm : seq) { \
+Instruction *WHICH = loadAddImm.WHICH; \
+if (WHICH == NULL) continue; \
+const UseSet &useSet = dag->getUse(WHICH, 0); \
+bool isDead = true; \
+for (auto use : useSet) { \
+ if (dead.contains(use->getInstruction()) == false) { \
+isDead = false; \
+break; \
+ } \
+} \
+if (isDead && !dead.contains(WHICH)) { \
+ dead.insert(WHICH); \
+ WHICH->remove(); \
+} \
+ }
+
void FunctionArgumentLowerer::lower(const std::string &functionName) {
if ((this->fn = unit.getFunction(functionName)) == NULL)
return;
@@ -213,40 +232,22 @@ namespace ir {
// Build the constant push description and remove the instruction that
// therefore become useless
-this->buildConstantPush();
+set dead;
+this->buildConstantPush(dead);
for (uint32_t i = 0; i < indirctReadArgs.size(); ++i){
lowerIndirectRead(indirctReadArgs[i]);
}
-ReplaceIndirectLoad();
- }
+REMOVE_INSN(add)
+REMOVE_INSN(loadImm)
-// Remove all the given instructions from the stream (if dead)
-#define REMOVE_INSN(WHICH) \
- for (const auto &loadAddImm : seq) { \
-Instruction *WHICH = loadAddImm.WHICH; \
-if (WHICH == NULL) continue; \
-const UseSet &useSet = dag->getUse(WHICH, 0); \
-bool isDead = true; \
-for (auto use : useSet) { \
- if (dead.contains(use->getInstruction()) == false) { \
-isDead = false; \
-break; \
- } \
-} \
-if (isDead && !dead.contains(WHICH)) { \
- dead.insert(WHICH); \
- WHICH->remove(); \
-} \
+ReplaceIndirectLoad();
}
- void FunctionArgumentLowerer::buildConstantPush(void)
+ void FunctionArgumentLowerer::buildConstantPush(set&
dead)
{
if (seq.size() == 0)
return;
-// Track instructions we remove to recursively kill them properly
-set dead;
-
// The argument location we already pushed (since the same argument
location
// can be used several times)
set inserted;
@@ -291,9 +292,6 @@ namespace ir {
load->remove();
}
}
-
-REMOVE_INSN(add)
-REMOVE_INSN(loadImm)
}
#undef REMOVE_INSN
--
2.7.4
___
Beignet mailing list
Beignet@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/beignet