[PATCH] D136892: [AMDGPU] Unify uniform return and divergent unreachable blocks

Ruiling, Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 6 23:50:25 PST 2022

ruiling accepted this revision.
ruiling added a comment.


Comment at: llvm/lib/Target/AMDGPU/AMDGPUUnifyDivergentExitNodes.cpp:224
+      HasDivergentUnreachableBlocks |= !isUniformlyReached(DA, *BB);
     } else if (BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator())) {
ruiling wrote:
> I think the key point is we need to make sure to unify the function exits if there is any divergent branch to make sure the structurizer is not skipped when needed. The change does not work if there are both divergent reached return block and uniformly reached return block (no unreachable block). In this case, we still need to unify both the uniform/divergent return blocks. So, I would suggest you change to something like below:
> ```
> scanning the terminators of all the blocks in the function,
> if there is any divergent branch, set HasDivergentBranch to true.
> then:
>       if (!HasDivergentBranch && isUniformlyReached(DA, *BB))
>         ReturningBlocks.push_back(BB);
> It is also preferred to process unreachable blocks in the same way:
>      if (!HasDivergentBranch && isUniformlyReached(DA, *BB))
>         UnreachableBlocks.push_back(BB);
> ```
I think the code suggestion I have given is wrong, really sorry for that. It should be: `if (HasDivergentBranch)` instead of `if (...&&...)`, anyway this new version works for me.



More information about the llvm-commits mailing list