On Fri, Mar 28, 2014 at 8:48 AM, Saswat Padhi <saswat.sou...@gmail.com> wrote:
>
> I am Saswat Padhi, a final year undergraduate at IIT Bombay, India.
> With help from the GCC Resource Center here, I am currently investing
> possible improvements to GCC Machine Descriptions, with a goal of
> making them concise and composable.
>
> One of the improvements we were looking at is, reducing the C code
> fragments within the define_expand constructs in the machine
> descriptions. In some of the define_expands we observed that the C
> code fragments implement the same checks which can equivalently be
> achieved through the use of constraints. So, we thought that
> introducing constraints-validation at the expander level could be
> useful. An example of change we are proposing, is illustrated below:
>
> (define_expand "movsi"
> [(set (match_operand:SI 0 "nonimmediate_operand" "")
> (match_operand:SI 1 "general_operand" "")
> )]
> ""
> { if(GET_CODE(operands[0])==MEM && GET_CODE(operands[1])!=REG)
> { if(can_create_pseudo_p())
> { operands[1]=force_reg(SImode,operands[1]); }
> }})
>
> With the expander handling the constraints, the above define_expand
> can be written as:
>
> (define_expand "movsi"
> [(set (match_operand:SI 0 "nonimmediate_operand" "=r,m,r,r")
> (match_operand:SI 1 "general_operand" "r,r,i,m")
> )]
> ""
> )
>
> This concise define_expand expression would achieve the desired effect
> because when the first operand matches the second constraint
> alternative [m], the second operand would be force_reg into the second
> alternative [r]. All other cases are also explicitly mentioned as
> alternative constraints.
>
> As a first step towards this, I prepared this report
> (https://docs.google.com/document/d/1Yb5b3-r4YfxEL0omvAqqGFGIYLLeMenn-EHQvSHgKUw/edit)
> which is a survey of the define_expand expressions in i386 and MIPS
> machine descriptions. But as the report explains, the results of the
> survey do not appear in our favor. We see very few define_expands
> where we can actually replace some parts of the C code by introducing
> constraint validation in the expander.
>
> I seek feedback from the community regarding:
> 1. Is the idea is worth pursuing? In other words, would we be able to
> reduce significant amount of C code from the GCC MDs by introducing
> constraint validation at expander?
>
> 2. If answer to (1) is yes, do the parameters mentioned in the report
> make sense? We use 3 parameters to estimate whether we would be able
> to simplify a define_expand by removing at least a part of the C code.
>
> 3. If the answer to (2) is yes, why don't we see any gain in i386 and
> MIPS MDs? Then are there other cases where the gain would be
> significant?
>
> Thank you in advance for your time and help :-)



Your result matches my intuition, which is that it wouldn't help much.
For simple cases where contraints can carry the load, a named pattern
can simply be a define_insn.  For complex cases, constraints can not
carry the load.  We are left with a bit of a middle-ground, where
constraints can help but there is still general work to be done in the
define_expand body.  I don't think that middle ground is very large.

Ian

Reply via email to