[Beignet] [PATCH] GBE: handle dead loop BBs in liveness analysis.
yan.wang at linux.intel.com
yan.wang at linux.intel.com
Thu Oct 23 22:35:32 PDT 2014
I tried your patch and the bug is fixed.
Thanks.
Yan Wang
> LGTM, thanks.
>
>> -----Original Message-----
>> From: Gong, Zhigang
>> Sent: Friday, October 24, 2014 11:41
>> To: beignet at lists.freedesktop.org
>> Cc: yan.wang at linux.intel.com; Yang, Rong R; Gong, Zhigang
>> Subject: [PATCH] GBE: handle dead loop BBs in liveness analysis.
>>
>> Considering the following CFG, our previous liveness analysis will only
>> back
>> traverse from the exit point BB, thus the BB 6 and 7 will not be
>> handled.
>>
>> 4---
>> | |
>> | |
>> 5 --|---> 10 ---> ret
>> | |
>> | |
>> 6<--
>> |
>> |<--
>> 7 |
>> | |
>> ---
>>
>> Although the CFG looks not a normal application as once it goes to block
>> 6, it
>> will enter a dead loop and will never return, we still need to compile
>> it
>> successfully.
>>
>> This patch is to fix the bug at:
>> https://bugs.freedesktop.org/show_bug.cgi?id=85362
>>
>> Signed-off-by: Zhigang Gong <zhigang.gong at intel.com>
>> ---
>> backend/src/ir/liveness.cpp | 11 ++++++++++-
>> backend/src/ir/liveness.hpp
>> | 1 +
>> 2 files changed, 11 insertions(+), 1 deletion(-)
>>
>> diff --git a/backend/src/ir/liveness.cpp b/backend/src/ir/liveness.cpp
>> index
>> eaf6728..35b935f 100644
>> --- a/backend/src/ir/liveness.cpp
>> +++ b/backend/src/ir/liveness.cpp
>> @@ -41,7 +41,11 @@ namespace ir {
>> }
>> });
>> // Now with iterative analysis, we compute liveout and livein sets
>> - this->computeLiveInOut();
>> + while (unvisitBlocks.size()) {
>> + if (workSet.size() == 0)
>> + workSet.insert(--unvisitBlocks.end(), unvisitBlocks.end());
>> + this->computeLiveInOut();
>> + }
>> // extend register (def in loop, use out-of-loop) liveness to the
>> whole loop
>> set<Register> extentRegs;
>> this->computeExtraLiveInOut(extentRegs);
>> @@ -98,6 +102,7 @@ namespace ir {
>> this->initInstruction(*info, insn);
>> });
>> liveness[&bb] = info;
>> + unvisitBlocks.insert(info);
>> if(!bb.liveout.empty())
>> info->liveOut.insert(bb.liveout.begin(), bb.liveout.end());
>> }
>> @@ -124,12 +129,16 @@ namespace ir {
>> while(!workSet.empty()) {
>> auto currInfo = *workSet.begin();
>> workSet.erase(currInfo);
>> + if (unvisitBlocks.find(currInfo) != unvisitBlocks.end())
>> + unvisitBlocks.erase(currInfo);
>> for (auto currOutVar : currInfo->liveOut)
>> if (!currInfo->varKill.contains(currOutVar))
>> currInfo->upwardUsed.insert(currOutVar);
>> bool isChanged = false;
>> for (auto prev : currInfo->bb.getPredecessorSet()) {
>> BlockInfo *prevInfo = liveness[prev];
>> + if (unvisitBlocks.find(currInfo) != unvisitBlocks.end())
>> + unvisitBlocks.erase(currInfo);
>> for (auto currInVar : currInfo->upwardUsed) {
>> if (!prevInfo->bb.undefPhiRegs.contains(currInVar)) {
>> auto changed = prevInfo->liveOut.insert(currInVar);
>> diff --git a/backend/src/ir/liveness.hpp b/backend/src/ir/liveness.hpp
>> index
>> d55e00d..d1e1a53 100644
>> --- a/backend/src/ir/liveness.hpp
>> +++ b/backend/src/ir/liveness.hpp
>> @@ -132,6 +132,7 @@ namespace ir {
>> /*! Set of work list block which has exit(return) instruction */
>> typedef set <struct BlockInfo*> WorkSet;
>> WorkSet workSet;
>> + WorkSet unvisitBlocks;
>>
>> /*! Use custom allocators */
>> GBE_CLASS(Liveness);
>> --
>> 1.8.3.2
>
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet
>
More information about the Beignet
mailing list