On 09/24/14 01:05, Ilya Enkovich wrote:
However, we've still got the problem that the RTL you've generated is
ill-formed.  If I understand things correctly, the assignments are the
result of the call, that should be modeled by having the destination be a
PARALLEL as mentioned earlier.

OK. Will try it. BTW call_value_pop patterns have two sets. One for
returned value and one for stack register. How comes it differs much
from what I do with bound regs?
The semantics of a PARALLEL are that all the values used in the expressions are evaluated, then all the side effects are performed. So:

(define_insn "*call_pop"
  [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lmBz"))
         (match_operand 1))
   (set (reg:SI SP_REG)
        (plus:SI (reg:SI SP_REG)
                 (match_operand:SI 2 "immediate_operand" "i")))]
  "!TARGET_64BIT && !SIBLING_CALL_P (insn)"
  "* return ix86_output_call_insn (insn, operands[0]);"
  [(set_attr "type" "call")])

According to the semantics of a PARALLEL would indicate that the reference to SP_REG on the RHS of the 2nd assignment expression takes the value of SP_REG *prior to the call*. And those are the semantics we depend on.


So in your case the RHS references to BND0_REG and BND1_REG use the values *before* the call -- and I don't think that's the semantics you want. You might get away with it because of the UNSPEC wrapping, but IMHO, it's still ill-formed RTL.

jeff


Reply via email to