insn does not satisfy its constraints

Boris Boesler baembel@gmx.de
Thu Oct 4 09:14:00 GMT 2007


Hi

Am 02.10.2007 um 20:02 schrieb Rask Ingemann Lambertsen:

> On Tue, Oct 02, 2007 at 02:50:50PM +0200, Boris Boesler wrote:
>
>    What does the .lreg dump file (-fdump-rtl-lreg) say about  
> register costs?

Pass 0

   Register 101 costs: Rx_REGS:1000 Ax_REGS:0 GENERAL_REGS:1000  
ALL_REGS:1000 MEM:4000

   Register 96 pref Rx_REGS or none
   Register 97 pref Rx_REGS or none
   Register 98 pref Rx_REGS or none
   Register 99 pref Rx_REGS or none
   Register 100 pref Rx_REGS or none
   Register 101 pref Ax_REGS, else Rx_REGS
102 registers.
[8<]

Register 101 used 2 times across 2 insns in block 3; set 1 time; pref  
Ax_REGS, else Rx_REGS; pointer.

  Register 101 is the important one. And it says prefer Ax; but it  
worries be that the costs for Ax is 0. Does this mean the value is  
placed in an Ax register or does it mean it is impossible to place  
the value in a Ax register?

.lreg continues (insn 8 will be important later):

(insn 7 5 8 3 (set (reg/f:SI 101)
         (symbol_ref:SI ("c") <var_decl 0x41695360 c>)) 79 {movsi} (nil)
     (nil))

(insn 8 7 9 3 (set (mem/c/i:SI (reg/f:SI 101) [0 c+0 S4 A32])
         (const_int 4711 [0x1267])) 79 {movsi} (nil)
     (expr_list:REG_DEAD (reg/f:SI 101)
         (nil)))


>> add_var.c:20: error: insn does not satisfy its constraints:
>> ...
>>  The error happens, because GO_IF_LEGITIMATE_ADDRESS (strict
>> version) detects, that a data register is used like an address
>> register - that's illegal! (BASE_REG_CLASS is defined to Ax_REGS)
>
>    GO_IF_LEGITIMATE_ADDRESS() must reject addresses which use hard  
> registers
> of the wrong class. Even when !REG_OK_STRICT.

  Ok, I check the registers in any case: now I can' compile anything!

const_assign.c:19: error: unrecognizable insn:
(insn 9 8 10 3 (set (mem/c/i:SI (reg/f:SI 102) [0 c+0 S4 A32])
         (const_int 4711 [0x1267])) -1 (nil)
     (nil))
const_assign.c:19: internal compiler error: in extract_insn, at  
recog.c:2077


  The .unshare file:

(insn 7 5 8 3 (set (reg/f:SI 101)
         (symbol_ref:SI ("c") <var_decl 0x41695360 c>)) -1 (nil)
     (nil))

(insn 8 7 9 3 (set (reg/f:SI 102)
         (reg/f:SI 101)) -1 (nil)
     (nil))

(insn 9 8 10 3 (set (mem/c/i:SI (reg/f:SI 102) [0 c+0 S4 A32])
         (const_int 4711 [0x1267])) -1 (nil)
     (nil))

insn 7: load a symbol reference into a register 101
insn 8: copy register 101 to register 102
insn 9: store constant

  If I check my "movm" insn (in previous mail) then I notice that  
there no <m,i> alternative. But even if I add this alternative the  
compiler fails as well :-(

  This is all confusing...

  Thanks for ANY advice on writing GCC back-ends

Boris



More information about the Gcc-help mailing list