BlockGenerator: Directly handle multi-exit PHI nodes
This change adds code to directly code-generate multi-exit PHI nodes, instead of trying to reuse the EscapeMap infrastructure for this. Using escape maps adds a level of indirection that is hard to understand and - more importantly - breaks in certain cases. Specifically, the original code relied on simplifyRegion() to split the original PHI node in two PHI nodes, one merging the values coming from within the scop and a second that merges the first PHI node with the values that come from outside the scop. To generate code the first PHI node is then just handled like any other in-scop value that is used somewhere outside the scop. This fails for the case where all values from inside the scop are identical, as the first PHI node is in such cases automatically simplified and eliminated by LLVM right at construction. As a result, there is no instruction that can be pass to the EscapeMap handling, which means the references in the second PHI node are not updated and may still reference values from within the original scop that do not dominate it. Our new code iterates directly over all modeled ScopArrayInfo objects that represent multi-exit PHI nodes and generates code for them without relying on the EscapeMap infrastructure. Hence, it works also for the case where the first PHI node is eliminated. llvm-svn: 251191
Loading
Please sign in to comment