https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94980
rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |ASSIGNED
Assignee|unassigned at gcc dot gnu.org |rsandifo at gcc dot
gnu.org
--- Comment #2 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org>
---
Mine. Looks like the problem was latent before. The testcase
ends up using vector boolean types with 2-bit element types.
Before that patch we computed the TYPE_SIZE of the vector type as:
TYPE_SIZE (type) = int_const_binop (MULT_EXPR,
TYPE_SIZE (innertype),
bitsize_int (nunits));
where the TYPE_SIZE of the boolean is 8 bits. So the TYPE_SIZE
of the vector was 4*8 == 32 bits, even though the TYPE_SIZE_UNIT
was only 1 byte. This meant that the BIT_FIELD_REFs passed the
tree-cfg.c checks but led to incorrect rtl:
;; _13 = { -1, -1, -1, -1 };
(insn 18 17 0 (set (reg:QI 92 [ _13 ])
(const_int 15 [0xf])) "/tmp/pr94980.c":6:17 -1
(nil))
;; _14 = BIT_FIELD_REF <_13, 8, 8>;
(insn 19 18 20 (set (mem/c:QI (plus:DI (reg/f:DI 77 virtual-stack-vars)
(const_int -4 [0xfffffffffffffffc])) [2 S1 A8])
(reg:QI 92 [ _13 ])) "/tmp/pr94980.c":6:17 -1
(nil))
(insn 20 19 0 (set (reg:QI 93 [ _14 ])
(mem/c:QI (plus:DI (reg/f:DI 77 virtual-stack-vars)
(const_int -3 [0xfffffffffffffffd])) [0 S1 A8]))
"/tmp/pr94980.c":6:17 -1
(nil))
where the last insn reads back uninitialised memory.