[PING] Re: [Patch] Fix the allocation of jump register for RTL sequence abstraction

Bernd Schmidt bernds_cb1@t-online.de
Tue Jun 13 09:40:00 GMT 2006


Gabor Loki wrote:

> We need to redesign this function, because the modified 
> 'compute_init_costs'
> function could generate false hash buckets when HASHED_INSNS is too
> small. This is not so critical as the following code, but it could lead 
> to false results.

How can this happen?  This problem should be documented somewhere in the 
code.

>>
>>> @@ -498,6 +519,10 @@ collect_pattern_seqs (void)
>>>        FOR_EACH_HTAB_ELEMENT (hash_bucket->seq_candidates, e0, 
>>> p_hash_elem, hti1)
>>>          FOR_EACH_HTAB_ELEMENT (hash_bucket->seq_candidates, e1, 
>>> p_hash_elem,
>>>                                 hti2)
>>> +          {
>>> +            if (hti1.slot >= hti2.slot)
>>> +              hti2.slot = hti1.slot;
>>> +            else
>>>            if (e0 != e1
>>
>>
>> What does this do?  Could use a comment.
> 
> This modify the 'hti2' iterator to speed up the inner cycle.
> 
> like:
> for (,,i++)
>        for (j=i,,j++)

Depends on iterator and hash table internals which kind of breaks the 
abstraction.  Better to create a new FOR_EACH_HTAB_ELEMENT_FROM with an 
extra argument?  That's preapproved as a separate patch.

>>> +/* Creates a jump insn for abstraction.  */
>>> +
>>> +static rtx
>>> +seq_make_jump_insn_raw (rtx insn)
>>> +{
>>> +  rtx new_insn;
>>> +
>>> +  switch (GET_CODE (insn))
>>> +    {
>>> +    case INSN:
>>> +    case JUMP_INSN:
>>> +    case CALL_INSN:
>>> +    case CODE_LABEL:
>>> +    case BARRIER:
>>> +    case NOTE:
>>> +      new_insn = insn;
>>> +      break;
>>
>>
>>> +    default:
>>> +      new_insn = make_jump_insn_raw (insn);
>>> +    }
>>
>>
>> This looks odd.  Can you really pass both patterns and whole insns 
>> into  this?  Do you really need to handle NOTEs and INSNs?
> 
> Yes, we need. We don't know the results of 'gen_jump' and
> 'gen_indirect_jump' (which are the inputs of this function).
> It could be a pattern (like x86) or a sequence (like sh) too.

But all the following code assumes that you only get a single insn, 
starting with the setting of NEXT_INSN/PREV_INSN.  If you get a single 
one, it must be a JUMP_INSN.  Better return NULL and abort the 
optimization if you get anything other than a jump pattern/insn.

>>> +  NEXT_INSN (new_insn) = new_insn;
>>> +  PREV_INSN (new_insn) = new_insn;
>>
>> Why?
> 
> H mm. I should had to place a comment. This is not a trivial
> solution. The algorithm creates some temporary insns which
> are used to measure the initial costs ('compute_init_costs'
> function), but the cost computation only works for valid insns.
> So we need to decorate the temporary insns to look like valid.

If you're only computing costs you shouldn't need anything other than a 
pattern.
Hmm, let me see if I understand all this correctly.  It goes through 
compute_rtx_cost, which in turn tries to look it up in a hash table 
using compute_hash, which looks at PREV_INSN.  In fact, with the patch 
it'll now loop through the same insn for HASHED_INSN times?
At the end it'll call get_attr_length which is likely to be unreliable 
for a newly generated indirect jump using a pseudo.  Won't that cause a 
problem once get_attr_length accesses INSN_ADDRESSES for the new insn?
I still don't see why it needs NEXT_INSN/PREV_INSN.

> It is conservative approach. The 'get_indirect_jump_insn_no'
> function returns the result of 'recog_memoized' which could
> return with negative value.

An expander like gen_indirect_jump isn't supposed to produce an invalid 
insn if the inputs match the predicates.  If really you want the sanity 
check, put a gcc_unreachable in there - that way we'll know immediately 
when something isn't as it should be.

>>> @@ -1411,7 +1662,7 @@ rtl_seqabstr (void)
>>>  static bool
>>>  gate_rtl_seqabstr (void)
>>>  {
>>> -  return flag_rtl_seqabstr;
>>> +  return flag_rtl_seqabstr && optimize_size;
>>>  }
>>
>>
>> This doesn't look right, why prevent people from using -O2 
>> -frtl-seqabstr?  Not part of the bugfix either.
> 
> Maybe this is not the part of jump register bugfix, but it
> is also important. We have a small discussion about cost
> computing of the algorithm earlier. The final conclusion was
> that the abstraction doesn't run when -Os isn't specified.
> Please see the following threads:
> - http://gcc.gnu.org/ml/gcc-patches/2005-12/threads.html#00988
> - http://gcc.gnu.org/ml/gcc-patches/2006-01/threads.html#00331

Ah.  It helps to repeat these things when submitting a patch to prevent 
the reviewer from having to guess the purpose of a change.  This part is 
ok separately, although there is room for improvement - we really should 
be able to estimate insn lengths at all times, even with -O2.


Bernd



More information about the Gcc-patches mailing list