Unable to match an RTL pattern in new backend

nkavv@physics.auth.gr nkavv@physics.auth.gr
Mon Apr 28 09:46:00 GMT 2008

Hi friends

i'm in the process of writing a backend for a RISC target. I'm trying to keep
helper functions (in <target>.c) at minimal, since my future aim is to automate
(at least partially) the generation of the machine description.

While some C programs compile and simulate OK, it seems that i cannot match the
following RTL pattern. I should note here that it is generated as a result of
using a function argument for computing an address expression. That is
something like:

t_array[arg0] = t_1;

where t_array is a global array, arg0 is the function argument and t_1 is a
local variable.

#(insn 60 58 62 (set (mem/s/j:SI (plus:SI (reg:SI 4 $a0 [60])
#                (symbol_ref:SI ("queen") <var_decl 0x101a3690 queen>)) [0 queen
S4 A32])
#        (reg/v:SI 22 $s6 [orig:48 i ] [48])) 4 {*movsi_internal}
(insn_list:REG_DEP_TRUE 58 (nil))
#    (expr_list:REG_DEAD (reg:SI 4 $a0 [60])
#        (nil)))

since it cannot identified the address expression for this operation (store).
What does get emitted is:
	sw 	$s6, 	;# 60	*movsi_internal/2

The movsi_internal is as follows:

(define_insn "*movsi_internal"
  [(set (match_operand:SI 0 "nonimmediate_operand" "=r,m,r,r,r,m,r,r")
        (match_operand:SI 1 "general_operand" "m,r,r,z,e,S,S,i"))]
    lw \\t%0, %1
    sw \\t%1, %0             <--- matched pattern
    move \\t%0, %1
    move \\t%0, %1
    move \\t%0, %1
    move \\t%1, %0
    move \\t%0, %1
    li \\t%0, %1"
  [(set_attr "type"

Any help is appreciated

Kind regards

More information about the Gcc-help mailing list