[Bug tree-optimization/82192] [5/6/7/8 Regression] gcc produces incorrect code with -O2 and bit-field
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Sep 13 10:16:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82192
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Priority|P2 |P3
Component|rtl-optimization |tree-optimization
--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
On the trunk, I believe the first invalid transformation is when we subst:
(insn 14 10 15 2 (parallel [
(set (reg:HI 102)
(and:HI (subreg:HI (reg:SI 98) 0)
(const_int 8191 [0x1fff])))
(clobber (reg:CC 17 flags))
]) "pr82192-2.c":7 391 {*andhi_1}
(expr_list:REG_DEAD (reg:SI 98)
(expr_list:REG_UNUSED (reg:CC 17 flags)
(nil))))
from (reg:SI 98) to
(lshiftrt:SI (subreg:SI (reg:DI 94 [ a ]) 0)
(subreg:QI (reg:SI 97) 0))
we generate:
(parallel [
(set (subreg:DI (reg:HI 102) 0)
(zero_extract:DI (reg:DI 94 [ a ])
(const_int 13 [0xd])
(zero_extend:SI (subreg:QI (reg:SI 97) 0))))
(clobber (reg:CC 17 flags))
])
which is not the same thing if (subreg:QI (reg:SI 97) 0) is ever bigger than 32
- 13 - such as for the case when at runtime it is 31. For the original
lshiftrt + and, say if (reg:DI 94) is all ones, for shift count 31 we get 1,
while for the zero_extract 0x1fff, similarly for shift count 29 we get 7, while
for the zero_extract 0x1fff. If we have a guarantee that the shift count is
smaller or equal than 32 - 13, then the expressions are equivalent.
More information about the Gcc-bugs
mailing list