[GDC] Evaluation order: Please update the dmd backend

Sarath Kodali sarath at dummy.com
Wed Apr 2 00:47:23 PDT 2014


On Tuesday, 1 April 2014 at 22:04:43 UTC, Timon Gehr wrote:
> On 04/01/2014 08:40 PM, Sarath Kodali wrote:
>> ...
>>
>> The evaluation order of assign operators should not be LTR as 
>> they have
>> right associativity. In "a = b = c", c has to be evaluated 
>> first, then b
>> and then a. Similarly, in "a = b + c", "b+c" has to be 
>> evaluated first
>> before a is evaluated. Otherwise it will be very confusing, 
>> that in some
>> cases it is LTR and in some it is RTL.
>
> Note that this is after a paragraph that suggests to make 
> evaluation in some cases LTR and in some RTL.
>

There are 2 evaluation orders that need to be considered while 
evaluating expressions - the evaluation order of operators and 
the the evaluation order of operands of an operator. The 
evaluation order of operators is well defined and is done 
according to its precedence and associativity. However the 
evaluation order of operands for some of the binary operators is 
not defined. D left it undefined for assign operator. So in 
"a=b", the compiler can choose to evaluate a first and then b. 
However in "a=b=c", "b=c" has to be evaluated first due to right 
associativity of '=' operator. Similarly in "a=b+c", "b+c" has to 
be evaluated first due to higher precedence of + operator over = 
operator.  In both these cases, the right operand of = operator 
is evaluated first and then the left operand. So it naturally 
follows that even in the unspecified case (a=b), the right 
operand should be evaluated first so that it is consistent with 
other cases of = operator. All this means, the evaluation order 
of operands also should be according to the associativity of its 
operator. You can test this with other right or left associative 
binary operators.


>> Other binary operators like "+" have left associativity, and 
>> hence
>> evaluation for these should be LTR as mentioned in D spec.
>> ...
>
> What's the presumed relation between associativity and 
> evaluation order?
>
> In particular, the ternary operator ?: is right associative. 
> How on earth are you going to evaluate it right to left?
>
>> The C spec requires that the function arguments are to be 
>> pushed in RTL
>> order.
>
> [citation needed]
>

You can get that info from any C ABI doc from Intel or AMD or 
some other arch.

>> The DMD codegen uses pushl x86 instructions for pushing args. 
>> If the
>> frontend changes the func args evaluation order to LTR, then 
>> the backend
>> has to be modified  to use mov x86 instructions as is done by 
>> gcc codegen.
>>
>> - Sarath
>>
>
> The backend does not necessarily have to be modified to achieve 
> this.

Can you please explain how you are going to do that without 
modifying the backend?

- Sarath


More information about the Digitalmars-d mailing list