[Bug c/34668] [4.3 Regression] ICE in find_compatible_field with -combine
jakub at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Fri Jan 4 15:50:00 GMT 2008
------- Comment #7 from jakub at gcc dot gnu dot org 2008-01-04 15:17 -------
This is a problem during inlining.
The call actually has &optab_table argument:
<addr_expr 0x2aaaae9035c0
type <pointer_type 0x2aaaaea1e600
type <record_type 0x2aaaaea1e300 optab type_0 SI ... > ...>
arg 0 <var_decl 0x2aaaae9e8280 optab_table
type <array_type 0x2aaaaea1ef00 type <record_type 0x2aaaaea1ecc0 optab>
... >
and two different optab RECORD_TYPEs are involved (one from each CU).
These types are types_compatible_p (0x2aaaaea1e300, 0x2aaaaea1ecc0), but
not are not equal. copy_body_r calls
699 *tp = fold_indirect_ref_1 (type, new);
700 if (! *tp)
701 {
702 if (TREE_CODE (new) == ADDR_EXPR)
703 *tp = TREE_OPERAND (new, 0);
here, but as the
/* *(foo *)&fooarray => fooarray[0] */
transformation is done only if the types are equal, this isn't folded into
&optab_table[0] and so inlining creates optab_table.code COMPONENT_REF, where
its first argument is not a record/union/qual union.
Either we change fold_indirect_ref_1 to do its transformations whenever
types_compatible_p (type1, type2) rather than just type1 == type2, or if that's
too expensive IMHO at least copy_body_r should do that.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34668
More information about the Gcc-bugs
mailing list