On 09/20/2013 07:31 PM, Wei Mi wrote: > Here is a bug in google branch which couldn't be reproduced in trunk. > But I think the same problem could probably exist in trunk too, just > havn't been exposed. I havn't created a small testcase successfully so > just describe the bug here and ask for suggestions to fix it. > > compiler error we met: > internal compiler error: Max. number of generated reload insns per > insn is achieved (90) > > In 1.cc.210r.ira, we saw a paradoxical subreg below. > > insn 5 4 7 2 (set (reg:TI 106 [ __comp ]) > (subreg:TI (reg:DI 107 [ __comp ]) 0)) 518.cc:203 85 > {*movti_internal_rex64} > (nil)) > > In IRA phase, > r106's allocno is TImode and it is allocated hardreg R13 in IRA. > r107's allocno is DImode because the paradoxical subreg is not > considered in IRA, and it is allocated hardreg R15. > > movti_internal_rex64's insn template is: > > (define_insn "*movti_internal_rex64" > [(set (match_operand:TI 0 "nonimmediate_operand" "=!r ,o ,x,x ,m") > (match_operand:TI 1 "general_operand" "riFo,re,C,xm,x"))] > "TARGET_64BIT && !(MEM_P (operands[0]) && MEM_P (operands[1]))" > > In insn template, movti_internal_rex64's operand1 is of TImode (It is > different with r107 allocno's mode in IRA). process_alt_operands in > lra_constraints finds in in_hard_reg_set_p(...) that hardreg R15 could > not be paired with other reg (R15 is the last x8664 GENERAL_REG) to > save the TImode data , so for the first alternative, r107 requires a > reload insn. > > 1.c.211r.reload: > alt=0,overall=6,losers=1,rld_nregs=2 > alt=1,overall=9,losers=1 -- reject > alt=2,overall=13,losers=2 -- reject > alt=3,overall=13,losers=2 -- reject > alt=4,overall=9,losers=1 -- reject > Choosing alt 0 in insn 5: (0) =r (1) riFo {*movti_internal_rex64} > > The reload insn 195 below generated before insn 5 has the same pattern > with insn 5, so LRA will insert another reload insn for insn195 again, > which produces an endless loop... > That is why we meet the error "Max. number of generated reload insns > per insn is achieved (90)". > > (insn 195 4 5 2 (set (reg:TI 181) > (subreg:TI (reg:DI 107 [ __comp ]) 0)) 518.cc:203 85 > {*movti_internal_rex64} > (nil)) > > So I think the cause of the problem is that IRA uses r107's mode > (DImode) instead of using the paradoxical subreg mode (TImode). > > Questions: > 1. Any insight where to fix it? What I can imagine is either to change > r107 allocno's mode to be TImode in IRA, or loosen the check in > process_alt_operands in LRA? > 2. When I was trying to create a small testcase to reproduce the > problem, I can get one producing the same paradoxical subreg as above, > but it is hard to control IRA to allocate r107 above just to hardreg > R15 (Only in that case the error will happen). Any suggestion to > achieve it? > > Sorry, I was away since Friday.
Yes, one place it can be fixed is in IRA. You should look at ira-color.c::assign_hard_reg. Using the biggest mode of paradoxical subregs of the pseudo can exclude assigning r15. The patch will be not-trivial as it should take endianess into account. I did not figure out yet should be it fixed in LRA too. Reload and LRA were alwasy based that the global RA assigned the right hard-regs. I can fix it by myself if you can wait for about 1 month. I am quite busy with many things until end of stage1.