<div dir="ltr"><div>I've tried this kind of thing before -- one thing to be aware of is that some code will not converge on a single fixed point under repeated optimizations, and instead will cycle through a couple different versions.  So regardless of the way you have of determining if changes were made, the cycle case might need to be taken into account.  I handled it by saying "stop if the number of IR instructions increases" which ended up being a decent heuristic for my use case (starting from something very unoptimized so there were a lot of optimizations available).  This was probably a bug I was running into and it might have been fixed (I think this was using llvm 3.3), so not sure if this will end up affecting you.</div><div><br></div><div>I also ran into another case where the "changes made" flag was set despite no changes in the IR.  My sense is that this feature is not used very often so these kind of things can sneak in.  Anyway, here's the patch, not sure if it is still relevant.</div><div><a href="https://github.com/dropbox/pyston/blob/master/llvm_patches/0003-Update-TailCallElim-to-avoid-making-redundant-change.patch">https://github.com/dropbox/pyston/blob/master/llvm_patches/0003-Update-TailCallElim-to-avoid-making-redundant-change.patch</a><br></div><div><br></div><div>kmod</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Dec 20, 2015 at 4:43 AM, Russell Wallace 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:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I want to run a bunch of optimizations, iteratively, that is keep running until things stop changing (to make sure all optimization opportunities are taken). As far as I know, there is no way to copy a module or compare modules by value, so it occurs to me that a practical solution might be to take the hash code of the module and see if that changes.<br><br>A problem is that hash algorithms are designed to work on streams of bytes, not compound objects.<br><br>First attempt at a solution: iterate through all instructions in all functions and hash the instruction kinds. I can think of some possible changes that would fail to be captured by that.<br><br>Is there any already known solution?<br></div>
<br>_______________________________________________<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/mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div>