<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div style="-webkit-text-size-adjust: auto; "><br>Sent from my iPhone</div><div style="-webkit-text-size-adjust: auto; "><br>On Jun 28, 2013, at 2:38 PM, Ghassan Shobaki <<a href="mailto:ghassan_shobaki@yahoo.com">ghassan_shobaki@yahoo.com</a>> wrote:<br><br></div><blockquote type="cite" style="-webkit-text-size-adjust: auto; "><div><div style="color:#000; background-color:#fff; font-family:arial, helvetica, sans-serif;font-size:12pt"><div id="yiv7899135245"><div><div style="color:#000;background-color:#fff;font-family:arial, helvetica, sans-serif;font-size:12pt;"><div id="yiv7899135245yui_3_7_2_29_1372440933443_39">Hi,</div><div id="yiv7899135245yui_3_7_2_29_1372440933443_97"><br></div><div style="color:rgb(0, 0, 0);font-size:16px;font-family:arial, helvetica, sans-serif;background-color:transparent;font-style:normal;" id="yiv7899135245yui_3_7_2_29_1372440933443_92">We are currently in the process of upgrading from LLVM 2.9 to LLVM 3.3. We are working on instruction scheduling 
(mainly for register pressure reduction). I have been following the
 llvmdev mailing list and have learned that a machine instruction (MI) 
scheduler has been implemented to replace (or work with?) the selection DAG (SD) 
scheduler. However, I could not find any document that describes the new MI scheduler and how it differs from and relates to the SD scheduler. </div></div></div></div></div></div></blockquote><div style="-webkit-text-size-adjust: auto; "><br></div><div style="-webkit-text-size-adjust: auto; ">MI is now the place to implement any heuristics for profitable scheduling. SD scheduler will be directly replaced by a new pass that orders the DAG as close as it can to IR order. We currently emulate this with -pre-RA-sched=source.</div><div style="-webkit-text-size-adjust: auto; ">The only thing necessarily different about MI sched is that it runs after reg coalescing and before reg alloc, and maintains live interval analysis. As a result, register pressure tracking is more accurate. It also uses a new target interface for precise register pressure. </div><div style="-webkit-text-size-adjust: auto; ">MI sched  is intended to be a convenient place to implement target specific scheduling. There is a generic implementation that uses standard heuristics to reduce register pressure and balance latency and CPU resources. That is what you currently get when you enable MI sched for x86. </div><div style="-webkit-text-size-adjust: auto; ">The generic heuristics are implemented as a priority function that makes a greedy choice over the ready instructions based on the current pressure and the resources and latency of the scheduled and unscheduled set of instructions.</div><div style="-webkit-text-size-adjust: auto; ">An DAG subtree analysis also exists   (ScheduleDFS), which can be used for register pressure avoidance. This isn't hooked up to the generic heuristics yet for lack of interesting test cases.</div><div style="-webkit-text-size-adjust: auto; "><br></div><blockquote type="cite" style="-webkit-text-size-adjust: auto; "><div><div style="color:#000; background-color:#fff; font-family:arial, helvetica, sans-serif;font-size:12pt"><div id="yiv7899135245"><div><div style="color:#000;background-color:#fff;font-family:arial, helvetica, sans-serif;font-size:12pt;"><div style="color:rgb(0, 0, 0);font-size:16px;font-family:arial, helvetica, sans-serif;background-color:transparent;font-style:normal;" id="yiv7899135245yui_3_7_2_29_1372440933443_92">So, I would appreciate any pointer to a document (or a blog) that may help us understand the difference and the relation between the two schedulers and figure out how to deal with them. We are trying to answer the following questions: <br id="yiv7899135245yui_3_7_2_29_1372440933443_555"></div><div id="yiv7899135245yui_3_7_2_29_1372440933443_552" style="color:rgb(0, 0, 0);font-size:16px;font-family:arial, helvetica, sans-serif;background-color:transparent;font-style:normal;"><br>- A comment at the top of the file ScheduleDAGInstrs says that this file implements re-scheduling of machine instructions. So, what does re-scheduling mean?</div></div></div></div></div></div></blockquote><div style="-webkit-text-size-adjust: auto; "><br></div><span style="-webkit-text-size-adjust: auto;">Rescheduling just means optional scheduling. That's really what the comment should say. It's important to know that MI sched can be skipped for faster compilation. </span><div><span style="-webkit-text-size-adjust: auto;"><br></span><blockquote type="cite" style="-webkit-text-size-adjust: auto; "><div><div style="color:#000; background-color:#fff; font-family:arial, helvetica, sans-serif;font-size:12pt"><div id="yiv7899135245"><div><div style="color:#000;background-color:#fff;font-family:arial, helvetica, sans-serif;font-size:12pt;"><div id="yiv7899135245yui_3_7_2_29_1372440933443_552" style="color:rgb(0, 0, 0);font-size:16px;font-family:arial, helvetica, sans-serif;background-color:transparent;font-style:normal;"> Does it mean that the real scheduling algorithms (such as reg pressure reduction) are currently implemented in the SD scheduler, while the MI scheduler does some kind of complementary
 work (fine tuning) at a lower level representation of the code? <br>And what's the future plan? Is it to move the real scheduling algorithms into the MI scheduler and get rid of the SD scheduler? Will that happen in 3.4 or later?<br></div></div></div></div></div></div></blockquote><div><br></div>I would like to get rid of the SD scheduler so we can reduce compile time by streamline the scheduling data structures and interfaces. There may be some objection to doing that in 3.4 if projects haven't been able to migrate. It will be deprecated though. </div><div><br><blockquote type="cite" style="-webkit-text-size-adjust: auto; "><div><div style="color:#000; background-color:#fff; font-family:arial, helvetica, sans-serif;font-size:12pt"><div id="yiv7899135245"><div><div style="color:#000;background-color:#fff;font-family:arial, helvetica, sans-serif;font-size:12pt;"><div id="yiv7899135245yui_3_7_2_29_1372440933443_552" style="color:rgb(0, 0, 0);font-size:16px;font-family:arial, helvetica, sans-serif;background-color:transparent;font-style:normal;"><br id="yiv7899135245yui_3_7_2_29_1372440933443_559"></div><div id="yiv7899135245yui_3_7_2_29_1372440933443_556" style="color:rgb(0, 0, 0);font-size:16px;font-family:arial, helvetica, sans-serif;background-color:transparent;font-style:normal;">- Based on our initial investigation of the default behavior at -O3 on x86-64, it appears that the SD scheduler is called while the MI scheduler is not. That's consistent with the above interpretation of re-scheduling, but I'd appreciate any advice on what we should do at this point. Should we integrate our work (an alternate register pressure reduction scheduler) into the SD scheduler or the MI scheduler?<br></div></div></div></div></div></div></blockquote><div><br></div><div>Please refer to my recent messages on llvmdev regarding enabling MI scheduling by default on x86. </div><div><a href="http://article.gmane.org/gmane.comp.compilers.llvm.devel/63242/match=machinescheduler">http://article.gmane.org/gmane.comp.compilers.llvm.devel/63242/match=machinescheduler</a></div><div><br></div><div>I suggest integrating with the MachineScheduler pass.</div><div>There are many places to plug in. MachineSchedRegistry provides the hook. At that point you can define your own ScheduleDAGInstrs or ScheduleDAGMI subclass. People who only want to define new heuristics should reuse ScheduleDAGMI directly and only define their own MachineSchedStrategy.</div><div><br></div><blockquote type="cite" style="-webkit-text-size-adjust: auto; "><div><div style="color:#000; background-color:#fff; font-family:arial, helvetica, sans-serif;font-size:12pt"><div id="yiv7899135245"><div><div style="color:#000;background-color:#fff;font-family:arial, helvetica, sans-serif;font-size:12pt;"><div id="yiv7899135245yui_3_7_2_29_1372440933443_556" style="color:rgb(0, 0, 0);font-size:16px;font-family:arial, helvetica, sans-serif;background-color:transparent;font-style:normal;"><br></div><div id="yiv7899135245yui_3_7_2_1_1372440933443_2088" style="color:rgb(0, 0, 0);font-size:16px;font-family:arial, helvetica, sans-serif;background-color:transparent;font-style:normal;">- Our SPEC testing on x86-64 has shown a significant performance improvement of 
LLVM 3.3 relative to LLVM 2.9 (about 5% in geomean on INT2006 and 15% in
 geomean on FP2006), but our spill code measurements have shown that 
LLVM 3.3 generates significantly more spill code on most benchmarks. We will be doing more investigation on this, but are there any known facts that explain this behavior? Is 
this caused by a known regression in scheduling and/or allocation (which I doubt) or by the 
implementation (or enabling) of some new optimization(s) that naturally 
increase(s) register pressure?</div><div id="yiv7899135245yui_3_7_2_1_1372440933443_2098" style="color:rgb(0, 0, 0);font-size:16px;font-family:arial, helvetica, sans-serif;background-color:transparent;font-style:normal;"><br></div></div></div></div></div></div></blockquote>There is not a particular known regression. It's not surprising that optimizations increase pressure.</div><div><br></div><div>Andy</div><div><br><blockquote type="cite" style="-webkit-text-size-adjust: auto; "><div><div style="color:#000; background-color:#fff; font-family:arial, helvetica, sans-serif;font-size:12pt"><div id="yiv7899135245"><div><div style="color:#000;background-color:#fff;font-family:arial, helvetica, sans-serif;font-size:12pt;"><div id="yiv7899135245yui_3_7_2_1_1372440933443_2097" style="color:rgb(0, 0, 0);font-size:16px;font-family:arial, helvetica, sans-serif;background-color:transparent;font-style:normal;">Thank you in advance!</div><div id="yiv7899135245yui_3_7_2_1_1372440933443_2096" style="color:rgb(0, 0, 0);font-size:16px;font-family:arial, helvetica, sans-serif;background-color:transparent;font-style:normal;"><br></div><div id="yiv7899135245yui_3_7_2_1_1372440933443_2094" style="color:rgb(0, 0, 0);font-size:16px;font-family:arial, helvetica, sans-serif;background-color:transparent;font-style:normal;">Ghassan Shobaki<br></div><div id="yiv7899135245yui_3_7_2_1_1372440933443_2093" style="color:rgb(0, 0, 0);font-size:16px;font-family:arial,
 helvetica, sans-serif;background-color:transparent;font-style:normal;">Assistant Professor <br></div><div id="yiv7899135245yui_3_7_2_1_1372440933443_2092" style="color:rgb(0, 0, 0);font-size:16px;font-family:arial, helvetica, sans-serif;background-color:transparent;font-style:normal;">Department of Computer Science <br></div><div id="yiv7899135245yui_3_7_2_1_1372440933443_2091" style="color:rgb(0, 0, 0);font-size:16px;font-family:arial, helvetica, sans-serif;background-color:transparent;font-style:normal;">Princess Sumaya University for Technology <br></div><div id="yiv7899135245yui_3_7_2_1_1372440933443_2090" style="color:rgb(0, 0, 0);font-size:16px;font-family:arial, helvetica, sans-serif;background-color:transparent;font-style:normal;">Amman, Jordan</div><div id="yiv7899135245yui_3_7_2_1_1372440933443_2109" style="color:rgb(0, 0, 0);font-size:16px;font-family:arial, helvetica,
 sans-serif;background-color:transparent;font-style:normal;"><br></div></div></div></div></div></div></blockquote></div></body></html>