<div dir="ltr">Thanks, I didn't know that! Indeed, it's instruction combine that does the job.<br><br>- Stefanos</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Στις Δευ, 6 Απρ 2020 στις 12:38 π.μ., ο/η Florian Hahn <<a href="mailto:florian_hahn@apple.com">florian_hahn@apple.com</a>> έγραψε:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
<br>
> On Apr 5, 2020, at 22:20, Stefanos Baziotis <<a href="mailto:stefanos.baziotis@gmail.com" target="_blank">stefanos.baziotis@gmail.com</a>> wrote:<br>
> <br>
> > Any idea about how the compiler could remove the lshr and use a add -16?<br>
> Actually, I just figured that doing this test is like solving this:<br>
> <br>
> 8 <= x/2 <= 13<br>
> 16 <= x <= 26<br>
> 0 <= x - 16 <= 10 => 0 <= x < 11<br>
> The left part is know since it's unsigned<br>
> The right part could be done x <= 11 => x < 12 because it's actually an integer division.<br>
> Wow... I would be really happy to know what pass does that.<br>
<br>
I’d guess a combination of instcombine rules together with some other transforms. You could probably use `-print-after-all` (`clang -mllvm -print-after-all` if you are using clang) to track down the relevant passes/steps.</blockquote></div>