<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<p>Slightly OT for the original question, but do we manage to factor
out the common factor here and actually form the switch?</p>
<p>This could be rewritten as:</p>
<div>int tmp = a/10;<br>
switch(tmp) {<br>
case 1: ...<br>
case 3: ...<br>
case 5: ...<br>
case 7: ...<br>
}<br>
<br>
Do we do so?<br>
<br>
Philip<br>
<br>
</div>
<div class="moz-cite-prefix">On 08/04/2017 04:10 PM, Craig Topper
via llvm-dev wrote:<br>
</div>
<blockquote type="cite"
cite="mid:CAF7ks-OaMDGyAavYPwv5EOkJJW0xSvJ8XH4s9q07PsZF-XPMqA@mail.gmail.com">
<div dir="ltr">
<div>I'm look at some code that does something roughly like this</div>
<div><br>
</div>
<div>if (a >= 10 && a < 20) {</div>
<div> // do calculation</div>
<div>} else if (a >= 30 && a < 40) {</div>
<div> // do calculation</div>
<div>} else if (a >= 50 && a < 60) {</div>
<div> // do something</div>
<div>
<div>} else if (a >= 70 && a < 80) {</div>
<div> // do something</div>
</div>
<div>}</div>
<div><br>
</div>
<div>// some other code that got split based on whether we
entered any of the 'if' bodies. So each if body merges to a
slightly different spot than the not taken side of the final
if.<br>
</div>
<div><br>
</div>
<div>In my specific case there are really 8 specific range
checks.</div>
<div><br>
</div>
<div>Without profile data it seems branch probability assumes
the branch of each 'if' has 50% probability. Due to the way
the ifs are cascaded this causes block frequency to think the
final 'if' body can only execute some really small percentage
of the time. Similarly it thinks that less than %1 of the time
will we enter the code path that occurs if none of the ifs are
taken.</div>
<div><br>
</div>
<div>In reality in my specific case we end up executing none of
the ifs most often. But I think i'd settle for all bodies and
the no ifs taken path having equal weighting</div>
<div><br>
</div>
<div>The bad block frequency and the fact that we have a split
path for merging the ifs versus not going into any ifs at all
seems to be causing block placement to create a layout that
pessimizes the real common case.</div>
<div><br>
</div>
<div>Since all the compares are on the same variable, the
originally code is kinda like a switch and as such we should
maybe give each possible path equal weighting.</div>
<div><br>
</div>
<div>Is there somewhere we can apply a heuristic to the branch
probability so that it can provide a better answer here?</div>
<br clear="all">
<div>
<div class="gmail_signature">~Craig</div>
</div>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
LLVM Developers mailing list
<a class="moz-txt-link-abbreviated" href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>
<a class="moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a>
</pre>
</blockquote>
<br>
</body>
</html>