From: Henri Cloetens <henri.cloetens@blueice.be>
To: gcc-help <gcc-help@gcc.gnu.org>
Subject: How to recognize registers after reload ?.
Date: Thu, 22 Oct 2020 10:02:48 +0200 [thread overview]
Message-ID: <b9d8d08c-df41-08da-3a7a-994e9a7edd77@blueice.be> (raw)
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.
next reply other threads:[~2020-10-22 8:01 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-22 8:02 Henri Cloetens [this message]
2020-10-22 21:30 ` Jeff Law
2020-10-22 22:24 ` Segher Boessenkool
2020-10-22 23:47 ` Jeff Law
2020-10-23 7:28 ` Henri Cloetens
2020-10-23 7:35 ` AW: " Stefan Franke
2020-10-23 7:56 ` Henri Cloetens
2020-10-23 10:20 ` Segher Boessenkool
2020-10-23 11:38 ` Henri Cloetens
2020-10-23 10:02 ` Segher Boessenkool
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b9d8d08c-df41-08da-3a7a-994e9a7edd77@blueice.be \
--to=henri.cloetens@blueice.be \
--cc=gcc-help@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).