Pure dynamic casts?

Jason House jason.james.house at gmail.com
Mon Sep 21 21:14:48 PDT 2009


Dynamic casts are pure. They don't use global state, and have the same output for the same reference as input. Interestingly, dynamic cast results are independent of intervening mutable calls... So there's even greater opportunity for optimization.

bearophile Wrote:

> I don't know much about this topic, but this post is mostly in question form.
> 
> Are dynamic casts pure? I have compiled the following small program with LDC:
> 
> 
> version (Tango)
>     import tango.stdc.stdio: printf;
> else version (D1)
>     import std.c.stdio: printf;
> else
>     import core.stdc.stdio: printf;
> 
> class A { int a; }
> 
> void main() {
>     Object o = new A();
>     A a = cast(A)o;
>     a.a = 10;
>     printf("%d %d\n", a.a, cast(A)o);
> }
> 
> 
> LDC based on DMD v1.045 and llvm 2.6 (Thu Sep 10 23:50:27 2009)
> ldc -O5 -release -inline -output-s dyncast_test.d
> 
> The asm it produces shows two calls to _d_dynamic_cast:
> 
> _Dmain:
>     pushl   %esi
>     subl    $16, %esp
>     movl    $_D5cast51A7__ClassZ, (%esp)
>     call    _d_allocclass
>     movl    %eax, %esi
>     movl    $_D5cast51A6__vtblZ, (%esi)
>     movl    $0, 4(%esi)
>     movl    $0, 8(%esi)
>     movl    %esi, (%esp)
>     movl    $_D5cast51A7__ClassZ, 4(%esp)
>     call    _d_dynamic_cast
>     movl    $10, 8(%eax)
>     movl    %esi, (%esp)
>     movl    $_D5cast51A7__ClassZ, 4(%esp)
>     call    _d_dynamic_cast
>     movl    %eax, 8(%esp)
>     movl    $10, 4(%esp)
>     movl    $.str1, (%esp)
>     call    printf
>     xorl    %eax, %eax
>     addl    $16, %esp
>     popl    %esi
>     ret $8
> 
> 
> If the dynamic cast are pure the compiler can call it only once here (LLVM already has two functions attributes for pure functions).
> 
> (Related: can the code that performs the dynamic casts be in some situations inlined by LDC?)
> 
> Bye,
> bearophile




More information about the Digitalmars-d mailing list