[llvm-dev] Why does clang do a memcpy? Is the cast not enough? (ABI function args)

edA-qa mort-ora-y via llvm-dev llvm-dev at lists.llvm.org
Wed Apr 18 10:38:04 PDT 2018


Yes, I understand that as well (it's what I'm trying to recreate in my
language now).

I'm really wondering why it does the copy, since from what I can tell it
could just as easily cast the original value and do the load without the
memcpy operation.

That is, the question is about the memcpy and extra alloca -- I
understand what it's doing, just not why it's doing it this way.


On 18/04/18 19:33, Krzysztof Parzyszek via llvm-dev wrote:
> It is a matter of the calling convention. It would specify what
> structs are passed in registers, and which are passed through stack.
>
> -Krzysztof
>
> On 4/18/2018 12:28 PM, edA-qa mort-ora-y via llvm-dev wrote:
>> I understand it's passing by value, that's what I'm testing here. The
>> question is why does it copy the data rather than just casting and
>> loading values from the original variable (%v) ?  It seems like the
>> copying is unnecessary.
>>
>> Not all struct's result in the copy, only certain forms -- others are
>> just cast directly as I was expecting. I'm just not clear on what the
>> differences are, and whether I need to do the same thing.
>>
>>
>> On 18/04/18 19:13, Dimitry Andric wrote:
>>> On 18 Apr 2018, at 18:40, edA-qa mort-ora-y via llvm-dev
>>> <llvm-dev at lists.llvm.org> wrote:
>>>> I'm implementing function arguments and tested this code in C:
>>>>
>>>>      // clang -emit-llvm ll_struct_arg.c -S -o /dev/tty
>>>>      typedef struct vpt_data {
>>>>          char a;
>>>>          int b;
>>>>          float c;
>>>>      } vpt_data;
>>>>
>>>>      void vpt_test( vpt_data vd ) {
>>>>      }
>>>>
>>>>      int main() {
>>>>          vpt_data v;
>>>>          vpt_test(v);
>>>>      }
>>>>
>>>> This emits an odd LLVM structure that casts to the desired struct
>>>> type,
>>>> but also memcpy's to a temporary structure. I'm unsure of why the
>>>> memcpy
>>>> is done as opposed to just casting directly?
>>> Because you are passing the parameter by value?  It *should* copy the
>>> data.  In this particular case it will probably be elided if you
>>> turn on
>>> optimization, but it is more logical to pass structs via a const
>>> reference or pointer.
>>>
>>> -Dimitry
>>>
>>
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>

-- 
edA-qa mort-ora-y  
	http://mortoray.com/

Creator of the Leaf language
	http://leaflang.org/

Streaming algorithms, AI, and design on Twitch
	https://www.twitch.tv/mortoray

Twitter
	edaqa
	



More information about the llvm-dev mailing list