<div dir="ltr" style="text-align: left;"><div class="source-cpp" style="font-family: monospace;"><pre><span class="kw4">Hi,<br><br>I got a solution to use intrinsics without the need of builtin functions from:<br><a href="http://wiki.llvm.org/HowTo:_Call_LLVM_intrinsics_from_C_code">http://wiki.llvm.org/HowTo:_Call_LLVM_intrinsics_from_C_code</a><br>
<br>Do you know if this approach is still valid ?<br><br>The example is the following:<br><br> extern</span> <span class="st0">"C"</span> <span class="kw4">int</span> llvm_cas<span class="br0">(</span><span class="kw4">volatile</span> <span class="kw4">int</span><span class="sy2">*</span>, <span class="kw4">int</span>, <span class="kw4">int</span><span class="br0">)</span> asm<span class="br0">(</span><span class="st0">"llvm.atomic.cmp.swap.i32"</span><span class="br0">)</span><span class="sy4">;</span><br>
<br><span class="kw4"> int</span> foo<span class="br0">(</span><span class="kw4">volatile</span> <span class="kw4">int</span><span class="sy2">*</span> add, <span class="kw4">int</span> from, <span class="kw4">int</span> to<span class="br0">)</span> <span class="br0">{</span> <br>
<span class="kw1">return</span> llvm_cas<span class="br0">(</span>add, from, to<span class="br0">)</span><span class="sy4">;</span> <br><span class="br0"> }<br><br>And the expected llvm output is:<br>
</span><br> define i32 @_Z3fooPViii(i32* %add, i32 %from, i32 %to) {<br> entry:<br> %0 = tail call i32 @llvm.atomic.cmp.swap.i32(i32* %add, i32 %from, i32 %to); <i32> [#uses=1]<br> ret i32 %0<br> }<br><br> declare i32 @llvm.atomic.cmp.swap.i32(i32*, i32, i32)<br>
<span class="br0"><br>However, when I compile the same code, it generates the following call:<br><br> %call = tail call i32 @"\01llvm.atomic.cmp.swap.i32"(i32* %add, i32 %from, i32 %to) nounwind optsize<br><br>
which looks to me a regular call and not a direct call to the intrinsic.<br><br> Thank you,<br><br> Damien<br></span></pre></div></div>