https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87489
--- Comment #22 from Jeffrey A. Law <law at gcc dot gnu.org> ---
So looking at this after a long period away, one thing does stand out as a
potential path forward. Specifically early jump threading.
If we look at the key blocks:
;; basic block 4, loop depth 0, maybe hot
;; prev block 3, next block 5, flags: (NEW, VISITED)
;; pred: 2 (FALSE_VALUE,EXECUTABLE)
;; 3 (FALLTHRU,EXECUTABLE)
_3 = xl_xinfo.xinfo;
if (_3 != 0)
goto <bb 5>; [INV]
else
goto <bb 6>; [INV]
;; succ: 5 (TRUE_VALUE,EXECUTABLE)
;; 6 (FALSE_VALUE,EXECUTABLE)
;; basic block 5, loop depth 0, maybe hot
;; prev block 4, next block 6, flags: (NEW, VISITED)
;; pred: 4 (TRUE_VALUE,EXECUTABLE)
XLogRegisterData (&xl_xinfo.xinfo, 4);
;; succ: 6 (FALLTHRU,EXECUTABLE)
;; basic block 6, loop depth 0, maybe hot
;; prev block 5, next block 7, flags: (NEW, VISITED)
;; pred: 4 (FALSE_VALUE,EXECUTABLE)
;; 5 (FALLTHRU,EXECUTABLE)
_4 = xl_xinfo.xinfo;
_5 = _4 & 16;
if (_5 != 0)
goto <bb 7>; [INV]
else
goto <bb 8>; [INV]
;; succ: 7 (TRUE_VALUE,EXECUTABLE)
;; 8 (FALSE_VALUE,EXECUTABLE)
;; basic block 7, loop depth 0, maybe hot
;; prev block 6, next block 8, flags: (NEW, VISITED)
;; pred: 6 (TRUE_VALUE,EXECUTABLE)
_6 = strlen (twophase_gid_19(D));
_7 = _6 + 1;
_8 = (int) _7;
XLogRegisterData (twophase_gid_19(D), _8);
;; succ: 8 (FALLTHRU,EXECUTABLE)
We could thread 4->6 so that it reaches 8 instead during early jump threading.
Then we would also need to improve ccp2 to dectect the obviously unnecessary
conditional and the end of bb4. The combination of those two I think would
clean things up enough to address this specific problem.