https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103723
Bug ID: 103723
Summary: Loop invariant motion pass failed to remove unused
code from loop
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: lingling.kong7 at gmail dot com
Target Milestone: ---
https://godbolt.org/z/b7x1s5Yrn
For this case, the instruction `mov ecx, eax` in bb `.L3` could remove
from loop body and could sink to '.L8' and '.L1'.
After ivopt pass the tree dump is:
uint32_t test (uint32_t buf_avail,
const uint8_t * buf, const uint8_t * buf_back)
{
sizetype ivtmp.7;
uint32_t len_test;
unsigned char _3;
sizetype _4;
unsigned char _6;
sizetype _7;
unsigned int _15;
unsigned int _16;
unsigned int _17;
<bb 2> [local count: 114863530]:
if (buf_avail_8(D) > 2)
goto <bb 6>; [94.50%]
else
goto <bb 8>; [5.50%]
<bb 8> [local count: 6317494]:
goto <bb 5>; [100.00%]
<bb 6> [local count: 108546036]:
_15 = buf_avail_8(D) + 4294967293;
_7 = (sizetype) _15;
_4 = _7 + 3;
goto <bb 4>; [100.00%]
<bb 3> [local count: 958878296]:
_16 = (unsigned int) ivtmp.7_19;
len_test_12 = _16 + 1;
ivtmp.7_18 = ivtmp.7_19 + 1;
if (ivtmp.7_18 != _4)
goto <bb 7>; [94.50%]
else
goto <bb 9>; [5.50%]
<bb 9> [local count: 52738306]:
# len_test_21 = PHI <len_test_12(3)>
goto <bb 5>; [100.00%]
<bb 7> [local count: 906139990]:
<bb 4> [local count: 1014686026]:
# ivtmp.7_19 = PHI <ivtmp.7_18(7), 2(6)>
_17 = (unsigned int) ivtmp.7_19;
len_test_13 = _17;
_3 = MEM[(const uint8_t *)buf_9(D) + ivtmp.7_19 * 1];
_6 = MEM[(const uint8_t *)buf_back_11(D) + ivtmp.7_19 * 1];
if (_3 == _6)
goto <bb 3>; [94.50%]
else
goto <bb 10>; [5.50%]
<bb 10> [local count: 55807731]:
# len_test_20 = PHI <len_test_13(4)>
<bb 5> [local count: 114863531]:
# len_test_14 = PHI <len_test_21(9), len_test_20(10), 2(8)>
return len_test_14;
}
len_test_13 is unused in loop body and could sink to bb 5.