Paul Schlie <[EMAIL PROTECTED]> writes:

> > From: Denis Chertykov <[EMAIL PROTECTED]>
> >> Paul Schlie <[EMAIL PROTECTED]> writes:
> >>> Denis wrote:
> >>> I have converted the AVR port from CC0 to CCmode.
> >>> But may be I have converted the port in wrong way.
> >>> (It's because I was interested in *this* way.)
> >>> 
> >>> I have used CCmode register and havn't added the
> >>> '(clobber (reg:QI CC_REGNUM))' to any insn that really clobber the
> >>> CC_REGNUM just because AVR is'n needed in scheduling.
> >>> I think that sequence of compare + cond-jump will exists in any
> >>> compiler pass.
> >>> The port was successfully tested without new regressions.
> >>> What do you (MAINTAINERS) think about this ?
> >> 
> >> Interesting:
> >> 
> >> - might you be able to post the resulting port files for review?
> > 
> > patch against cvs:
> > http://home.overta.ru/users/denisc/cc0-ccmode/cc0-ccmode.patch.gz
> > new port:
> > http://home.overta.ru/users/denisc/cc0-ccmode/avr.tgz
> 
> - Thank you, I've had the chance to review it to better understand.
> 
> >> - are you proposing that all conditional branches then required to be
> >>   explicitly paired with a corresponding immediately previous compare
> >>   instruction?
> > 
> > I founded that GCC isn't break cmp+jump sequences.
> > (My port havn't scheduling.)
> 
> - Maybe presently, but there's nothing in the machine description which
>   would seem to prohibit it either. (continued in following section)

As I know only scheduler can break cmp+jump.
AVR need not in any scheduling.

> >>   (if so, how is this a good thing observing that it's fairly typical
> >>   for most conditional branches to be naturally based on comparisons
> >>   against 0 resulting from the immediately preceding operation, which
> >>   would have otherwise not required an explicit compare?)
> > 
> > I think that it's not good.
> 
> - although I agree that there's likely a cleaner more consistent way to
>   accurately describe and track condition-code side-effects of AVR's ISA,
>   it seems that this approach actually inhibits GCC helping to optimize
>   the code, as too much information is being hidden from it?

I don't want to hide useful information. I want to ignore unusable.

For example: even i386 port (probably better port) isn't
"accurately describe and track condition-code side-effects"

Look at *addsi_1:

(define_insn "*addsi_1"
  [(set (match_operand:SI 0 "nonimmediate_operand" "=r,rm,r")
        (plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,r")
                 (match_operand:SI 2 "general_operand" "rmni,rni,lni")))
   (clobber (reg:CC FLAGS_REG))]
  "ix86_binary_operator_ok (PLUS, SImode, operands)"

FLAGS_REG just clobbered. It's not a true.
As I understand '(clobber (reg:CC FLAGS_REG))' needed only for
scheduling.
AVR havn't scheduling and I want to omit such clobbers, but I have
added special insns for optimization.

For example:

(define_insn "*subqi_3"
  [(set (reg CC_REGNUM)
        (compare (match_operand:QI 1 "register_operand" "0,0")
                 (match_operand:QI 2 "nonmemory_operand" "r,i")))
   (set (match_operand:QI 0 "nonimmediate_operand" "=r,d")
        (minus:QI (match_dup 1) (match_dup 2)))]
  "avr_match_ccmode (insn, CC_ZNmode)"



>   For example:
> 
>   It seems that by relying on peephole optimization to try to eliminate
>   otherwise redundant explicit expensive comparison operations on wider
>   than byte sized operands which were generated because multi-byte wide
>   operations don't expose their cc-mode side-effects, may not be a good
>   strategy?

I'm agree that may be better to split HImode comparision to
two QImode comparisions, but it's a next step. For this step you not
needed to change something outside HImode comparision.

> 
>   As it would seem that the initial hiding of this critical information
>   only inhibits GCC from being able to optimally (not to mention safely)
>   schedule basic block instruction sequences in an effort to eliminate
>   the necessity of otherwise relatively expensive multi-byte comparisons
>   to begin with. (Which would seem to be more optimal than relying on
>   no scheduling, and likely only catching some of the potential
>   opportunities to eliminate expensive compares after the fact?)

Ohhh. I'm probably understand you. Are you mean that better way for
splitting comparisions is
cmpHI, cbranch  ->  cmpQI1_and_set_CC, cbranch1, cmpQI2_and_use_CC, cbranch2 ?
In this case cmpQI1,cbranch1 may be in one basic block
and cmpQI2, cbranch2 in another. You right it's impossible without
"accurately describe and track condition-code side-effects".
If you (or any other) want to support such splitting then clobbers
must be added to insns.

I think that better to support
cmpHI, cbranch  ->  cmpQI1_set_CC, cmpQI2_use_CC, cbranch.
because AVR is a microcontroller and code size more important than code speed.

Denis.

Reply via email to