Hi! As mentioned in the PR, if bit_offset is not zero, subclasses array may contain for unions more entries than classes array. We are going to ignore the extra entries, because we only check the ones below words, but as classes[words] and above is uninitialized, this triggers undefined behavior. merge_classes seems to be a const function, so the patch should not affect code generation in any way.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk (and 4.9.2?)? 2014-07-11 Jakub Jelinek <ja...@redhat.com> PR target/61656 * config/i386/i386.c (classify_argument): Don't merge classes above number of words. --- gcc/config/i386/i386.c.jj 2014-07-09 10:41:18.000000000 +0200 +++ gcc/config/i386/i386.c 2014-07-11 10:23:04.276634260 +0200 @@ -6581,7 +6581,7 @@ classify_argument (enum machine_mode mod bit_offset); if (!num) return 0; - for (i = 0; i < num; i++) + for (i = 0; i < num && i < words; i++) classes[i] = merge_classes (subclasses[i], classes[i]); } } Jakub