public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "jakub at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug rtl-optimization/96264] [10/11 Regression] wrong code with -Os -fno-forward-propagate -fschedule-insns -fno-tree-ter
Date: Thu, 11 Feb 2021 19:01:02 +0000	[thread overview]
Message-ID: <bug-96264-4-SgNQamKc7Z@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-96264-4@http.gcc.gnu.org/bugzilla/>

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96264

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |ra
                 CC|                            |vmakarov at gcc dot gnu.org

--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
And on the current trunk I see similar thing, looking for "ca)" in *.ira and
*.reload dumps shows:
(insn 30 750 32 2 (parallel [
            (set (reg:DI 247)
                (ashiftrt:DI (reg:DI 119 [ _15 ])
                    (const_int 63 [0x3f])))
            (clobber (reg:DI 98 ca))
        ]) "pr96264.c":12:20 281 {ashrdi3}
     (expr_list:REG_UNUSED (reg:DI 98 ca)
        (nil)))
(insn 32 30 87 2 (parallel [
            (set (reg:DI 540 [ _22 ])
                (minus:DI (reg:DI 538 [ _19 ])
                    (reg:DI 119 [ _15 ])))
            (set (reg:DI 98 ca)
                (leu:DI (reg:DI 119 [ _15 ])
                    (reg:DI 538 [ _19 ])))
        ]) "pr96264.c":12:12 104 {subfdi3_carry}
     (expr_list:REG_DEAD (reg:DI 538 [ _19 ])
        (nil)))
(insn 87 32 86 2 (parallel [
            (set (reg:HI 277)
                (vec_select:HI (reg:V8HI 129 [ _36 ])
                    (parallel [
                            (const_int 4 [0x4])
                        ])))
            (clobber (reg:V8HI 2668))
        ]) "pr96264.c":13:10 1365 {*vsx_extract_v8hi_p8}
     (expr_list:REG_UNUSED (reg:V8HI 2668)
        (nil)))
(insn 86 87 33 2 (set (reg:V8HI 135 [ _42 ])
        (plus:V8HI (reg:V8HI 259 [ _41 ])
            (reg:V8HI 273))) "pr96264.c":13:15 1614 {addv8hi3}
     (expr_list:REG_DEAD (reg:V8HI 259 [ _41 ])
        (nil)))
(insn 33 86 751 2 (parallel [
            (set (reg:DI 541 [ _22+8 ])
                (plus:DI (plus:DI (not:DI (reg:DI 247))
                        (reg:DI 98 ca))
                    (reg:DI 539 [ _19+8 ])))
            (clobber (reg:DI 98 ca))
        ]) "pr96264.c":12:12 108 {*subfdi3_carry_in_internal}
     (expr_list:REG_DEAD (reg:DI 539 [ _19+8 ])
        (expr_list:REG_DEAD (reg:DI 98 ca)
            (expr_list:REG_UNUSED (reg:DI 98 ca)
                (nil)))))
...
(insn 34 216 763 2 (parallel [
            (set (reg:DI 544 [ _26 ])
                (minus:DI (reg:DI 542 [ _23 ])
                    (reg:DI 119 [ _15 ])))
            (set (reg:DI 98 ca)
                (leu:DI (reg:DI 119 [ _15 ])
                    (reg:DI 542 [ _23 ])))
        ]) "pr96264.c":12:12 104 {subfdi3_carry}
     (expr_list:REG_DEAD (reg:DI 542 [ _23 ])
        (nil)))
(insn 763 34 221 2 (set (reg:DI 543 [ _23+8 ])
        (mem/j/c:DI (plus:DI (reg/f:DI 244)
                (const_int 8 [0x8])) [1 BIT_FIELD_REF <f, 128, 128>+8 S8 A64]))
"pr96264.c":12:12 636 {*movdi_internal64}
     (expr_list:REG_DEAD (reg/f:DI 244)
        (nil)))
(insn 221 763 768 2 (set (reg:DI 189 [ _96 ])
        (zero_extend:DI (subreg:HI (reg:SI 384) 0))) "pr96264.c":13:10 11
{zero_extendhidi2}
     (expr_list:REG_DEAD (reg:SI 384)
        (nil)))
(insn 768 221 35 2 (parallel [
            (set (mem/c:DI (plus:DI (reg/f:DI 110 sfp)
                        (const_int 352 [0x160])) [1  S8 A128])
                (reg:DI 544 [ _26 ]))
            (set (reg/f:DI 525)
                (plus:DI (reg/f:DI 110 sfp)
                    (const_int 352 [0x160])))
        ]) "pr96264.c":12:12 644 {movdi_di_update}
     (expr_list:REG_DEAD (reg:DI 544 [ _26 ])
        (nil)))
(insn 35 768 226 2 (parallel [
            (set (reg:DI 545 [ _26+8 ])
                (plus:DI (plus:DI (not:DI (reg:DI 247))
                        (reg:DI 98 ca))
                    (reg:DI 543 [ _23+8 ])))
            (clobber (reg:DI 98 ca))
        ]) "pr96264.c":12:12 108 {*subfdi3_carry_in_internal}
     (expr_list:REG_DEAD (reg:DI 543 [ _23+8 ])
        (expr_list:REG_DEAD (reg:DI 98 ca)
            (expr_list:REG_UNUSED (reg:DI 98 ca)
                (expr_list:REG_EQUIV (mem/c:DI (plus:DI (reg/f:DI 525)
                            (const_int 8 [0x8])) [1  S8 A64])
                    (nil))))))
...
(insn 36 141 761 2 (parallel [
            (set (reg:DI 548 [ _30 ])
                (minus:DI (reg:DI 546 [ _27 ])
                    (reg:DI 119 [ _15 ])))
            (set (reg:DI 98 ca)
                (leu:DI (reg:DI 119 [ _15 ])
                    (reg:DI 546 [ _27 ])))
        ]) "pr96264.c":12:12 104 {subfdi3_carry}
     (expr_list:REG_DEAD (reg:DI 546 [ _27 ])
        (nil)))
(insn 761 36 146 2 (set (reg:DI 547 [ _27+8 ])
        (mem/j/c:DI (plus:DI (reg/f:DI 242)
                (const_int 8 [0x8])) [1 BIT_FIELD_REF <f, 128, 256>+8 S8 A64]))
"pr96264.c":12:12 636 {*movdi_internal64}
     (expr_list:REG_DEAD (reg/f:DI 242)
        (nil)))
(insn 146 761 770 2 (set (reg:DI 159 [ _66 ])
        (zero_extend:DI (subreg:HI (reg:SI 324) 0))) "pr96264.c":13:10 11
{zero_extendhidi2}
     (expr_list:REG_DEAD (reg:SI 324)
        (nil)))
(insn 770 146 37 2 (parallel [
            (set (mem/c:DI (plus:DI (reg/f:DI 110 sfp)
                        (const_int 368 [0x170])) [1  S8 A128])
                (reg:DI 548 [ _30 ]))
            (set (reg/f:DI 526)
                (plus:DI (reg/f:DI 110 sfp)
                    (const_int 368 [0x170])))
        ]) "pr96264.c":12:12 644 {movdi_di_update}
     (expr_list:REG_DEAD (reg:DI 548 [ _30 ])
        (nil)))
(insn 37 770 151 2 (parallel [
            (set (reg:DI 549 [ _30+8 ])
                (plus:DI (plus:DI (not:DI (reg:DI 247))
                        (reg:DI 98 ca))
                    (reg:DI 547 [ _27+8 ])))
            (clobber (reg:DI 98 ca))
        ]) "pr96264.c":12:12 108 {*subfdi3_carry_in_internal}
     (expr_list:REG_DEAD (reg:DI 547 [ _27+8 ])
        (expr_list:REG_DEAD (reg:DI 98 ca)
            (expr_list:REG_UNUSED (reg:DI 98 ca)
                (expr_list:REG_EQUIV (mem/c:DI (plus:DI (reg/f:DI 526)
                            (const_int 8 [0x8])) [1  S8 A64])
                    (nil))))))
...
(insn 38 201 759 2 (parallel [
            (set (reg:DI 552 [ _34 ])
                (minus:DI (reg:DI 550 [ _31 ])
                    (reg:DI 119 [ _15 ])))
            (set (reg:DI 98 ca)
                (leu:DI (reg:DI 119 [ _15 ])
                    (reg:DI 550 [ _31 ])))
        ]) "pr96264.c":12:12 104 {subfdi3_carry}
     (expr_list:REG_DEAD (reg:DI 550 [ _31 ])
        (expr_list:REG_DEAD (reg:DI 119 [ _15 ])
            (nil))))
(insn 759 38 206 2 (set (reg:DI 551 [ _31+8 ])
        (mem/j/c:DI (plus:DI (reg/f:DI 240)
                (const_int 8 [0x8])) [1 BIT_FIELD_REF <f, 128, 384>+8 S8 A64]))
"pr96264.c":12:12 636 {*movdi_internal64}
     (expr_list:REG_DEAD (reg/f:DI 240)
        (nil)))
(insn 206 759 96 2 (set (reg:DI 183 [ _90 ])
        (zero_extend:DI (subreg:HI (reg:SI 372) 0))) "pr96264.c":13:10 11
{zero_extendhidi2}
     (expr_list:REG_DEAD (reg:SI 372)
        (nil)))
(insn 96 206 101 2 (set (reg:DI 139 [ _46 ])
        (zero_extend:DI (subreg:HI (reg:SI 284) 0))) "pr96264.c":13:10 11
{zero_extendhidi2}
     (expr_list:REG_DEAD (reg:SI 284)
        (nil)))
(insn 101 96 772 2 (set (reg:DI 141 [ _48 ])
        (zero_extend:DI (subreg:HI (reg:SI 288) 0))) "pr96264.c":13:10 11
{zero_extendhidi2}
     (expr_list:REG_DEAD (reg:SI 288)
        (nil)))
(insn 772 101 39 2 (parallel [
            (set (mem/c:DI (plus:DI (reg/f:DI 110 sfp)
                        (const_int 384 [0x180])) [1  S8 A128])
                (reg:DI 552 [ _34 ]))
            (set (reg/f:DI 527)
                (plus:DI (reg/f:DI 110 sfp)
                    (const_int 384 [0x180])))
        ]) "pr96264.c":12:12 644 {movdi_di_update}
     (expr_list:REG_DEAD (reg:DI 552 [ _34 ])
        (nil)))
(insn 39 772 106 2 (parallel [
            (set (reg:DI 553 [ _34+8 ])
                (plus:DI (plus:DI (not:DI (reg:DI 247))
                        (reg:DI 98 ca))
                    (reg:DI 551 [ _31+8 ])))
            (clobber (reg:DI 98 ca))
        ]) "pr96264.c":12:12 108 {*subfdi3_carry_in_internal}
     (expr_list:REG_DEAD (reg:DI 551 [ _31+8 ])
        (expr_list:REG_DEAD (reg:DI 247)
            (expr_list:REG_DEAD (reg:DI 98 ca)
                (expr_list:REG_UNUSED (reg:DI 98 ca)
                    (expr_list:REG_EQUIV (mem/c:DI (plus:DI (reg/f:DI 527)
                                (const_int 8 [0x8])) [1  S8 A64])
                        (nil)))))))

and that is all, and it looks good, the >> 63 shift clobbers ca and then there
is always a pair of subfdi3_carry that sets it and subfdi3_carry_in_internal
that consumes it.
But in *.reload, one can see:
    Inserting rematerialization insn before:
 3404: {r2707:DI=r119:DI>>0x3f;clobber ca:DI;}
...
(insn 30 750 3289 2 (parallel [
            (set (reg:DI 9 9 [247])
                (ashiftrt:DI (reg:DI 8 8 [orig:119 _15 ] [119])
                    (const_int 63 [0x3f])))
            (clobber (reg:DI 98 ca))
        ]) "pr96264.c":12:20 281 {ashrdi3}
     (nil))
(insn 3289 30 32 2 (set (mem/c:DI (plus:DI (reg/f:DI 1 1)
                (const_int 544 [0x220])) [3 %sfp+544 S8 A64])
        (reg:DI 9 9 [247])) "pr96264.c":12:20 636 {*movdi_internal64}
     (nil))
(insn 32 3289 3290 2 (parallel [
            (set (reg:DI 9 9 [orig:540 _22 ] [540])
                (minus:DI (reg:DI 7 7 [orig:538 _19 ] [538])
                    (reg:DI 8 8 [orig:119 _15 ] [119])))
            (set (reg:DI 98 ca)
                (leu:DI (reg:DI 8 8 [orig:119 _15 ] [119])
                    (reg:DI 7 7 [orig:538 _19 ] [538])))
        ]) "pr96264.c":12:12 104 {subfdi3_carry}
     (nil))
(insn 3290 32 87 2 (set (mem/c:DI (plus:DI (reg/f:DI 1 1)
                (const_int 528 [0x210])) [3 %sfp+528 S8 A64])
        (reg:DI 9 9 [orig:540 _22 ] [540])) "pr96264.c":12:12 636
{*movdi_internal64}
     (nil))
(insn 87 3290 86 2 (parallel [
            (set (reg:HI 31 31 [277])
                (vec_select:HI (reg:V8HI 64 0 [orig:129 _36 ] [129])
                    (parallel [
                            (const_int 4 [0x4])
                        ])))
            (clobber (reg:V8HI 74 10 [2668]))
        ]) "pr96264.c":13:10 1365 {*vsx_extract_v8hi_p8}
     (nil))
(insn 86 87 3404 2 (set (reg:V8HI 76 12 [orig:135 _42 ] [135])
        (plus:V8HI (reg:V8HI 76 12 [orig:259 _41 ] [259])
            (reg:V8HI 75 11 [273]))) "pr96264.c":13:15 1614 {addv8hi3}
     (nil))
(insn 3404 86 3292 2 (parallel [
            (set (reg:DI 9 9 [247])
                (ashiftrt:DI (reg:DI 8 8 [orig:119 _15 ] [119])
                    (const_int 63 [0x3f])))
            (clobber (reg:DI 98 ca))
        ]) "pr96264.c":12:12 281 {ashrdi3}
     (nil))
(note 3292 3404 33 2 NOTE_INSN_DELETED)
(insn 33 3292 3291 2 (parallel [
            (set (reg:DI 9 9 [orig:541 _22+8 ] [541])
                (plus:DI (plus:DI (not:DI (reg:DI 9 9 [247]))
                        (reg:DI 98 ca))
                    (reg:DI 6 6 [orig:539 _19+8 ] [539])))
            (clobber (reg:DI 98 ca))
        ]) "pr96264.c":12:12 108 {*subfdi3_carry_in_internal}
     (nil))
...
In *.ira, there was just one >> 63 before all these TImode subtractions using
carry, but it seems LRA rematerialized the right shift instead of loading it
from memory even when it clobbers the ca register that is live at that point.

  parent reply	other threads:[~2021-02-11 19:01 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-21 11:00 [Bug rtl-optimization/96264] New: " zsojka at seznam dot cz
2020-07-21 14:20 ` [Bug rtl-optimization/96264] " rguenth at gcc dot gnu.org
2020-07-23  6:51 ` rguenth at gcc dot gnu.org
2020-07-23 10:56 ` marxin at gcc dot gnu.org
2020-10-12 12:44 ` rguenth at gcc dot gnu.org
2021-02-11 14:45 ` seurer at gcc dot gnu.org
2021-02-11 14:46 ` seurer at gcc dot gnu.org
2021-02-11 14:49 ` seurer at gcc dot gnu.org
2021-02-11 15:49 ` rguenth at gcc dot gnu.org
2021-02-11 16:00 ` jakub at gcc dot gnu.org
2021-02-11 16:19 ` seurer at gcc dot gnu.org
2021-02-11 18:43 ` jakub at gcc dot gnu.org
2021-02-11 19:01 ` jakub at gcc dot gnu.org [this message]
2021-02-17 15:47 ` vmakarov at gcc dot gnu.org
2021-02-18 22:51 ` cvs-commit at gcc dot gnu.org
2021-02-19 16:34 ` seurer at gcc dot gnu.org
2021-02-19 19:29 ` bergner at gcc dot gnu.org
2021-02-19 20:20 ` seurer at gcc dot gnu.org
2021-03-30 19:02 ` [Bug rtl-optimization/96264] [10 " bergner at gcc dot gnu.org
2021-03-30 21:33 ` vmakarov at gcc dot gnu.org
2021-03-31  7:16 ` rguenth at gcc dot gnu.org
2021-03-31 12:55 ` vmakarov at gcc dot gnu.org
2021-03-31 12:58 ` tnfchris at gcc dot gnu.org
2021-03-31 16:53 ` cvs-commit at gcc dot gnu.org
2021-03-31 16:57 ` vmakarov at gcc dot gnu.org
2021-03-31 20:01 ` seurer 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-96264-4-SgNQamKc7Z@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: 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).