<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jan 5, 2019, at 2:01 AM, Jon Chesterfield via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org" class="">cfe-dev@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="auto" class=""><div class=""><div class="gmail_quote"><div dir="ltr" class=""> Hi JF,</div><div dir="ltr" class=""><br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
A few options:<br class="">
<br class="">
1. Make them a builtin, have libc implementations forward to the builtin.<br class="">
2. Teach clang / LLVM about these function’s semantics (i.e. if conditions met, same as memset).<br class="">
<br class="">
I think 1. is the best approach.<br class=""></blockquote></div></div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">Could you expand on why 1 looks better than 2?</div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">There's a lot of code that can be handled via clang builtin or via pattern matching IR pass. All of libm for example. Some functions have both styles, some even get converted from clang builtin to libm call to llvm intrinsic.</div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">I'm in favour of recognising function calls and translating them to IR intrinsics. This simplifies testing (via opt). It moves an optimisation out of clang and into an IR pass which feels right. It also means &sin works, though I know this to be forbidden.</div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">As such I'm interested in your preference for doing this in clang, and whether it generalises to other magic library functions.</div></div></div></blockquote></div><div><br class=""></div>I think libc keeping the initial checks and using a builtin for the special memset (which can’t otherwise be expressed in straight C) is better because it’s not opaque. There’s only compiler magic where there needs to be, and no special recognition of semantics otherwise (which can be error-prone).<div class=""><br class=""></div><div class="">libm, in comparison, isn’t straightforward to understand when it e.g. uses a lookup table. In that case, teaching clang / LLVM about things like “sin creates a number in this range” seems good, because there’s no way we’d figure it out otherwise.</div><div class=""><br class=""></div></body></html>