<div dir="ltr"><div><br></div><div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, May 1, 2017 at 3:48 AM, Chandler Carruth via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Today, the IR requires that if you have multiple edges from A to B (typically with a switch) any phi nodes in B must have an equal number of entries for A, but that all of them must have the same value.</div></blockquote><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><br></div><div>This seems rather annoying....</div><div>1) It creates multiple uses of values in A for no apparently good reason</div><div>2) It makes updating PHI nodes using sets of predecessors incredibly hard</div><div>3) There is no correspondence between the edges and the PHI node entries other than number, making most of the code that does handle this very ad-hoc "count off N repetitions of the same thing" style code, which is brittle and hard to test effectively.</div></div></blockquote><div><br></div><div>Having written this code a few times, i'd agree.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>4) I suspect bugs are quite common given that PHINode::removeIncomingValue accepts a basic block but only removes the first incoming value, leaving the others in place.</div></div></blockquote><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><br></div><div>I can't see any serious use case for this symmetry either. These aren't uses (and can't be), and there doesn't seem to be any lost functionality if we only have a single entry.<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a></div><div><br></div><div>It also seems likely to open up more efficient in-memory representations if it is possible at some point to build maps of these things.</div><div><br></div><div>Thoughts?</div></div></blockquote><div><br></div><br class="gmail-Apple-interchange-newline">So would this lead to a case where PHI->getNumOperands() != std::distance(pred_begin(phiblock), pred_end(phiblock))<div><br></div><div>If so, that would seem problematic to handle as well.</div><div>:(</div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div> It appears entirely possible to change the verifier to check that we don't have duplicates, and to read bitcode with duplicates and merge them so that there is no backwards compatibility issue.</div><span class="gmail-HOEnZb"><font color="#888888"><div><br></div><div>-Chandler</div></font></span></div>
<br>______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div></div></div>