[Patch, Fortran] PR fortran/35681: First part, fix ELEMENTAL dependency handling for MVBITS

Daniel Kraft d@domob.eu
Fri Oct 31 15:43:00 GMT 2008


Hi,

I've updated the patch described below to trunk of now (including the 
trivial conflicts merge with Mikael's recent check-in) and run a new 
regtest, no regressions on GNU/Linux-x86-32.

Cheers,
Daniel

Daniel Kraft wrote:
> working on PR fortran/35681, I've got some rather big patch now handling 
> part of the problem.  What it exactly does:
> 
> 1) Some tab-indentation formatting fixes as I came along, sorry for 
> those.  I hope it is ok so.
> 
> 2) When resolving a MVBITS intrinsic call, the code->resolved_sym gets a 
> dummy formal argument list with the correct INTENTs specified; this is 
> needed later for gfc_conv_elemental_dependencies.
> 
> 3) gfc_code got a new member "resolved_isym" that tracks calls to 
> intrinsic procedures, so we can later check if some call is to intrinsic 
> MVBITS.  This got a little ugly and would be probably nicer to union it 
> (and possibly "resolved_sym", too) with actual, but that would probably 
> introduce a lot of changes to existing code pieces.
> 
> 4) gfc_trans_allocate_array_storage (or what it is called) got a new 
> argument `initial' that allows to initialize the created storage from 
> some other array (this is done using a combination of internal_pack and 
> memcpy if it was already packed, I hope I got this all right).  This is 
> used for gfc_trans_create_temp_array to allow initializing the new 
> temporary.  Here is (probably) most of the "critical" changes.
> 
> 5) For calls to intrinsic MVBITS, I enabled dependency checking using 
> gfc_conv_elemental_dependencies and made this routine aware of 
> INTENT(INOUT) arguments that use the new initialization feature to copy 
> over the initial content of the mirrored array to the created temporary.
> 
> 6) I could not find a test to verify this (not even one that uses 
> gfc_conv_elemental_dependencies) in a quick trial, but I believe the 
> handling of the temporary there was wrong, in that it was free'd (if 
> allocated on the heap) *before* it was used with internal_unpack, 
> because gfc_trans_create_temp_array added the temporary clean-up code to 
> se->post and the unpack-call was added to se->post later.  In my 
> opinion, this is some rather general problem with how post-commands are 
> usually added to other post blocks; shouldn't they be added to the top 
> usually rather than to the bottom, to get some sort of "nested" scope 
> with inner most pairs of pre/post?  Well, for now I changed this 
> behaviour inside gfc_conv_elemental_dependencies, which corrected 
> problems I got with MVBITS tests.
> 
> This enabled the (valid) tests in the PR to run, but only with modifying 
> them slightly by removing the parentheses around the first argument (so 
> it is not an expression; that will be part 2 of this fix).  As I 
> understand it, this is valid in case of MVBITS but not for any other 
> ELEMENTAL subroutine, right?  This is why I added the check for whether 
> some call is to MVBITS.  I guess the rationale why the compiler is not 
> required to create temporaries for all such ELEMENTAL calls (and they 
> are invalid instead) is performance?  gfortran could handle those calls 
> well in addition to only MVBITS calls simply if I take this conditional 
> check out, but then we might generate temporaries for cases where the 
> user knows no one is needed and the code is valid but the compiler can't 
> figure it out.
> 
> I hope I got this one at least somewhat clear...  What do you think 
> about it?  Currently regression-testing on GNU/Linux-x86-32, but I don't 
> expect any (a very similar patch worked fine before).
> 
> Cheers,
> Daniel
> 


-- 
Done:  Arc-Bar-Cav-Rog-Sam-Val-Wiz
To go: Hea-Kni-Mon-Pri-Ran-Tou
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: patch.changelog
URL: <http://gcc.gnu.org/pipermail/fortran/attachments/20081031/2c0f2a00/attachment.ksh>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: patch.diff
URL: <http://gcc.gnu.org/pipermail/fortran/attachments/20081031/2c0f2a00/attachment-0001.ksh>


More information about the Fortran mailing list