On the IA64, the following record, typedef struct sptr_struct { long unsigned int phase: 48; short unsigned int thread: 16; void *addr; } sptr_t;
is assigned a BLKmode rather a TImode, and I was wondering whether this is a requirement of the IA64 ABI, or a coincidental result of various target configuration defintions? The final determination of the mode assigned to this struct is made in compute_record_mode(). The logic first tentatively assigns a TImode (128 bits) as expected, in the second branch of this if statement (GCC version 3.3.2): /* If we only have one real field; use its mode. This only applies to RECORD_TYPE. This does not apply to unions. */ if (TREE_CODE (type) == RECORD_TYPE && mode != VOIDmode) TYPE_MODE (type) = mode; else TYPE_MODE (type) = mode_for_size_tree (TYPE_SIZE (type), MODE_INT, 1); and then reverses that decision in the subsequent if statement: /* If structure's known alignment is less than what the scalar mode would need, and it matters, then stick with BLKmode. */ if (TYPE_MODE (type) != BLKmode && STRICT_ALIGNMENT && ! (TYPE_ALIGN (type) >= BIGGEST_ALIGNMENT || TYPE_ALIGN (type) >= GET_MODE_ALIGNMENT (TYPE_MODE (type)))) { /* If this is the only reason this type is BLKmode, then don't force containing types to be BLKmode. */ TYPE_NO_FORCE_BLK (type) = 1; TYPE_MODE (type) = BLKmode; } primarily because STRICT_ALIGNMENT is asserted, and BIGGEST_ALIGNMENT is 128 in config/ia64/ia64.h: #define STRICT_ALIGNMENT 1 /* Optional x86 80-bit float, quad-precision 128-bit float, and quad-word 128 bit integers all require 128 bit alignment. */ #define BIGGEST_ALIGNMENT 128 And this configuration parameter in config/ia64/ia64.h may also have led to the decision to force 64 bit alignment for this structure (this is asserted on most targets): /* Define this if you wish to imitate the way many other C compilers handle alignment of bitfields and the structures that contain them. The behavior is that the type written for a bit-field (`int', `short', or other integer type) imposes an alignment for the entire structure, as if the structure really did contain an ordinary field of that type. In addition, the bit-field is placed within the structure so that it would fit within such a field, not crossing a boundary for it. */ #define PCC_BITFIELD_TYPE_MATTERS 1 -------------------- Question: If we assume that a TImode would've been a more efficient mode to represent the record type above, would it not have been acceptable for the compiler to promote the alignment of this type to 128, given there are no apparent restrictions otherwise, or are there other C conventions at work that dictate otherwise? Is there a configuration tweak that would've led to using TImode rather than BLKmode?