[LLVMdev] Chatty C++API code generation

Alexander Poddey alexander.poddey at gmx.net
Mon Mar 16 11:46:41 PDT 2015


Jeremy, 
you are totally right:
I did Call(foo.weight) and was expecting Call(&foo.weight).

Thanks!

Alex



Jeremy Lakeman wrote:

> What you've written is;
> Call(foo.weight)
> So the value of foo.weight needs to be loaded from the global address so
> the value can be passed as a float.
> 
> Were you expecting;
> Call(&foo.weight)
> So the address is passed as a pointer to the global structure element.
> 
> Or were you expecting;
> Call(67.2)
> An optimisation that would need to be certain that foo.weight is never
> over-written.
> 
> 
> On Wed, Mar 11, 2015 at 5:03 AM, Alexander Poddey
> <alexander.poddey at gmx.net> wrote:
> 
>> Hi all,
>>
>> when I have c code like
>> --- c code -------------
>>  struct stest {         /* deklariert den Strukturtyp person */
>>     int   age;
>>     float weight;
>>  } foo={44,67.2};            /* deklariert Variable des Typs person */
>>
>>
>>
>> int main() {
>>
>>    callAFunction(foo.weight);
>>
>> ------------------------
>>
>> The generated c++API code to me seems to be too chatty in the sense that
>> the foo.weight's data is copied to a local variable using a load
>> instruction.
>> The call instruction is then using the local copy.
>>
>> --- API code ---------------
>> ...
>> std::vector<Constant*> const_ptr_113_indices;
>> const_ptr_113_indices.push_back(const_int32_103);
>> const_ptr_113_indices.push_back(const_int32_104);
>> Constant* const_ptr_113 =
>> ConstantExpr::getGetElementPtr(gvar_struct_adam, const_ptr_113_indices);
>>
>> //here we have const_ptr_113; why not use it in theCallInst?
>>
>>  LoadInst* float_130 = new LoadInst(const_ptr_113, "", false,
>> label_entry_121);
>>  float_130->setAlignment(4);
>>
>>  CallInst* float_call = CallInst::Create(func__Z4fib3f, float_130,
>>  "call",
>> label_entry_121);
>> ------------------------------------------------
>>
>>
>> To me, this ll code seems to relate to something like
>> int main() {
>>    float localfloat=foo.weight;
>>    callAFunction(localfloat);
>>
>> This is distinct from the original code...
>>
>> Do I have a missunderstanding?
>> Thanks
>> Alexander
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>





More information about the llvm-dev mailing list