http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41580

--- Comment #5 from Tobias Burnus <burnus at gcc dot gnu.org> 2011-01-05 
17:19:45 UTC ---
Created attachment 22907
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=22907
Draft patch - not fully working

(In reply to comment #4)
> Note: If both arguments are TYPE-valued, the result will be a compile-time
> constant, otherwise it has to be evaluated at runtime, according to the _hash
> values in the vtabs.

Well, extends_type_of can also be (sometimes) be evaluated at compile time for
CLASS.

> In which situations would we actually gain something

I assume that in practice it only matters for automatically generated code -
but there it might reduce the code size and improve the performance.

By the way: I think that's a 4.7 item.

 * * *

I attached a draft patch. Note, however, that it does not work (cf. bottom of
patch/test case). For

   if (extends_type_of(a11,b11) .neqv. .true.) call abort()

one enters gfc_simplify_extends_type_of twice: Once the second argument (mold)
is BT_CLASS (which give the correct result: NULL, i.e. not compile-time
simplifiable). But then again with mold being BT_DERIVED - which is then
compile-time simplified to .TRUE. as "a11" and "b11" are the same type.

I have not dug into this, but it seems to occur in two steps - first a normal
simplification happens, then a specific interface is used via
gfc_intrinsic_func_interface, which is then again simplified - but with
BT_DERIVED argument (base type). I think all gfc_simplify_* functions could be
affected.

TODO:
- Fix the double-simplification problem
- Add more test cases - I think the double-simplification also affects
same_type, but it is currently not tested for.

Reply via email to