https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117671
Bug ID: 117671 Summary: unroll estimate does not take into account later undef stmt removal Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: rguenth at gcc dot gnu.org Target Milestone: --- c-c++-common/ubsan/unreachable-3.c does struct snic { unsigned int wq_count; struct vnic_wq_ctrl *wq[1]; int wq_lock[1]; }; void snic_log_q_error(struct snic *snic) { unsigned int i; for (i = 0; i < snic->wq_count; i++) ioread32(&snic->wq[i]->error_status); } and cunroll sees <bb 3> [local count: 536870912]: # i_13 = PHI <i_9(6), 0(5)> __builtin___sanitizer_cov_trace_pc (); _1 = snic_7(D)->wq[i_13]; _2 = &_1->error_status; ioread32 (_2); i_9 = i_13 + 1; _3 = snic_7(D)->wq_count; if (_3 > i_9) goto <bb 6>; [50.00%] else goto <bb 4>; [50.00%] <bb 6> [local count: 268435456]: goto <bb 3>; [100.00%] when estimating sizes we do not consider that we later mark _1 = snic_7(D)->wq[1]; and everything below as unreachable (). For this reason the above testcase will be XFAILed with one of my incoming patches to better handle stmts with side-effects (in the above case the ioread32 call).