[Bug rtl-optimization/50101] GCC 4.5 and 4.6 generate suboptimal code on ppc for countdown loops when the CTR register cannot be used

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Thu Aug 18 09:01:00 GMT 2011


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50101

--- Comment #7 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-08-18 08:58:28 UTC ---
(In reply to comment #3)
> (In reply to comment #2)
> > I suppose the CTR is introduced after RA in machine-dependent reorg?  In which
> > case can the issue be fixed on branches by adjusting register cost of the CTR?
> 
> No, the pattern would normally allocate the CTR, and has options to fall back
> to register, and memory.  According to the comments in the source, because it
> is a JUMP_INSN, it has to provide reloads from memory in case it can't find a
> register.  Previously, GCC was able to allocate a register, but now it doesn't
> seem to.
> 
> Here is the pattern from rs6000.md:
> 
> ;; We need to be able to do this for any operand, including MEM, or we
> ;; will cause reload to blow up since we don't allow output reloads on
> ;; JUMP_INSNs.
> ;; For the length attribute to be calculated correctly, the
> ;; label MUST be operand 0.
> 
> (define_insn "*ctr<mode>_internal1"
>   [(set (pc)
>     (if_then_else (ne (match_operand:P 1 "register_operand" "c,*r,*r,*r")
>               (const_int 1))
>               (label_ref (match_operand 0 "" ""))
>               (pc)))
>    (set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*q*c*l")
>     (plus:P (match_dup 1)
>          (const_int -1)))
>    (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
>    (clobber (match_scratch:P 4 "=X,X,&r,r"))]
>   ""
>   "*
> {
>   if (which_alternative != 0)
>     return \"#\";
>   else if (get_attr_length (insn) == 4)
>     return \"{bdn|bdnz} %l0\";
>   else
>     return \"bdz $+8\;b %l0\";
> }"
>   [(set_attr "type" "branch")
>    (set_attr "length" "*,12,16,16")])
> 
> I will upload the rtl dump files as attachments.

Did you try pessimizing the non-ctr reg alternatives (and the memory
alternative even more)?  Like adding ! to the non-ctr alternatives
and ? to the memory one?  Not sure if those markers are looked at
by IRA though.



More information about the Gcc-bugs mailing list