Hi,

For a private target that i am porting in GCC 4.5 I have the following
pattern in my md file for call value:


(define_insn "call_value_op"
  [(set (match_operand 0 "register_operand" "=da")
        (call (mem:QI (match_operand:QI 1 "call_operand" "Wd"))
              (match_operand:QI 2 "" "")))]
  ""
  "jsr\\t%1"
  [(set_attr "slottable" "has_slot")]
)

All the constraints are one letter constraints for my target. Here 'W'
is for symbol_ref and all others are register constraints. So for a
particular combination when operand 0 is 'a' and operand 1 is 'W' i
got the following ICE :

error: unable to generate reloads for:
(call_insn 11 4 12 2 test.c:7 (set (reg:QI 12 as0)
        (call (mem:QI (symbol_ref:QI ("malloc") [flags 0x41]
<function_decl 0x2b5733ff3600 __builtin_malloc>) [0 S1 A32])
            (const_int 0 [0x0]))) 50 {call_value_op}
(expr_list:REG_DEAD (reg:QI 0 g0)
        (expr_list:REG_EH_REGION (const_int 0 [0x0])
            (nil)))
    (expr_list:REG_DEP_TRUE (use (reg:QI 0 g0))
        (nil)))

I get this ICE because the constraints are not matched properly. I ICE
goes away when i write the constraints as:

"=ad", "Wd"

or

"a,a,d,d," , "W,W,d,d"

So i have the following questions:

1. Why is that constraints are not matched here?
2. When can i combine the constrains?

Regards,
Shafi

Reply via email to