https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92980
--- Comment #9 from Hongyu Wang <wwwhhhyyy333 at gmail dot com> --- (In reply to Hongtao.liu from comment #6) > New fail by removal > unix/-m32: gcc.dg/tree-ssa/copy-headers-5.c scan-tree-dump ch2 "is now > do-while loop" > unix/-m32: gcc.dg/tree-ssa/copy-headers-5.c scan-tree-dump-times ch2 " if " > 3 > unix/-m32: gcc.dg/tree-ssa/copy-headers-7.c scan-tree-dump ch2 "is now > do-while loop" > unix/-m32: gcc.dg/tree-ssa/copy-headers-7.c scan-tree-dump-times ch2 "Will > duplicate bb" 3 > unix/-m32: gcc.dg/tree-ssa/pr81744.c scan-tree-dump-times pcom "Store-stores > chain" 2 > unix/-m64: gcc.dg/tree-ssa/copy-headers-5.c scan-tree-dump ch2 "is now > do-while loop" > unix/-m64: gcc.dg/tree-ssa/copy-headers-5.c scan-tree-dump-times ch2 " if " > 3 > unix/-m64: gcc.dg/tree-ssa/copy-headers-7.c scan-tree-dump ch2 "is now > do-while loop" > unix/-m64: gcc.dg/tree-ssa/copy-headers-7.c scan-tree-dump-times ch2 "Will > duplicate bb" 3 I looked into this and found it is because of current judgement for do-while loop: ---------- <bb 2> [local count: 114863532]: goto <bb 4>; [100.00%] <bb 3> [local count: 1014686025]: i.0_1 = (unsigned int) i_11; _2 = i.0_1 * 4; _3 = a_14(D) + _2; _4 = *_3; _5 = i_11 + 1; _6 = (unsigned int) _5; _7 = _6 * 4; _8 = a_14(D) + _7; _9 = *_8; if (_4 > _9) goto <bb 5>; [5.50%] else goto <bb 6>; [94.50%] <bb 6> [local count: 958878294]: <bb 4> [local count: 1073741824]: # i_11 = PHI <0(2), _5(6)> _10 = n_13(D) + -1; if (_10 > i_11) goto <bb 3>; [94.50%] else goto <bb 5>; [5.50%] <bb 5> [local count: 114863532]: # _12 = PHI <0(3), 1(4)> return _12; This is regarded as a do-while loop because the it satisfies all the condition for do-while loop judgement: 1) Loop latch is empty. 2) The latch has single predecessor. 3) The latch predecessor will exit loop. But I don't think the loop above is a do-while loop, so does the conditions need to be modified?