<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Mar 17, 2017, at 11:50 AM, Mikhail Zolotukhin via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=us-ascii" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Hi,</div><div class=""><br class=""></div><div class="">One of the most time-consuming passes in LLVM middle-end is InstCombine (see e.g. [1]). It is a very powerful pass capable of doing all the crazy stuff, and new patterns are being constantly introduced there. The problem is that we often use it just as a clean-up pass: it's scheduled 6 times in the current pass pipeline, and each time it's invoked it checks all known patterns. It sounds ok for O3, where we try to squeeze as much performance as possible, but it is too excessive for other opt-levels. InstCombine has an ExpensiveCombines parameter to address that - but I think it's underused at the moment.</div></div></div></div></div></div></blockquote><div><br class=""></div><div>Yes, the “ExpensiveCombines” has been added recently (4.0? 3.9?) but I believe has always been intended to be extended the way you’re doing it. So I support this effort :)</div><div><br class=""></div><div>CC: David for the general direction on InstCombine though.</div><div><br class=""></div><div><br class=""></div><div>— </div><div>Mehdi</div><div><br class=""></div><div><br class=""></div><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><br class=""></div><div class="">Trying to find out, which patterns are important, and which are rare, I profiled clang using CTMark and got the following coverage report:</div><div class=""></div></div></div></div></div><span id="cid:CEA3012D-A9E2-4318-AA90-C372667C70A9@apple.com"><InstCombine_covreport.html></span><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""></div><div class=""><div class="">(beware, the file is ~6MB).</div></div><div class=""><br class=""></div><div class="">Guided by this profile I moved some patterns under the "if (ExpensiveCombines)" check, which expectedly happened to be neutral for runtime performance, but improved compile-time. The testing results are below (measured for Os).</div><div class=""><br class=""></div><div class=""><table class="" style="font-family: Helvetica, sans-serif; font-size: 9pt; border-spacing: 0px; border: 1px solid black;"><thead class=""><tr class=""><th style="background-color: rgb(238, 238, 238); color: rgb(102, 102, 102); cursor: default; text-align: center; font-family: Verdana; padding: 5px 5px 5px 8px; width: 500px;" class="">Performance Improvements - Compile Time</th><th style="background-color: rgb(238, 238, 238); color: rgb(102, 102, 102); cursor: default; text-align: center; font-family: Verdana; padding: 5px 5px 5px 8px;" class="">Δ </th><th style="background-color: rgb(238, 238, 238); color: rgb(102, 102, 102); cursor: default; text-align: center; font-family: Verdana; padding: 5px 5px 5px 8px;" class="">Previous</th><th style="background-color: rgb(238, 238, 238); color: rgb(102, 102, 102); cursor: default; text-align: center; font-family: Verdana; padding: 5px 5px 5px 8px;" class="">Current</th><th style="background-color: rgb(238, 238, 238); color: rgb(102, 102, 102); cursor: default; text-align: center; font-family: Verdana; padding: 5px 5px 5px 8px;" class="">σ </th></tr></thead><tbody class="searchable"><tr class=""><td class="benchmark-name" style="padding: 5px 5px 5px 8px;"><a href="http://michaelsmacmini.local/perf/v4/nts/2/graph?test.15=2" class="">CTMark/sqlite3/sqlite3</a></td><td style="padding: 5px 5px 5px 8px; background-color: rgb(200, 255, 200);" class="">-1.55%</td><td style="padding: 5px 5px 5px 8px;" class="">6.8155</td><td style="padding: 5px 5px 5px 8px;" class="">6.7102</td><td style="padding: 5px 5px 5px 8px;" class="">0.0081</td></tr><tr class=""><td class="benchmark-name" style="padding: 5px 5px 5px 8px;"><a href="http://michaelsmacmini.local/perf/v4/nts/2/graph?test.1=2" class="">CTMark/mafft/pairlocalalign</a></td><td style="padding: 5px 5px 5px 8px; background-color: rgb(209, 255, 209);" class="">-1.05%</td><td style="padding: 5px 5px 5px 8px;" class="">8.0407</td><td style="padding: 5px 5px 5px 8px;" class="">7.9559</td><td style="padding: 5px 5px 5px 8px;" class="">0.0193</td></tr><tr class=""><td class="benchmark-name" style="padding: 5px 5px 5px 8px;"><a href="http://michaelsmacmini.local/perf/v4/nts/2/graph?test.7=2" class="">CTMark/ClamAV/clamscan</a></td><td style="padding: 5px 5px 5px 8px; background-color: rgb(210, 255, 210);" class="">-1.02%</td><td style="padding: 5px 5px 5px 8px;" class="">11.3893</td><td style="padding: 5px 5px 5px 8px;" class="">11.2734</td><td style="padding: 5px 5px 5px 8px;" class="">0.0081</td></tr><tr class=""><td class="benchmark-name" style="padding: 5px 5px 5px 8px;"><a href="http://michaelsmacmini.local/perf/v4/nts/2/graph?test.10=2" class="">CTMark/lencod/lencod</a></td><td style="padding: 5px 5px 5px 8px; background-color: rgb(210, 255, 210);" class="">-1.01%</td><td style="padding: 5px 5px 5px 8px;" class="">12.8763</td><td style="padding: 5px 5px 5px 8px;" class="">12.7461</td><td style="padding: 5px 5px 5px 8px;" class="">0.0244</td></tr><tr class=""><td class="benchmark-name" style="padding: 5px 5px 5px 8px;"><a href="http://michaelsmacmini.local/perf/v4/nts/2/graph?test.5=2" class="">CTMark/SPASS/SPASS</a></td><td style="padding: 5px 5px 5px 8px; background-color: rgb(210, 255, 210);" class="">-1.01%</td><td style="padding: 5px 5px 5px 8px;" class="">12.5048</td><td style="padding: 5px 5px 5px 8px;" class="">12.3791</td><td style="padding: 5px 5px 5px 8px;" class="">0.0340</td></tr></tbody></table><div class=""><br class=""></div><table class="" style="font-family: Helvetica, sans-serif; font-size: 9pt; border-spacing: 0px; border: 1px solid black;"><thead class=""><tr class=""><th style="background-color: rgb(238, 238, 238); color: rgb(102, 102, 102); cursor: default; text-align: center; font-family: Verdana; padding: 5px 5px 5px 8px; width: 500px;" class="">Performance Improvements - Compile Time</th><th style="background-color: rgb(238, 238, 238); color: rgb(102, 102, 102); cursor: default; text-align: center; font-family: Verdana; padding: 5px 5px 5px 8px;" class="">Δ </th><th style="background-color: rgb(238, 238, 238); color: rgb(102, 102, 102); cursor: default; text-align: center; font-family: Verdana; padding: 5px 5px 5px 8px;" class="">Previous</th><th style="background-color: rgb(238, 238, 238); color: rgb(102, 102, 102); cursor: default; text-align: center; font-family: Verdana; padding: 5px 5px 5px 8px;" class="">Current</th><th style="background-color: rgb(238, 238, 238); color: rgb(102, 102, 102); cursor: default; text-align: center; font-family: Verdana; padding: 5px 5px 5px 8px;" class="">σ </th></tr></thead><tbody class="searchable"><tr class=""><td class="benchmark-name" style="padding: 5px 5px 5px 8px;"><a href="http://michaelsmacmini.local/perf/v4/nts/2/graph?test.14=2" class="">External/SPEC/CINT2006/403.gcc/403.gcc</a></td><td style="padding: 5px 5px 5px 8px; background-color: rgb(199, 255, 199);" class="">-1.64%</td><td style="padding: 5px 5px 5px 8px;" class="">54.0801</td><td style="padding: 5px 5px 5px 8px;" class="">53.1930</td><td style="padding: 5px 5px 5px 8px;" class="">-</td></tr><tr class=""><td class="benchmark-name" style="padding: 5px 5px 5px 8px;"><a href="http://michaelsmacmini.local/perf/v4/nts/2/graph?test.7=2" class="">External/SPEC/CINT2006/400.perlbench/400.perlbench</a></td><td style="padding: 5px 5px 5px 8px; background-color: rgb(205, 255, 205);" class="">-1.25%</td><td style="padding: 5px 5px 5px 8px;" class="">19.1481</td><td style="padding: 5px 5px 5px 8px;" class="">18.9091</td><td style="padding: 5px 5px 5px 8px;" class="">-</td></tr><tr class=""><td class="benchmark-name" style="padding: 5px 5px 5px 8px;"><a href="http://michaelsmacmini.local/perf/v4/nts/2/graph?test.15=2" class="">External/SPEC/CINT2006/445.gobmk/445.gobmk</a></td><td style="padding: 5px 5px 5px 8px; background-color: rgb(210, 255, 210);" class="">-1.01%</td><td style="padding: 5px 5px 5px 8px;" class="">15.2819</td><td style="padding: 5px 5px 5px 8px;" class="">15.1274</td><td style="padding: 5px 5px 5px 8px;" class="">-</td></tr></tbody></table><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Do such changes make sense? The patch doesn't change O3, but it does change Os and potentially can change performance there (though I didn't see any changes in my tests).</div></div><div class=""><br class=""></div><div class="">The patch is attached for the reference, if we decide to go for it, I'll upload it to phab:</div><div class=""><br class=""></div><div class=""></div></div></div></div></div><span id="cid:2A77C0D9-EE12-4C99-99A0-7A0CF5DF758A@apple.com"><0001-InstCombine-Move-some-infrequent-patterns-under-if-E.patch></span><meta http-equiv="Content-Type" content="text/html charset=us-ascii" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Michael</div><div class=""><br class=""></div><div class=""><div class="">[1]: <a href="http://lists.llvm.org/pipermail/llvm-dev/2016-December/108279.html" class="">http://lists.llvm.org/pipermail/llvm-dev/2016-December/108279.html</a></div></div><div class=""><br class=""></div></div></div></div></div>_______________________________________________<br class="">LLVM Developers mailing list<br class=""><a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a><br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev<br class=""></div></blockquote></div><br class=""></body></html>