<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div><br><br>Sent from my iPad</div><div><br>On Jun 20, 2013, at 10:38 PM, "Ye, Mei" <<a href="mailto:Mei.Ye@amd.com">Mei.Ye@amd.com</a>> wrote:<br><br></div><blockquote type="cite"><div>

<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<base href="x-msg://1256/"><style><!--
/* Font Definitions */
@font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.apple-converted-space
        {mso-style-name:apple-converted-space;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->


<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Hi Evan<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">This transformation reduces branches.  It can benefit architectures with deep pipelines, less powerful branch predictors, or branch divergence on GPUs.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I did have a GPU benchmark that shows roughly 1.5X performance improvement.</span></p></div></div></blockquote><div><br></div>Yes, I except this can make improvements to GPUs. The problem is the same transformation can hurt many CPUs. <div><br><blockquote type="cite"><div><div class="WordSection1"><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">But on the other hand, there is probably very few optimizations that can benefit all architectures.  And it is also unrealistic to have performance measurement
 on all architectures to justify an optimization item.    What I am seeing is that compiler vendors have a tendency to push codes into their target space as much as possible, often at the expense of code quality that minimizes code-sharing and increases compilation
 time.   </span></p></div></div></blockquote><blockquote type="cite"><div><div class="WordSection1"><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">There is definitely a need to enable target-specific tuning in machine-independent optimizations.  Is there a guide line on a good approach to do this?  I have
 seen some cases that rely on threshold tuning, which can be non-deterministic and therefore unreliable.</span></p></div></div></blockquote><div><br></div>LLVM's philosophy on this is a bit different from other compilers. The transformation passes fall under two general categories: 1. Optimizations, 2. Canonicalization. Unfortunately the optimization pipeline currently doesn't make a good distinction of what passes fall in which category. SimplifyCFG is *mostly* about canonicalization. That is, it's meant to transform llvm IR which expose more optimization opportunities. I think it is not an ideal place for the proposed transformation. </div><div><br></div><div>The approach I would take is a separate height reduction pass. It should be a late pass that is run before codegen (think codegenprep). You can introduce target hooks that allow each target to specify when is the transformation profitable for the given target. If the community can't decide on the appropriate target hooks, then at least you can insert the pass into the pipeline for your target of interests. As it is, I don't think the patch would be acceptable without having proven it provides benefit to at least the most widely used CPU targets (e.g. ARM, x86). </div><div><br></div><div>Evan</div><div><br></div><div><br><blockquote type="cite"><div><div class="WordSection1"><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">-Mei    <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Evan Cheng [<a href="mailto:evan.cheng@apple.com">mailto:evan.cheng@apple.com</a>]
<br>
<b>Sent:</b> Thursday, June 20, 2013 4:51 PM<br>
<b>To:</b> Ye, Mei<br>
<b>Cc:</b> Sean Silva; <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<b>Subject:</b> Re: submit [PATCH] SimplifyCFG for code review<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Hi Mei,<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I have concerns about the general approach. It's not clear to me this kind of transformation is generally a win on all modern architectures. As an example from your code:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">+/// Before:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///   ......<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///   %cmp10 = fcmp une float %tmp1, %tmp2<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///   br i1 %cmp1, label %if.then, label %lor.rhs<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+/// lor.rhs:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///   ......<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///   %cmp11 = fcmp une float %tmp3, %tmp4<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///   br i1 %cmp11, label %if.then, label %ifend<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+/// if.end:  // the merge block<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///   ......<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+/// if.then: // has two predecessors, both of them contains conditional branch.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///   ......<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///   br label %if.end;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+/// After:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///  ......<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///  %cmp10 = fcmp une float %tmp1, %tmp2<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///  ......<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///  %cmp11 = fcmp une float %tmp3, %tmp4<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///  %cmp12 = or i1 %cmp10, %cmp11    // parallel-or mode.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///  br i1 %cmp12, label %if.then, label %ifend<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///  if.end:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///    ......<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+/// <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///  if.then:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///    ......<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+///    br label %if.end;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">The pre-transformed code is probably going to run faster than the transformed code on a modern Intel x86 processor. On ARM processors, saving the value of conditional registers and or'ing them is probably also quite expensive. I also suspect
 the transformation will prohibit the target from some if-conversion opportunities.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Have you thought about having targets providing cost information to the pass? Alternatively this may be done as a codegen pass?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Evan<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">On Jun 20, 2013, at 4:26 PM, "Ye, Mei" <<a href="mailto:Mei.Ye@amd.com">Mei.Ye@amd.com</a>> wrote:<o:p></o:p></p>
</div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Hi Sean</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">See the attached new patch, which fixes all issues brought up by you.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I ran “clang-format” on whole files which makes more diffs.  Hopefully this is OK with you.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">It will be nice if the check-in process can automatically run “clang-format”.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">-Mei</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
</div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<div>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span class="apple-converted-space"><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> </span></span><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">Sean
 Silva [mailto:silvas@<a href="http://purdue.edu"><span style="color:purple">purdue.edu</span></a>]<span class="apple-converted-space"> </span><br>
<b>Sent:</b><span class="apple-converted-space"> </span>Tuesday, June 18, 2013 4:48 PM<br>
<b>To:</b><span class="apple-converted-space"> </span>Ye, Mei<br>
<b>Cc:</b><span class="apple-converted-space"> </span><a href="mailto:llvm-commits@cs.uiuc.edu"><span style="color:purple">llvm-commits@cs.uiuc.edu</span></a><br>
<b>Subject:</b><span class="apple-converted-space"> </span>Re: submit [PATCH] SimplifyCFG for code review</span><o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"> <o:p></o:p></p>
<div>
<div>
<p class="MsoNormal">On Tue, Jun 18, 2013 at 4:27 PM, Ye, Mei <<a href="mailto:Mei.Ye@amd.com" target="_blank"><span style="color:purple">Mei.Ye@amd.com</span></a>> wrote:<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Hi Sean</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">There are some considerations that go into this test sample to create an opportunity for the transformation.</span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">The test case should run *only* the simplifycfg pass (I see now that you have `-O3` in your test case; please remove `-O3`). You can probably just write a simple .ll function with IR that looks like the "Before" case in your documentation
 comment. <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">Also,<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">+; RUN: opt < %s -O3 -simplifycfg -S | grep br | count 2<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">+%struct.float2_tag = type { float, float }<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">Please use FileCheck for all new tests. Using grep is deprecated.<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">-- Sean Silva<o:p></o:p></p>
</div>
</div>
</div>
</div>
</div>
<p class="MsoNormal"><span style="font-size:13.5pt;font-family:"Helvetica","sans-serif""><odc_simplifycfg>_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu"><span style="color:purple">llvm-commits@cs.uiuc.edu</span></a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits"><span style="color:purple">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</span></a><o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>


</div></blockquote></div></body></html>