https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99101
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Version|og10 (devel/omp/gcc-10) |11.0 Status|UNCONFIRMED |ASSIGNED Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org Keywords| |wrong-code Ever confirmed|0 |1 Last reconfirmed| |2021-02-15 Component|c++ |tree-optimization --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- Confirmed. But note that C++ requires forward progress and thus technically the infinite loop invokes undefined behavior. CDDCE2 does (with -fno-tree-sra to show at_eof_) Assume loop 1 to be finite: it has an exit and -ffinite-loops is on. Removing basic block 14 <bb 2> [local count: 1073741824]: - comp_md_.at_eof_ = 0; <bb 3> [local count: 108447916235]: - # prephitmp_47 = PHI <1(2), 0(15)> - # prephitmp_22 = PHI <0(2), prephitmp_27(15)> - if (prephitmp_47 > 0) - goto <bb 16>; [33.00%] - else - goto <bb 15>; [67.00%] - - <bb 16> [local count: 35787812164]: - - <bb 4> [local count: 53412352861]: - # i_9 = PHI <i_8(14), 0(16)> - # prephitmp_11 = PHI <pretmp_2(14), prephitmp_22(16)> - if (prephitmp_11 != 0) - goto <bb 12>; [34.00%] - else - goto <bb 5>; [66.00%] - - <bb 5> [local count: 11633210387]: - comp_md_.at_eof_ = 1; _14 = std::basic_ostream<char>::operator<< (&cout, 1); _15 = _14->_vptr.basic_ostream; _16 = MEM[(long int *)_15 + -24B]; @@ -99,28 +88,12 @@ _43 = OBJ_TYPE_REF(_37;(const struct ctype)_23->6) (_23, 10); _10 = (int) _43; - <bb 11> [local count: 11628557050]: + <bb 11> [local count: 53407699675]: # prephitmp_24 = PHI <_13(8), 10(9), _10(10)> _21 = std::basic_ostream<char>::put (_14, prephitmp_24); std::basic_ostream<char>::flush (_21); - <bb 12> [local count: 53407699675]: - i_8 = i_9 + 1; - if (i_8 < prephitmp_47) - goto <bb 14>; [33.00%] - else - goto <bb 13>; [67.00%] - - <bb 13> [local count: 35783158878]: - pretmp_25 = comp_md_.at_eof_; - goto <bb 15>; [100.00%] - - <bb 14> [local count: 17624540797]: - pretmp_2 = comp_md_.at_eof_; - goto <bb 4>; [100.00%] - <bb 15> [local count: 108443262898]: - # prephitmp_27 = PHI <pretmp_25(13), prephitmp_22(3)> goto <bb 3>; [100.00%] } so the question would be why the std::cout << 1 call doesn't add its control dependence as necessary here. Hmm, and the reason is we have BB 5 only control dependent on itself. And I have a hunch that this boils down to post dominators being "wrong" here because of the missing edges to exit. Indeed if connecting infinite loops to exit in CD-DCE the bug is fixed.