<div dir="auto"><div><div class="gmail_quote"><div dir="ltr"> Hi JF,</div><div dir="ltr"><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
A few options:<br>
<br>
1. Make them a builtin, have libc implementations forward to the builtin.<br>
2. Teach clang / LLVM about these function’s semantics (i.e. if conditions met, same as memset).<br>
<br>
I think 1. is the best approach.<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">Could you expand on why 1 looks better than 2?</div><div dir="auto"><br></div><div dir="auto">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"><br></div><div dir="auto">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"><br></div><div dir="auto">As such I'm interested in your preference for doing this in clang, and whether it generalises to other magic library functions.</div><div dir="auto"><br></div><div dir="auto">Cheers,</div><div dir="auto"><br></div><div dir="auto">Jon</div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
</blockquote></div></div></div>