public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
From: "klepikov.alex+bugs at gmail dot com" <gcc-bugzilla@gcc.gnu.org> To: gcc-bugs@gcc.gnu.org Subject: [Bug target/49263] SH Target: underutilized "TST #imm, R0" instruction Date: Sun, 28 May 2023 10:24:22 +0000 [thread overview] Message-ID: <bug-49263-4-I6txl8NYw2@http.gcc.gnu.org/bugzilla/> (raw) In-Reply-To: <bug-49263-4@http.gcc.gnu.org/bugzilla/> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49263 --- Comment #43 from Alexander Klepikov <klepikov.alex+bugs at gmail dot com> --- > > Thank you! I have an idea. If it's impossible to defer initial optimization, > > maybe it's possible to emit some intermediate insn and catch it and optimize > > later? > > This is basically what is supposed to be happening there already. Well, not really. Look what's happening during expand pass when 'ashrsi3' is expanding. Function 'expand_ashiftrt' is called and what it does at the end - it explicitly emits 3 insns: wrk = gen_reg_rtx (Pmode); //This one emit_move_insn (gen_rtx_REG (SImode, 4), operands[1]); sprintf (func, "__ashiftrt_r4_%d", value); rtx lab = function_symbol (wrk, func, SFUNC_STATIC).lab; //This one emit_insn (gen_ashrsi3_n (GEN_INT (value), wrk, lab)); //And this one emit_move_insn (operands[0], gen_rtx_REG (SImode, 4)); As far as I understand these insns could be catched later by a peephole and converted to 'tstsi_t' insn like it is done for other much simple insn sequences. What I'm thinkig about is to emit only one, say 'compound', insn. Which could be then splitted later somwhere in split pass to function call, to those 3 insns. I wrote test code that emits only one bogus insn. This insn expands to pure asm code. Of course, that asm code is invalid, because it is impossible to place a libcall label at the end of function with pure asm code injection. But then all what is could be coverted to 'tst', converts to 'tst'. And all pure right shifts converts to invalid asm code, of course. That's why I am thinking about possibility of emitting some intermediate insn at expand pass that will defer it real expanding. But I still don't know how to do it right and even if it is possible. By the way, right shift for integers expands to only one 'lshiftrt' insn and that's why it can be catched and converted to 'tst'. > > However, it's a bit of a dilemma. > > 1) If we don't have a dynamic shift insn and we smash the constant shift > into individual > stitching shifts early, it might open some new optimization opportunities, > e.g. by sharing intermediate shift results. Not sure though if that > actually happens in practice though. > > 2) Whether to use the dynamic shift insn or emit a function call or use > stitching shifts sequence, it all has an impact on register allocation and > other instruction use. This can be problematic during the course of RTL > optimization passes. > > 3) Even if we have a dynamic shift, sometimes it's more beneficial to emit a > shorter stitching shift sequence. Which one is better depends on the > surrounding code. I don't think there is anything good there to make the > proper choice. > > Some other shift related PRs: PR 54089, PR 65317, PR 67691, PR 67869, PR > 52628, PR 58017 Thank you for your time and detailed explanations! I agree with you on all points. Software cannot be perfect and it's OK for GCC not to be super optimized, so this part better sholud be left intact. By the way, I tried to link library to my project and I figured out that linker is smart enough to link only necessary library functions even without LTO. So increase in size is about 100 or 200 bytes, that is acceptable. Thank you very much for help!
next prev parent reply other threads:[~2023-05-28 10:24 UTC|newest] Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top 2011-06-01 20:17 [Bug target/49263] New: " oleg.endo@t-online.de 2011-06-01 20:42 ` [Bug target/49263] " oleg.endo@t-online.de 2011-06-12 23:12 ` kkojima at gcc dot gnu.org 2011-06-19 16:42 ` oleg.endo@t-online.de 2011-06-22 22:34 ` kkojima at gcc dot gnu.org 2011-06-26 22:31 ` oleg.endo@t-online.de 2011-06-27 5:15 ` kkojima at gcc dot gnu.org 2011-10-09 23:35 ` oleg.endo@t-online.de 2011-10-10 1:32 ` kkojima at gcc dot gnu.org 2011-10-10 23:48 ` oleg.endo@t-online.de 2011-10-11 1:47 ` kkojima at gcc dot gnu.org 2011-10-13 22:55 ` oleg.endo@t-online.de 2011-10-14 23:06 ` kkojima at gcc dot gnu.org 2011-10-15 2:33 ` kkojima at gcc dot gnu.org 2011-11-20 14:20 ` oleg.endo@t-online.de 2011-12-29 1:09 ` oleg.endo@t-online.de 2012-02-26 16:28 ` olegendo at gcc dot gnu.org 2012-02-26 23:29 ` olegendo at gcc dot gnu.org 2012-08-27 19:52 ` olegendo at gcc dot gnu.org 2012-10-28 22:02 ` olegendo at gcc dot gnu.org 2012-10-31 13:47 ` olegendo at gcc dot gnu.org 2013-12-08 13:47 ` olegendo at gcc dot gnu.org 2013-12-17 12:37 ` olegendo at gcc dot gnu.org 2014-12-30 18:45 ` olegendo at gcc dot gnu.org 2015-01-24 13:05 ` olegendo at gcc dot gnu.org 2015-01-26 23:57 ` olegendo at gcc dot gnu.org 2023-05-12 11:46 ` klepikov.alex+bugs at gmail dot com 2023-05-23 12:34 ` klepikov.alex+bugs at gmail dot com 2023-05-23 12:35 ` klepikov.alex+bugs at gmail dot com 2023-05-23 19:05 ` olegendo at gcc dot gnu.org 2023-05-24 11:40 ` klepikov.alex+bugs at gmail dot com 2023-05-24 11:57 ` olegendo at gcc dot gnu.org 2023-05-24 13:34 ` klepikov.alex+bugs at gmail dot com 2023-05-24 15:00 ` olegendo at gcc dot gnu.org 2023-05-25 17:53 ` klepikov.alex+bugs at gmail dot com 2023-05-25 21:32 ` olegendo at gcc dot gnu.org 2023-05-26 12:03 ` klepikov.alex+bugs at gmail dot com 2023-05-26 17:44 ` olegendo at gcc dot gnu.org 2023-05-28 10:24 ` klepikov.alex+bugs at gmail dot com [this message] 2023-05-28 10:48 ` olegendo at gcc dot gnu.org 2023-05-29 14:54 ` klepikov.alex+bugs at gmail dot com 2023-05-30 1:48 ` egallager at gcc dot gnu.org 2023-05-30 1:56 ` olegendo at gcc dot gnu.org 2023-05-30 12:42 ` klepikov.alex+bugs at gmail dot com 2023-05-30 19:57 ` olegendo at gcc dot gnu.org 2023-05-30 20:00 ` olegendo at gcc dot gnu.org
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=bug-49263-4-I6txl8NYw2@http.gcc.gnu.org/bugzilla/ \ --to=gcc-bugzilla@gcc.gnu.org \ --cc=gcc-bugs@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: linkBe 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).