>> If the problem is tracking liveness, wouldn't it be better to
>> iterate over the "then" block in reverse order?  We would start
>> with the liveness set for the join block and update as we move
>> backwards through the "then" block.  This liveness set would
>> tell us whether the current instruction needs to preserve a
>> particular register.  That should make it possible to do the
>> transformation in one step, and so avoid the risk that the
>> second attempt does something that is unexpectedly different
>> from the first attempt.
>
> I agree that the current approach is rather cumbersome.  Indeed
> the second attempt was conditional at first and I changed it to
> be unconditional after some patch iterations.
> Your reverse-order idea sounds like it should work.  To further
> clean up the algorithm we could also make it more explicit
> that a "cmov" depends on either the condition or the CC and
> basically track two separate paths through the block, one CC
> path and one "condition" path.

I gave this another thought.  Right now we keep track of the
generated targets and temporaries in forward order, using those
for the source rewiring.  I don't see how we could do that in
reverse order other than have another fixup iteration afterwards.

>> FWIW, the reason for asking was that it seemed safer to pass
>> use_cond_earliest back from noce_convert_multiple_sets_1
>> to noce_convert_multiple_sets, as another parameter,
>> and then do the adjustment around noce_convert_multiple_sets's
>> call to targetm.noce_conversion_profitable_p.  That would avoid
>> the new for a new if_info field, which in turn would make it
>> less likely that stale information is carried over from one attempt
>> to the next (e.g. if other ifcvt techniques end up using the same
>> field in future).
>
> Would something like the attached v4 be OK that uses a parameter
> instead (I mean without having refactored the full algorithm)?
> At least I changed the comment before the second attempt to
> hopefully cause a tiny bit less confusion :)
> I haven't fully bootstrapped it yet.

That v4 was bootstrapped and regtested on x86 and aarch64 in the meanwhile and
it has been in our internal tree for a while without problems.

Would it be OK for trunk without further refactoring?

-- 
Regards
 Robin

Reply via email to