Add dummy loop in merge-return. (#1896)
The current implementation of merge return can create bad, but correct, code. When it is not in a loop construct, it will insert a lot of extra branch around code. The potentially large number of branches are bad. At the same time, it can separate code store to variables from its uses hiding the fact that the store dominates the load. This hurts the later analysis because the compiler thinks that multiple values can reach a load, when there is really only 1. This poorer analysis leads to missed optimizations. The solution is to create a dummy loop around the entire body of the function, then we can break from that loop with a single branch. Also only new merge nodes would be those at the end of loops meaning that most analysies will not be hurt. Remove dead code for cases that are no longer possible. It seems like some drivers expect there the be an OpSelectionMerge before conditional branches, even if they are not strictly needed. So we add them.
Loading
Please register or sign in to comment