+2017-02-07 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/79256
+ PR middle-end/79278
+ * builtins.c (get_object_alignment_2): Use min_align_of_type
+ to extract alignment for MEM_REFs to honor BIGGEST_FIELD_ALIGNMENT
+ and ADJUST_FIELD_ALIGN.
+
+ * doc/tm.texi.in (ADJUST_FIELD_ALIGN): Adjust to take additional
+ type parameter.
+ * doc/tm.texi: Regenerate.
+ * stor-layout.c (layout_decl): Adjust.
+ (update_alignment_for_field): Likewise.
+ (place_field): Likewise.
+ (min_align_of_type): Likewise.
+ * config/arc/arc.h (ADJUST_FIELD_ALIGN): Adjust.
+ * config/epiphany/epiphany.h (ADJUST_FIELD_ALIGN): Likewise.
+ * config/epiphany/epiphany.c (epiphany_adjust_field_align): Likewise.
+ * config/frv/frv.h (ADJUST_FIELD_ALIGN): Likewise.
+ * config/frv/frv.c (frv_adjust_field_align): Likewise.
+ * config/i386/i386.h (ADJUST_FIELD_ALIGN): Likewise.
+ * config/i386/i386.c (x86_field_alignment): Likewise.
+ * config/rs6000/aix.h (ADJUST_FIELD_ALIGN): Likewise.
+ * config/rs6000/darwin.h (ADJUST_FIELD_ALIGN): Likewise.
+ * config/rs6000/freebsd64.h (ADJUST_FIELD_ALIGN): Likewise.
+ * config/rs6000/linux64.h (ADJUST_FIELD_ALIGN): Likewise.
+ * config/rs6000/sysv4.h (ADJUST_FIELD_ALIGN): Likewise.
+ * config/rs6000/rs6000.c (rs6000_special_adjust_field_align_p):
+ Likewise.
+
+ Revert
+ 2017-01-30 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/79256
+ * targhooks.c (default_builtin_vector_alignment_reachable): Honor
+ BIGGEST_FIELD_ALIGNMENT and ADJUST_FIELD_ALIGN to fix up bogus
+ alignment on TYPE.
+
2017-02-07 Toma Tabacu <toma.tabacu@imgtec.com>
* config/mips/mips.c (mips_expand_builtin_insn): Convert the QImode
Do so only if get_pointer_alignment_1 did not reveal absolute
alignment knowledge and if using that alignment would
improve the situation. */
+ unsigned int talign;
if (!addr_p && !known_alignment
- && TYPE_ALIGN (TREE_TYPE (exp)) > align)
- align = TYPE_ALIGN (TREE_TYPE (exp));
+ && (talign = min_align_of_type (TREE_TYPE (exp)) * BITS_PER_UNIT)
+ && talign > align)
+ align = talign;
else
{
/* Else adjust bitpos accordingly. */
construct.
*/
-#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
-(TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode \
+#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \
+(TYPE_MODE (strip_array_types (TYPE)) == DFmode \
? MIN ((COMPUTED), 32) : (COMPUTED))
arrays-at-the-end-of-structs work, like for struct gcov_fn_info in
libgcov.c . */
unsigned
-epiphany_adjust_field_align (tree field, unsigned computed)
+epiphany_adjust_field_align (tree type, unsigned computed)
{
if (computed == 32
- && TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE)
+ && TREE_CODE (type) == ARRAY_TYPE)
{
- tree elmsz = TYPE_SIZE (TREE_TYPE (TREE_TYPE (field)));
+ tree elmsz = TYPE_SIZE (TREE_TYPE (type));
if (!tree_fits_uhwi_p (elmsz) || tree_to_uhwi (elmsz) >= 32)
return 64;
(SPECIFIED_ALIGN)) \
: MAX ((MANGLED_ALIGN), (SPECIFIED_ALIGN)))
-#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
- epiphany_adjust_field_align((FIELD), (COMPUTED))
+#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \
+ epiphany_adjust_field_align((TYPE), (COMPUTED))
\f
/* Layout of source language data types. */
frv_adjust_field_align (tree field, int computed)
{
/* Make sure that the bitfield is not wider than the type. */
- if (DECL_BIT_FIELD (field)
+ if (field
+ && DECL_BIT_FIELD (field)
&& !DECL_ARTIFICIAL (field))
{
tree parent = DECL_CONTEXT (field);
alignment computed in the usual way is COMPUTED. GCC uses this
value instead of the value in `BIGGEST_ALIGNMENT' or
`BIGGEST_FIELD_ALIGNMENT', if defined, for structure fields only. */
-#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
+#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \
frv_adjust_field_align (FIELD, COMPUTED)
#endif
}
int
-x86_field_alignment (tree field, int computed)
+x86_field_alignment (tree type, int computed)
{
machine_mode mode;
- tree type = TREE_TYPE (field);
if (TARGET_64BIT || TARGET_ALIGN_DOUBLE)
return computed;
#define BIGGEST_FIELD_ALIGNMENT 32
#endif
#else
-#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
- x86_field_alignment ((FIELD), (COMPUTED))
+#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \
+ x86_field_alignment ((TYPE), (COMPUTED))
#endif
/* If defined, a C expression to compute the alignment given to a
/* This now supports a natural alignment mode. */
/* AIX word-aligns FP doubles but doubleword-aligns 64-bit ints. */
-#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
+#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \
((TARGET_ALIGN_NATURAL == 0 \
- && TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode) \
+ && TYPE_MODE (strip_array_types (TYPE)) == DFmode) \
? MIN ((COMPUTED), 32) \
: (COMPUTED))
suppressed for vector and long double items (both 128 in size).
There is a dummy use of the FIELD argument to avoid an unused variable
warning (see PR59496). */
-#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
+#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \
((void) (FIELD), \
(TARGET_ALIGN_NATURAL \
? (COMPUTED) \
/* PowerPC64 Linux word-aligns FP doubles when -malign-power is given. */
#undef ADJUST_FIELD_ALIGN
-#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
- (rs6000_special_adjust_field_align_p ((FIELD), (COMPUTED)) \
+#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \
+ (rs6000_special_adjust_field_align_p ((TYPE), (COMPUTED)) \
? 128 \
: (TARGET_64BIT \
&& TARGET_ALIGN_NATURAL == 0 \
- && TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode) \
+ && TYPE_MODE (strip_array_types (TYPE)) == DFmode) \
? MIN ((COMPUTED), 32) \
: (COMPUTED))
/* PowerPC64 Linux word-aligns FP doubles when -malign-power is given. */
#undef ADJUST_FIELD_ALIGN
-#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
- (rs6000_special_adjust_field_align_p ((FIELD), (COMPUTED)) \
+#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \
+ (rs6000_special_adjust_field_align_p ((TYPE), (COMPUTED)) \
? 128 \
: (TARGET_64BIT \
&& TARGET_ALIGN_NATURAL == 0 \
- && TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode) \
+ && TYPE_MODE (strip_array_types (TYPE)) == DFmode) \
? MIN ((COMPUTED), 32) \
: (COMPUTED))
/* Previous GCC releases forced all vector types to have 16-byte alignment. */
bool
-rs6000_special_adjust_field_align_p (tree field, unsigned int computed)
+rs6000_special_adjust_field_align_p (tree type, unsigned int computed)
{
- if (TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
+ if (TARGET_ALTIVEC && TREE_CODE (type) == VECTOR_TYPE)
{
if (computed != 128)
{
/* An expression for the alignment of a structure field FIELD if the
alignment computed in the usual way is COMPUTED. */
-#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
- (rs6000_special_adjust_field_align_p ((FIELD), (COMPUTED)) \
+#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \
+ (rs6000_special_adjust_field_align_p ((TYPE), (COMPUTED)) \
? 128 : COMPUTED)
#undef BIGGEST_FIELD_ALIGNMENT
by the @code{__attribute__ ((aligned (@var{n})))} construct.
@end defmac
-@defmac ADJUST_FIELD_ALIGN (@var{field}, @var{computed})
-An expression for the alignment of a structure field @var{field} if the
-alignment computed in the usual way (including applying of
-@code{BIGGEST_ALIGNMENT} and @code{BIGGEST_FIELD_ALIGNMENT} to the
+@defmac ADJUST_FIELD_ALIGN (@var{field}, @var{type}, @var{computed})
+An expression for the alignment of a structure field @var{field} of
+type @var{type} if the alignment computed in the usual way (including
+applying of @code{BIGGEST_ALIGNMENT} and @code{BIGGEST_FIELD_ALIGNMENT} to the
alignment) is @var{computed}. It overrides alignment only if the
field alignment has not been set by the
-@code{__attribute__ ((aligned (@var{n})))} construct.
+@code{__attribute__ ((aligned (@var{n})))} construct. Note that @var{field}
+may be @code{NULL_TREE} in case we just query for the minimum alignment
+of a field of type @var{type} in structure context.
@end defmac
@defmac MAX_STACK_ALIGNMENT
by the @code{__attribute__ ((aligned (@var{n})))} construct.
@end defmac
-@defmac ADJUST_FIELD_ALIGN (@var{field}, @var{computed})
-An expression for the alignment of a structure field @var{field} if the
-alignment computed in the usual way (including applying of
-@code{BIGGEST_ALIGNMENT} and @code{BIGGEST_FIELD_ALIGNMENT} to the
+@defmac ADJUST_FIELD_ALIGN (@var{field}, @var{type}, @var{computed})
+An expression for the alignment of a structure field @var{field} of
+type @var{type} if the alignment computed in the usual way (including
+applying of @code{BIGGEST_ALIGNMENT} and @code{BIGGEST_FIELD_ALIGNMENT} to the
alignment) is @var{computed}. It overrides alignment only if the
field alignment has not been set by the
-@code{__attribute__ ((aligned (@var{n})))} construct.
+@code{__attribute__ ((aligned (@var{n})))} construct. Note that @var{field}
+may be @code{NULL_TREE} in case we just query for the minimum alignment
+of a field of type @var{type} in structure context.
@end defmac
@defmac MAX_STACK_ALIGNMENT
+2017-02-07 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/79256
+ PR middle-end/79278
+ * go-backend.c (go_field_alignment): Adjust.
+
2017-01-11 Than McIntosh <thanm@google.com>
* go-gcc.cc (conditional_expression): Add Bfunction parameter.
#endif
#ifdef ADJUST_FIELD_ALIGN
- {
- tree field ATTRIBUTE_UNUSED;
- field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL, t);
- v = ADJUST_FIELD_ALIGN (field, v);
- }
+ v = ADJUST_FIELD_ALIGN (NULL_TREE, t, v);
#endif
return v / BITS_PER_UNIT;
(unsigned) BIGGEST_FIELD_ALIGNMENT));
#endif
#ifdef ADJUST_FIELD_ALIGN
- SET_DECL_ALIGN (decl, ADJUST_FIELD_ALIGN (decl, DECL_ALIGN (decl)));
+ SET_DECL_ALIGN (decl, ADJUST_FIELD_ALIGN (decl, TREE_TYPE (decl),
+ DECL_ALIGN (decl)));
#endif
}
#ifdef ADJUST_FIELD_ALIGN
if (! TYPE_USER_ALIGN (type))
- type_align = ADJUST_FIELD_ALIGN (field, type_align);
+ type_align = ADJUST_FIELD_ALIGN (field, type, type_align);
#endif
/* Targets might chose to handle unnamed and hence possibly
#ifdef ADJUST_FIELD_ALIGN
if (! TYPE_USER_ALIGN (type))
- type_align = ADJUST_FIELD_ALIGN (field, type_align);
+ type_align = ADJUST_FIELD_ALIGN (field, type, type_align);
#endif
/* A bit field may not span more units of alignment of its type
#ifdef ADJUST_FIELD_ALIGN
if (! TYPE_USER_ALIGN (type))
- type_align = ADJUST_FIELD_ALIGN (field, type_align);
+ type_align = ADJUST_FIELD_ALIGN (field, type, type_align);
#endif
if (maximum_field_alignment != 0)
#endif
unsigned int field_align = align;
#ifdef ADJUST_FIELD_ALIGN
- tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, type);
- field_align = ADJUST_FIELD_ALIGN (field, field_align);
- ggc_free (field);
+ field_align = ADJUST_FIELD_ALIGN (NULL_TREE, type, field_align);
#endif
align = MIN (align, field_align);
}
/* By default assume vectors of element TYPE require a multiple of the natural
alignment of TYPE. TYPE is naturally aligned if IS_PACKED is false. */
bool
-default_builtin_vector_alignment_reachable (const_tree type, bool is_packed)
+default_builtin_vector_alignment_reachable (const_tree /*type*/, bool is_packed)
{
- if (is_packed)
- return false;
-
- /* If TYPE can be differently aligned in field context we have to punt
- as TYPE may have wrong TYPE_ALIGN here (PR79278). */
- return min_align_of_type (CONST_CAST_TREE (type)) == TYPE_ALIGN_UNIT (type);
+ return ! is_packed;
}
/* By default, assume that a target supports any factor of misalignment
+2017-02-07 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/79256
+ PR middle-end/79278
+ * encoding.c (objc_layout_structure_next_member): Adjust
+ ADJUST_FIELD_ALIGN usage.
+
2017-01-18 Matthias Klose <doko@ubuntu.com>
PR libobjc/78697
desired_align = MIN (desired_align, BIGGEST_FIELD_ALIGNMENT);
#endif
#ifdef ADJUST_FIELD_ALIGN
- desired_align = ADJUST_FIELD_ALIGN (type, desired_align);
+ desired_align = ADJUST_FIELD_ALIGN (type, type, desired_align);
#endif
/* Record must have at least as much alignment as any field.