[Bug rtl-optimization/95787] New: Complete lack of optimization on assignment to some types when followed by
gabravier at gmail dot com
gcc-bugzilla@gcc.gnu.org
Sat Jun 20 17:00:49 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95787
Bug ID: 95787
Summary: Complete lack of optimization on assignment to some
types when followed by
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: gabravier at gmail dot com
Target Milestone: ---
extern unsigned short a;
int f()
{
a = 0;
return 0;
}
With -O3, LLVM outputs this :
f(): # @f()
mov word ptr [rip + a], 0
xor eax, eax
ret
GCC outputs this :
f():
xor eax, eax
mov WORD PTR a[rip], ax
xor eax, eax
ret
GCC has the same problem for every single architecture, the final tree
representation looks like this :
;; Function f (_Z1fv, funcdef_no=1, decl_uid=4740, cgraph_uid=2,
symbol_order=1)
f ()
{
<bb 2> [local count: 1073741824]:
a = 0;
return 0;
}
And the final RTL representation looks like this :
;; Function f (_Z1fv, funcdef_no=1, decl_uid=4740, cgraph_uid=2,
symbol_order=1)
f
Dataflow summary:
;; fully invalidated by EH 0 [ax] 1 [dx] 2 [cx] 4 [si] 5 [di] 8 [st] 9
[st(1)] 10 [st(2)] 11 [st(3)] 12 [st(4)] 13 [st(5)] 14 [st(6)] 15 [st(7)] 17
[flags] 18 [fpsr] 20 [xmm0] 21 [xmm1] 22 [xmm2] 23 [xmm3] 24 [xmm4] 25 [xmm5]
26 [xmm6] 27 [xmm7] 28 [mm0] 29 [mm1] 30 [mm2] 31 [mm3] 32 [mm4] 33 [mm5] 34
[mm6] 35 [mm7] 36 [r8] 37 [r9] 38 [r10] 39 [r11] 44 [xmm8] 45 [xmm9] 46 [xmm10]
47 [xmm11] 48 [xmm12] 49 [xmm13] 50 [xmm14] 51 [xmm15] 52 [xmm16] 53 [xmm17] 54
[xmm18] 55 [xmm19] 56 [xmm20] 57 [xmm21] 58 [xmm22] 59 [xmm23] 60 [xmm24] 61
[xmm25] 62 [xmm26] 63 [xmm27] 64 [xmm28] 65 [xmm29] 66 [xmm30] 67 [xmm31] 68
[k0] 69 [k1] 70 [k2] 71 [k3] 72 [k4] 73 [k5] 74 [k6] 75 [k7]
;; hardware regs used 7 [sp]
;; regular block artificial uses 7 [sp]
;; eh block artificial uses 7 [sp] 16 [argp]
;; entry block defs 0 [ax] 1 [dx] 2 [cx] 4 [si] 5 [di] 7 [sp] 20 [xmm0] 21
[xmm1] 22 [xmm2] 23 [xmm3] 24 [xmm4] 25 [xmm5] 26 [xmm6] 27 [xmm7] 36 [r8] 37
[r9]
;; exit block uses 0 [ax] 7 [sp]
;; regs ever live 0 [ax] 17 [flags]
;; ref usage r0={3d,3u} r1={1d} r2={1d} r4={1d} r5={1d} r7={1d,2u} r17={2d}
r20={1d} r21={1d} r22={1d} r23={1d} r24={1d} r25={1d} r26={1d} r27={1d}
r36={1d} r37={1d}
;; total ref usage 25{20d,5u,0e} in 5{5 regular + 0 call} insns.
(note 1 0 14 NOTE_INSN_DELETED)
(note 14 1 16 2 [bb 2] NOTE_INSN_BASIC_BLOCK)
(note 16 14 2 2 NOTE_INSN_PROLOGUE_END)
(note 2 16 22 2 NOTE_INSN_FUNCTION_BEG)
(insn 22 2 23 2 (parallel [
(set (reg:SI 0 ax)
(const_int 0 [0]))
(clobber (reg:CC 17 flags))
]) "./example.cpp":27:7 67 {*movsi_xor}
(expr_list:REG_UNUSED (reg:CC 17 flags)
(nil)))
(insn 23 22 24 2 (set (mem/c:HI (symbol_ref:DI ("a") [flags 0x40] <var_decl
0x7f9720202cf0 a>) [1 a+0 S2 A16])
(reg:HI 0 ax)) "./example.cpp":27:7 76 {*movhi_internal}
(expr_list:REG_DEAD (reg:HI 0 ax)
(nil)))
(insn 24 23 11 2 (parallel [
(set (reg:DI 0 ax)
(const_int 0 [0]))
(clobber (reg:CC 17 flags))
]) "./example.cpp":29:1 68 {*movdi_xor}
(expr_list:REG_UNUSED (reg:CC 17 flags)
(nil)))
(insn 11 24 25 2 (use (reg/i:SI 0 ax)) "./example.cpp":29:1 -1
(nil))
(note 25 11 18 2 NOTE_INSN_EPILOGUE_BEG)
(jump_insn 18 25 19 2 (simple_return) "./example.cpp":29:1 819
{simple_return_internal}
(nil)
-> simple_return)
(barrier 19 18 13)
(note 13 19 0 NOTE_INSN_DELETED)
So it looks like this is a problem with RTL (it explicitly sets a register to 0
and sets `a` to that register).
More information about the Gcc-bugs
mailing list