How to recognize registers after reload ?.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello all,

I have an issue with my custom compiler back-end after reload.

1. The machine has move-instructions that can do following:
   a. From register file to (register indirect offset) or to register file.
   b. From (register indirect offset), register file, immediate to register file

2. I have now 3 patterns to emit moves in the .md-file:

    1. movesi_internal_fromreg (from register file to memory or register file)     2. movesi_internal_toreg (from memory , immediate, register file to register file)     3. movesi : define_expand. It has C-code that analyses the operands and selects 1,2 or both.

Motivation for the split was problems with the "combine" step. Suppose following code:
    *a = 10.
    Even if my front_end (define_expand) splits this in
    r100 = 10
   *r101 = r100
   the combine step, if these is only one movesi_internal, willl group it again, to then find out
   there is no instruction pattern.

Now, it being split, it goes wrong during reload. The issue is, that the code of the define_expand is wrong. I there uses the tests (GET_CODE(operands[0,1]) == REG), and this is not correct any more. I mean, this evaluated true also for a register that the reload step knows needs to end up in memory.
Question :
  - What tests are there to find out an operand is intended to be a pseudo in memory, and not a register ?.
  - What is a register, especially during reload ?.
    The issue is the movesi_internal_fromreg:

(define_insn "movsi_internal_fromreg"
  [(set (match_operand:SI 0 "memoryIndirect_or_reg" "r,MemInd,r"
          (match_operand:SI 1 "gpc_reg_operand" "r,r,           MemInd"))]
""
..

Please note the MemInd qualifier on the second line, at the end.
  - When I add this, the reload goes fine.
  - Without it, it gets in an endless loop. The backend is called with the "from" operand      actually a pseudo on the stack, and this is incorrectly recognized as a register.   - In my opinion, it needs to be solved by changing the "define_expand" for "movsi", so that it     recognizes the variable on the stack, and calls the other instruction : "movsi_internal_toreg".
    Only I dont know how to recognize the stackvar.

Best Regards,

Henri.




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux