define_peepholes in mn10300

Jeff Law law@redhat.com
Mon Oct 18 12:51:00 GMT 2010


  On 08/09/10 07:28, Steven Bosscher wrote:
> Hi Jeff,
>
> I'm looking at the remaining text peepholes (define_peephole instead
> of define_peephole2) and I have a few questions about mn10300, that
> you are a maintainer of.
I've been out on FMLA, so sorry for the late response...

> The first peephole is this:
>
> ;; Try to combine consecutive updates of the stack pointer (or any
> ;; other register for that matter).
> (define_peephole
>    [(set (match_operand:SI 0 "register_operand" "=dxay")
>          (plus:SI (match_dup 0)
>                   (match_operand 1 "const_int_operand" "")))
>     (set (match_dup 0)
>          (plus:SI (match_dup 0)
>                   (match_operand 2 "const_int_operand" "")))]
>    ""
>    "*
> {
>    operands[1] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[1]));
>    return \"add %1,%0\";
> }"
>    [(set_attr "cc" "clobber")])
>
> It seems to me that we have the CSA pass for this
> (combine-stack-adj.c). Maybe not for the "or any other register" part,
> but that should never happen anyway, or one of the CSE passes has not
> done its job properly. The peephole appears to pre-date the CSA pass.
> I would like to eliminate this define_peephole. Do you agree? If so,
> what would be sufficient testing for you to accept a patch that
> removes this peephole?
That peephole almost certainly pre-dates CSA; it's at least a decade or 
more old.  I have no idea if it ever triggered for other registers, 
supporting them was trivial and most likely an afterthought once I had 
the peephole eliminating useless SP adjustments.

One could even question if it was ever terribly important for SP 
adjustments given the mn103 is an ACCUMULATE_OUTGOING_ARGS machine.  
Though I'm certain I wouldn't have written the peephole without seeing 
code which would clearly benefit.

When the mn103 port was first developed, the primary concern was 
codesize and I most often used the runtime libraries (newlib/libstdc++) 
to tune as I didn't have any customer code to benchmark at the time.  So 
ISTM a build of newlib/libstdc++ with an abort placed in the C-code 
section of the peephole ought to be sufficient to determine it doesn't 
trigger.

>
> The second question is about the remaining define_peepholes, that all
> look more-or-less alike. Here is the first one:
>
> (define_peephole
>    [(set (cc0) (compare (match_operand:SI 0 "register_operand" "dx")
>                         (const_int 0)))
>     (set (pc) (if_then_else (ge (cc0) (const_int 0))
>                             (match_operand 1 "" "")
>                             (pc)))]
>    "dead_or_set_p (ins1, operands[0])&&  REG_OK_FOR_INDEX_P (operands[0])"
>    "add %0,%0\;bcc %1"
>    [(set_attr "cc" "clobber")])
>
>
> As far as I understand, the REG_OK_FOR_INDEX_P check is redundant:
>
> * The constraints "dx" require a data register or an extended register
>
> * REG_OK_FOR_INDEX_P(X) during peephoel is equivalent to
> REGNO_STRICT_OK_FOR_INDEX_P(X,REG_STRICT)
> * REGNO_STRICT_OK_FOR_INDEX_P requires REGNO_DATA_P or REGNO_EXTENDED_P.
>
> So the constrains should already make sure that REG_OK_FOR_INDEX_P is valid.
> Am I missing something?
I don't think you're missing anything.  Your logic appears sound.

> I would like to convert these remaining define_peepholes to
> define_peephole2s instead. However, I can't find a define_insn that
> produces the bcs or bcc instructions. Could use a little help figuring
> out what insn I should generate in the peephole2.
It's been a long time since I dealt with this aspect of porting, but 
isn't it the case that most ports don't expose branch-on-carry-set 
branch-on-carry-clear?   It looks like the mn103 was recently changed to 
not use cc0, which is definitely a good thing.  I'm not sure offhand the 
best way to recode this optimization in that new world.

Jeff



More information about the Gcc mailing list