Hi, On Tue, Apr 07 2020, Richard Biener wrote: > On Tue, 7 Apr 2020, Martin Jambor wrote: > >> Hi, >> >> when sra_modify_expr is invoked on an expression that modifies only >> part of the underlying replacement, such as a BIT_FIELD_REF on a LHS >> of an assignment and the SRA replacement's type is not compatible with >> what is being replaced (0th operand of the B_F_R in the above >> example), it does not work properly, basically throwing away the partd >> of the expr that should have stayed intact. >> >> This is fixed in two ways. For BIT_FIELD_REFs, which operate on the >> binary image of the replacement (and so in a way serve as a >> VIEW_CONVERT_EXPR) we just do not bother with convertsing. For >> REALPART_EXPRs and IMAGPART_EXPRs, we insert a VIEW_CONVERT_EXPR under >> the complex partial access expression, which is OK even in a LHS of an >> assignment (and other write contexts) because in those cases the >> replacement is not going to be a giple register anyway. >> >> The testcase for handling REALPART_EXPR and IMAGPART_EXPR is a bit >> fragile because SRA prefers complex and vector types over anything else >> (and in between the two it decides based on TYPE_UID which in my testing >> today always preferred complex types) and even when GIMPLE is wrong I >> often still did not get failing runs, so I only run it at -O1 (which is >> the only level where the the test fails for me). >> >> Bootstrapped and tested on x86_64-linux, bootstrap and testing on >> i686-linux and aarch64-linux underway. >> >> OK for trunk (and subsequently for release branches) if it passes? > > OK.
I must have been already half asleep when writing that it passed testing. It did not, testsuite/gcc.c-torture/compile/pr42196-3.c fails even on x86_64, because fwprop happily combines u$ci_10 = MEM[(union U *)&u]; and f1_6 = IMAGPART_EXPR <VIEW_CONVERT_EXPR<complex float>(u$ci_10)>; into f1_6 = IMAGPART_EXPR <MEM[(union U *)&u]>; and the gimple verifier of course does not like that. I'll have a look at that tomorrow. > > generate_subtree_copies contains similar code and the call in > sra_modify_expr suggests that an (outer?) bit-field-ref is possible > here, so is generate_subtree_copies affected as well? I'm not sure > how subtree copy generation "works" when we already replaced sth Because they were just horribly problematic, SRA does not create replacements for any scalar access that has a scalar ancestor or any children in the access tree. So the generate_subtree_copies call is only invoked when the expr itself is not replaced (because there are children), even after SRA the expression will still load/store the original bit of the original aggregate. The task of generate_subtree_copies is to write all children replacements back to the aggregate before it is read or re-load the replacements after a write to the aggregate. So no data should be forgotten here. Martin