https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93565
Bug ID: 93565
Summary: Combine duplicates count trailing zero instructions
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: wilco at gcc dot gnu.org
Target Milestone: ---
Created attachment 47777
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=47777&action=edit
ctz_duplication
The attached example causes Combine to duplicate count trailing zero
instructions on targets which have CTZ_DEFINED_VALUE = 2:
f:
cbz x0, .L2
rbit x2, x0
rbit x0, x0
clz x2, x2
clz x0, x0
ldr w2, [x1, x2, lsl 2]
orr w0, w2, w0
str w0, [x1]
.L2:
mov x0, 0
ret
The cause is Combine deciding to merge CTZ into a sign-extend:
(insn 10 9 12 3 (set (reg:DI 100)
(ctz:DI (reg/v:DI 98 [ x ]))) "ctz2.c":17:15 689 {ctzdi2}
(expr_list:REG_DEAD (reg/v:DI 98 [ x ])
(nil)))
(insn 12 10 14 3 (set (reg:DI 101 [ _9 ])
(sign_extend:DI (subreg:SI (reg:DI 100) 0))) "ctz2.c":25:15 104
{*extendsidi2_aarch64}
(nil))
allowing combination of insns 10 and 12
original costs 4 + 4 = 8
replacement costs 4 + 4 = 8
modifying insn i2 10: r100:DI=ctz(r98:DI)
deferring rescan insn with uid = 10.
modifying insn i3 12: r101:DI=ctz(r98:DI)
REG_DEAD r98:DI
(insn 10 9 12 3 (set (reg:DI 100)
(ctz:DI (reg/v:DI 98 [ x ]))) "ctz2.c":17:15 689 {ctzdi2}
(nil))
(insn 12 10 14 3 (set (reg:DI 101 [ _9 ])
(ctz:DI (reg/v:DI 98 [ x ]))) "ctz2.c":25:15 689 {ctzdi2}
(expr_list:REG_DEAD (reg/v:DI 98 [ x ])
(nil)))
Later passes then seem unable to CSE the two identical CTZ instructions...
This doesn't seem right - if Combine can optimize the sign-extend away then
there is no point in duplicating the CTZ.