On Wed, Feb 26, 2020 at 04:09:16PM +0800, luoxhu wrote:
> Thanks Richard, not sure about my understanding and please correct if any.
> 
> I tried Jukub's latest patch of "sccvn: Handle bitfields in push_partial_def".
> Got to know fre pass checks the load instruction's vuse chain and do the 
> constant
> bitfield combines in push_partial_def, then 
> native_encode_expr/native_interpret_expr
> can decode and encode the constant content and shift/combine the data.  
> This should be based on one change to my test case(by adding return 
> page->counters;)
> to trigger the fre pass push all SSA name's partial_defs.  Currently, for SSA 
> variables,
> this encode/interpret is not supported yet, I suppose this is the opportunity 
> you mean.
> As this case's input is not constant, so Jukub's patch doesn't fix it.

Yeah, I've looked at your case and the problem is that
         tmp.counters = counters_new;
         page->inuse   = tmp.inuse;
         page->inuse2  = tmp.inuse2;
         page->objects = tmp.objects;
         page->frozen  = tmp.frozen;
we optimize it into essentially:
         tmp.counters = counters_new;
         page->inuse   = (cast) counters_new;
         page->inuse2  = tmp.inuse2;
         page->objects = tmp.objects;
         page->frozen  = tmp.frozen;
and so it is no longer recognized as a mem copy.  What we could do is just
teach store-merging to virtually undo that optimization and consider the
store to be a MEM_REF too.  Especially for the BIT_INSERT_EXPR Eric has
added quite a few similar optimizations already.

        Jakub

Reply via email to