* [Bug middle-end/97968] [9/10/11/12 Regression] Unnecessary mov instruction with comparison and cmov
2020-11-24 15:19 [Bug rtl-optimization/97968] New: Unnecessary mov instruction with comparison and cmov denis.campredon at gmail dot com
@ 2021-09-01 7:50 ` pinskia at gcc dot gnu.org
2021-09-19 23:15 ` pinskia at gcc dot gnu.org
` (8 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: pinskia at gcc dot gnu.org @ 2021-09-01 7:50 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97968
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Known to fail| |11.1.0, 8.1.0
Known to work| |7.1.0
Ever confirmed|0 |1
Component|rtl-optimization |middle-end
Keywords| |ra
Last reconfirmed| |2021-09-01
Summary|Unnecessary mov instruction |[9/10/11/12 Regression]
|with comparison and cmov |Unnecessary mov instruction
| |with comparison and cmov
Status|UNCONFIRMED |NEW
Severity|normal |enhancement
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
So looking into this, I think this is a register allocation issue. We produce:
(insn 23 6 2 2 (set (reg:SI 87)
(reg:SI 5 di [ n ])) "/app/example.cpp":3:1 75 {*movsi_internal}
(expr_list:REG_DEAD (reg:SI 5 di [ n ])
(nil)))
(insn 2 23 24 2 (set (reg/v:SI 83 [ n ])
(reg:SI 87)) "/app/example.cpp":3:1 75 {*movsi_internal}
(expr_list:REG_DEAD (reg:SI 87)
(nil)))
(insn 24 2 3 2 (set (reg:SI 88)
(reg:SI 4 si [ j ])) "/app/example.cpp":3:1 75 {*movsi_internal}
(expr_list:REG_DEAD (reg:SI 4 si [ j ])
(nil)))
(note 3 24 4 2 NOTE_INSN_DELETED)
(note 4 3 20 2 NOTE_INSN_FUNCTION_BEG)
(insn 20 4 25 2 (set (reg:CCGC 17 flags)
(compare:CCGC (reg/v:SI 83 [ n ])
(reg:SI 88))) "/app/example.cpp":4:18 11 {*cmpsi_1}
(expr_list:REG_DEAD (reg:SI 88)
(nil)))
(insn 25 20 22 2 (set (reg:SI 86)
(const_int 0 [0])) "/app/example.cpp":4:18 75 {*movsi_internal}
(expr_list:REG_EQUIV (const_int 0 [0])
(nil)))
(insn 22 25 17 2 (set (reg/v:SI 83 [ n ])
(if_then_else:SI (gt (reg:CCGC 17 flags)
(const_int 0 [0]))
(reg/v:SI 83 [ n ])
(reg:SI 86))) "/app/example.cpp":4:18 1140 {*movsicc_noc}
(expr_list:REG_DEAD (reg:SI 86)
(expr_list:REG_DEAD (reg:CCGC 17 flags)
(nil))))
(insn 17 22 18 2 (set (reg/i:SI 0 ax)
(reg/v:SI 83 [ n ])) "/app/example.cpp":5:1 75 {*movsi_internal}
(expr_list:REG_DEAD (reg/v:SI 83 [ n ])
(nil)))
But we tie the input to the movsicc_noc to the output early on with reg 83.
that means we select 83 to be ax which means emitting a move early on instead
of selecting 86 as ax and having the second 83 be ax.
Now it looks in GCC 7 we got this before RA:
(insn 26 27 17 2 (set (reg:SI 87 [ <retval> ])
(if_then_else:SI (gt (reg:CCGC 17 flags)
(const_int 0 [0]))
(reg/v:SI 88 [ n ])
(reg:SI 91))) "/app/example.cpp":4 968 {*movsicc_noc}
(expr_list:REG_DEAD (reg:SI 91)
(expr_list:REG_DEAD (reg/v:SI 88 [ n ])
(expr_list:REG_DEAD (reg:CCGC 17 flags)
(nil)))))
(insn 17 26 18 2 (set (reg/i:SI 0 ax)
(reg:SI 87 [ <retval> ])) "/app/example.cpp":5 82 {*movsi_internal}
(expr_list:REG_DEAD (reg:SI 87 [ <retval> ])
(nil)))
The change looks like is the way we expand the code from gimple to RTL. In post
GCC 8, we tie right away the return value to the register which holds n and
move 0 into n.
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Bug middle-end/97968] [9/10/11/12 Regression] Unnecessary mov instruction with comparison and cmov
2020-11-24 15:19 [Bug rtl-optimization/97968] New: Unnecessary mov instruction with comparison and cmov denis.campredon at gmail dot com
2021-09-01 7:50 ` [Bug middle-end/97968] [9/10/11/12 Regression] " pinskia at gcc dot gnu.org
@ 2021-09-19 23:15 ` pinskia at gcc dot gnu.org
2021-09-19 23:16 ` pinskia at gcc dot gnu.org
` (7 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: pinskia at gcc dot gnu.org @ 2021-09-19 23:15 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97968
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Target Milestone|--- |9.5
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Bug middle-end/97968] [9/10/11/12 Regression] Unnecessary mov instruction with comparison and cmov
2020-11-24 15:19 [Bug rtl-optimization/97968] New: Unnecessary mov instruction with comparison and cmov denis.campredon at gmail dot com
2021-09-01 7:50 ` [Bug middle-end/97968] [9/10/11/12 Regression] " pinskia at gcc dot gnu.org
2021-09-19 23:15 ` pinskia at gcc dot gnu.org
@ 2021-09-19 23:16 ` pinskia at gcc dot gnu.org
2022-01-21 13:25 ` rguenth at gcc dot gnu.org
` (6 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: pinskia at gcc dot gnu.org @ 2021-09-19 23:16 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97968
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |gabravier at gmail dot com
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
*** Bug 98303 has been marked as a duplicate of this bug. ***
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Bug middle-end/97968] [9/10/11/12 Regression] Unnecessary mov instruction with comparison and cmov
2020-11-24 15:19 [Bug rtl-optimization/97968] New: Unnecessary mov instruction with comparison and cmov denis.campredon at gmail dot com
` (2 preceding siblings ...)
2021-09-19 23:16 ` pinskia at gcc dot gnu.org
@ 2022-01-21 13:25 ` rguenth at gcc dot gnu.org
2022-01-21 15:20 ` denis.campredon at gmail dot com
` (5 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2022-01-21 13:25 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97968
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Severity|enhancement |normal
Priority|P3 |P2
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Bug middle-end/97968] [9/10/11/12 Regression] Unnecessary mov instruction with comparison and cmov
2020-11-24 15:19 [Bug rtl-optimization/97968] New: Unnecessary mov instruction with comparison and cmov denis.campredon at gmail dot com
` (3 preceding siblings ...)
2022-01-21 13:25 ` rguenth at gcc dot gnu.org
@ 2022-01-21 15:20 ` denis.campredon at gmail dot com
2022-05-27 9:43 ` [Bug middle-end/97968] [10/11/12/13 " rguenth at gcc dot gnu.org
` (4 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: denis.campredon at gmail dot com @ 2022-01-21 15:20 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97968
--- Comment #3 from denis.campredon at gmail dot com ---
This seems to be fixed for gcc12, unlike the code from pr-98303
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Bug middle-end/97968] [10/11/12/13 Regression] Unnecessary mov instruction with comparison and cmov
2020-11-24 15:19 [Bug rtl-optimization/97968] New: Unnecessary mov instruction with comparison and cmov denis.campredon at gmail dot com
` (4 preceding siblings ...)
2022-01-21 15:20 ` denis.campredon at gmail dot com
@ 2022-05-27 9:43 ` rguenth at gcc dot gnu.org
2022-06-28 10:42 ` jakub at gcc dot gnu.org
` (3 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2022-05-27 9:43 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97968
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Target Milestone|9.5 |10.4
--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
GCC 9 branch is being closed
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Bug middle-end/97968] [10/11/12/13 Regression] Unnecessary mov instruction with comparison and cmov
2020-11-24 15:19 [Bug rtl-optimization/97968] New: Unnecessary mov instruction with comparison and cmov denis.campredon at gmail dot com
` (5 preceding siblings ...)
2022-05-27 9:43 ` [Bug middle-end/97968] [10/11/12/13 " rguenth at gcc dot gnu.org
@ 2022-06-28 10:42 ` jakub at gcc dot gnu.org
2023-07-07 10:38 ` [Bug middle-end/97968] [11/12/13/14 " rguenth at gcc dot gnu.org
` (2 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: jakub at gcc dot gnu.org @ 2022-06-28 10:42 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97968
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Target Milestone|10.4 |10.5
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
GCC 10.4 is being released, retargeting bugs to GCC 10.5.
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Bug middle-end/97968] [11/12/13/14 Regression] Unnecessary mov instruction with comparison and cmov
2020-11-24 15:19 [Bug rtl-optimization/97968] New: Unnecessary mov instruction with comparison and cmov denis.campredon at gmail dot com
` (6 preceding siblings ...)
2022-06-28 10:42 ` jakub at gcc dot gnu.org
@ 2023-07-07 10:38 ` rguenth at gcc dot gnu.org
2023-07-13 21:12 ` pinskia at gcc dot gnu.org
2024-03-10 23:11 ` [Bug middle-end/97968] [11 " law at gcc dot gnu.org
9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2023-07-07 10:38 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97968
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Target Milestone|10.5 |11.5
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
GCC 10 branch is being closed.
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Bug middle-end/97968] [11/12/13/14 Regression] Unnecessary mov instruction with comparison and cmov
2020-11-24 15:19 [Bug rtl-optimization/97968] New: Unnecessary mov instruction with comparison and cmov denis.campredon at gmail dot com
` (7 preceding siblings ...)
2023-07-07 10:38 ` [Bug middle-end/97968] [11/12/13/14 " rguenth at gcc dot gnu.org
@ 2023-07-13 21:12 ` pinskia at gcc dot gnu.org
2024-03-10 23:11 ` [Bug middle-end/97968] [11 " law at gcc dot gnu.org
9 siblings, 0 replies; 11+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-07-13 21:12 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97968
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |needs-bisection
Known to work| |13.1.0
--- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
In GCC 13+ we produce:
f:
xorl %eax, %eax
cmpl %esi, %edi
cmovg %edi, %eax
ret
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Bug middle-end/97968] [11 Regression] Unnecessary mov instruction with comparison and cmov
2020-11-24 15:19 [Bug rtl-optimization/97968] New: Unnecessary mov instruction with comparison and cmov denis.campredon at gmail dot com
` (8 preceding siblings ...)
2023-07-13 21:12 ` pinskia at gcc dot gnu.org
@ 2024-03-10 23:11 ` law at gcc dot gnu.org
9 siblings, 0 replies; 11+ messages in thread
From: law at gcc dot gnu.org @ 2024-03-10 23:11 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97968
Jeffrey A. Law <law at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Summary|[11/12/13/14 Regression] |[11 Regression] Unnecessary
|Unnecessary mov instruction |mov instruction with
|with comparison and cmov |comparison and cmov
CC| |law at gcc dot gnu.org
--- Comment #8 from Jeffrey A. Law <law at gcc dot gnu.org> ---
Per c#3 and c#7.
^ permalink raw reply [flat|nested] 11+ messages in thread