------- Comment #6 from jakub at gcc dot gnu dot org 2010-08-25 16:39 ------- The problem is that func_21 is first marked as TREE_READONLY/DECL_LOOPING_CONST_OR_PURE_P by local_pure_const, thus there are no vops on it, but afterwards it is by another local_pure_const made also TREE_THIS_VOLATILE (i.e. noreturn). flags_from_decl_or_type doesn't set ECF_CONST for const noreturn functions though for some reason: 603 /* Process the pure and const attributes. */ 604 if (TREE_READONLY (exp) && ! TREE_THIS_VOLATILE (exp)) 605 flags |= ECF_CONST; 606 if (DECL_PURE_P (exp)) 607 flags |= ECF_PURE; (strangely it does set ECF_PURE for pure noreturn calls), which means when fixup_noreturn_call calls update_stmt to drop lhs from the call, it adds vops that were missing before and .MEM needs renaming, but the pass in which fixup_noreturn_call is called doesn't expect that ssa needs updating. I wonder what is the reason for that " && ! TREE_THIS_VOLATILE (exp)" above.
-- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44485