https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92765
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- I'd say the bug is in determine_min_objsize, which makes assumption that are simply not valid in GIMPLE after optimizations. Before fre3 we have: _2 = &ptr.0_1->header.magic; _3 = __builtin_strcmp (_2, "x"); ... _4 = &ptr.0_1->buffer; _5 = __builtin_strcmp (_4, "ab"); but fre3 changes that to: _2 = &ptr.0_1->header.magic; _3 = __builtin_strcmp (_2, "x"); ... _5 = __builtin_strcmp (_2, "ab"); because it determines that _2 and _4 have the same value. They do, but determine_min_objsize attempts to argue from this change that the strcmp will never be true, because &ptr.0_1->header.magic is a 2 byte array in a struct inside of union. The source didn't have such an expression there though. So, either we change GIMPLE and claim that such properties need to be preserved, in that case SCCVN would need to either not do that optimization (and other passes too) or say modify the expression that is kept say to ptr.0_1 or &ptr.0_1->buffer as one that has the larger minimum object size, or determine_min_objsize simply can't make such assumptions.