On Tue, Jan 14, 2014 at 07:37:33PM +0100, Uros Bizjak wrote: > OK, let's play safe. I'll revert these two changes (modulo size of > nocona prefetch block).
Thanks. > > opt we never return a smaller number from ix86_data_alignment than > > we did in 4.8 and earlier, because otherwise if you have 4.8 compiled > > code that assumes the alignment 4.8 would use for something that is defined > > in a compilation unit built by gcc 4.9+, if we don't align it at least > > as much as we did in the past, the linked mix of 4.8 user and 4.9 definition > > could misbehave. > > >From 4.9 onwards, we would like to align >= 64byte structures on > 64byte boundary. Should we add a compatibility rule to align >= 32byte > structures to 32 bytes? > > Please also note that in 4.7 and 4.8, we have > > int max_align = optimize_size ? BITS_PER_WORD : MIN (256, > MAX_OFILE_ALIGNMENT); > > so, in effect -Os code will be incompatible with other optimization levels. Well, the max_align is only one of the several possibilities of aligment increases, but yes, there is an ABI issue, see e.g. PR56564 for details. > I guess that for 4.7 and 4.8, we should revert to this anyway, but > what to do with 4.9? For 4.9, if what you've added is what you want to do for performance reasons, then I'd do something like: /* GCC 4.8 and earlier used to incorrectly assume this alignment even for symbols from other compilation units or symbols that don't need to bind locally. In order to preserve some ABI compatibility with those compilers, ensure we don't decrease alignment from what we used to assume. */ int max_align_compat = optimize_size ? BITS_PER_WORD : MIN (256, MAX_OFILE_ALIGNMENT); /* A data structure, equal or greater than the size of a cache line (64 bytes in the Pentium 4 and other recent Intel processors, including processors based on Intel Core microarchitecture) should be aligned so that its base address is a multiple of a cache line size. */ int max_align = MIN ((unsigned) ix86_tune_cost->prefetch_block * 8, MAX_OFILE_ALIGNMENT); if (max_align < BITS_PER_WORD) max_align = BITS_PER_WORD; if (opt && AGGREGATE_TYPE_P (type) && TYPE_SIZE (type) && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST) { if ((TREE_INT_CST_LOW (TYPE_SIZE (type)) >= (unsigned) max_align_compat || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < max_align_compat) align = max_align_compat; if ((TREE_INT_CST_LOW (TYPE_SIZE (type)) >= (unsigned) max_align || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < max_align) align = max_align; } That way, max_align will be purely optimization and can be changed as anyone wishes in the future, max_align_compat compatibility with pre-4.9 (beyond ABI) assumptions and !opt stuff the ABI mandated alignment. Jakub