limiting call clobbered registers for library functions

Paul Shortis pshortis@dataworx.com.au
Thu Feb 5 10:42:00 GMT 2015


On 03/02/15 09:14, Joern Rennecke wrote:
> On 2 February 2015 at 21:54, Paul Shortis <pshortis@dataworx.com.au> wrote:
>> I could have avoided the expander and used a single instruction pattern for
>> a)b)c) if if could have found a way to have alternative dependent clobbers
>> in an instruction pattern. I investigated attributes but couldn't see how I
>> would be able to achieve what I needed. Also tried clobber (match_dup 2) but
>> when one of the alternatives has a constant for operands[2] the clobber is
>> accepted silently by the .md compiler but doesn't actually clobber the
>> non-constant alternatives.
> You can clobber one or more match_scratch with suitable constraint alternatives
> and let the register allocator / reload reserve the hard registers.
> Well, not really for cc, you'll just have to say you clobber it, and
> split away the
> unused clobber post-reload.
> That will not really give you less source code, but more uniform patterns
> prior to register allocation.  That gives the rtl optimizers a better
> handle on the code.
> The effect is even more pronounced when you replace all hard register usage with
> pseudo register usage and appropriate constraints.
>
Thanks Joern,

That was one of the (many) things I had tried, but I couldn't get 
it to work & moved on. Your post caused to to try again, and it 
worked perfectly and I now need just a single pattern and no 
expander.

I do howeverhave one remaining issue.

The pattern I'm using is ...

(define_insn "<hiShiftName>hi3"
   [(set (match_operand:WORD 0 "register_operand" "=r,C,C")
             (hiShiftOperator:WORD (match_operand:WORD 1 
"register_operand"  "0,0,0")
                                   (match_operand:WORD 2 
"rhs_operand" "M,i,D")))
     (clobber (reg:CC_NOOV CC_REGNUM))
     (clobber (match_scratch:HI 3 "=X,X,D"))
   ]
   ""
"..."
   [(set_attr "length" "2,8,8")]
)

the r/M constraint pair is for shifts small enough to perform in 
line ( M == const_int 1...3)

register constraints C and D are for the registers used for the 
library calls

At first I used the first two registers normally used for 
function calls (r1 and r2), however when building the libgcc et 
al I occasionally encounter the situation where a register in the 
R1_CLASS (constraint C) can't be allocated.

I changed these two registers to the two last GPRs in the 
allocation order and made them call clobbered and I can at least 
compile libgcc and newlib.

Could I be doing something better, or is this expected behaviour ?

Paul.



More information about the Gcc mailing list