https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93150
Bug ID: 93150
Summary: (A&N) == CST1 &( ((A&M)==CST2) | ((A&O)==CST3) ) is
not simplified
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: enhancement
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: pinskia at gcc dot gnu.org
Target Milestone: ---
(x&N) == CST1 & ( ((x&M)==CST2) | ((x&O)==CST3) )
Should be simplified into:
((x&(N|M)) == (CST1|CST2)) | ((x&(N|O)==(CST1|CST3))
Note this can be done for all &/| and ==/!= .
That is:
(for bitop1 (bit_and bit_or)
bitop2 (bit_or bit_and)
(for cmp (eq ne)
(simplify
(bitop1:c
(cmp (bit_and @0 INTEGER_CST@N) INTEGER_CST@CST1)
(bitop2
(cmp (bit_and @0 INTEGER_CST@N) INTEGER_CST@CST2)
(cmp (bit_and @0 INTEGER_CST@N) INTEGER_CST@CST3)))
....