<div dir="ltr"><div><div><div>Hello,<br><br></div>This is an interesting example.  Whenever I see strange things like this, I use opt's -lint.<br></div>In this case, opt -lint reports:<br>Undefined behavior: Call return type mismatches callee return type<br>
  %call = call float @alias_f32(float %tmp2) #1<br><br></div><div>You'll get a similar report when the parameter types mismatch.<br><br></div><div>Pete<br><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Wed, May 29, 2013 at 5:40 PM, Arsenault, Matthew <span dir="ltr"><<a href="mailto:Matthew.Arsenault@amd.com" target="_blank">Matthew.Arsenault@amd.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<br>
<br>
I'm not sure what the expected behavior of calling a bitcasted function is. Suppose you have a case like this (which you get on the source level from attribute alias):<br>
<br>
@alias_f32 = alias bitcast (i32 (i32)* @func_i32 to float (float)*)<br>
<br>
define internal i32 @func_i32(i32 %v) noinline nounwind {<br>
entry:<br>
  ret i32 %v<br>
}<br>
<br>
define void @bitcast_alias_scalar(float* noalias %source, float* noalias %dest) nounwind {<br>
entry:<br>
  %arrayidx = getelementptr float* %source, i32 0<br>
  %tmp2 = load float* %arrayidx, align 8<br>
  %call = call float @alias_f32(float %tmp2) nounwind<br>
  %arrayidx8 = getelementptr float* %dest, i32 0<br>
  store float %call, float* %arrayidx8, align 8<br>
  ret void<br>
}<br>
<br>
If you run opt -instcombine on this, this transforms into<br>
define void @bitcast_alias_scalar(float* noalias %source, float* noalias %dest) nounwind {<br>
entry:<br>
  %tmp2 = load float* %source, align 8<br>
  %0 = fptoui float %tmp2 to i32<br>
  %call = call i32 @func_i32(i32 %0) nounwind<br>
  %1 = uitofp i32 %call to float<br>
  store float %1, float* %dest, align 8<br>
  ret void<br>
}<br>
<br>
<br>
Note the fptoui / uitofp conversions to the underlying function's argument / return type. I would expect this to bitcast the arguments and call the underlying function. This transformation happens in InstCombiner::transformConstExprCastCall. This kind of thing almost seems intentional though from some of the comments and tests, so I'm not sure what's supposed to be going on. A conversion that changes the bits doesn't make any sense to me.<br>

<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</blockquote></div><br></div>