https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91183
Martin Sebor <msebor at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |missed-optimization Blocks| |83819 --- Comment #1 from Martin Sebor <msebor at gcc dot gnu.org> --- The root cause is the conditional guarding handle_char_store in tree-ssa-strlen.c: else if (TREE_CODE (lhs) != SSA_NAME && !TREE_SIDE_EFFECTS (lhs)) { tree type = TREE_TYPE (lhs); if (TREE_CODE (type) == ARRAY_TYPE) type = TREE_TYPE (type); if (TREE_CODE (type) == INTEGER_TYPE && TYPE_MODE (type) == TYPE_MODE (char_type_node) && TYPE_PRECISION (type) == TYPE_PRECISION (char_type_node)) { if (! handle_char_store (gsi)) return false; } } } which prevents the function from being called on the MEM_REF assignment: MEM <unsigned int> [(char * {ref-all})&a] = _4; This case also came up in a recent discussion here: https://gcc.gnu.org/ml/gcc-patches/2019-06/msg01790.html As noted there, the function could be enhanced to handle these sorts of expressions and the conditional relaxed. Incidentally, some existing tests for the strlen optimization already assume that this works. They just happen to be written in a way where this particular issue doesn't come up. An example of one such test is gcc.dg/strlenopt-19.c. Referenced Bugs: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83819 [Bug 83819] [meta-bug] missing strlen optimizations