> This patch fixes this by using DF_DEFER_INSN_RESCAN, so we keep the UD/DU > links for the whole duration of the pass, this pass doesn't add new > instructions, only changes them (and schedules insns for removal, but that > is done as the last step for all to be deleted insns at once). > Thus we don't need to assume missing links mean something, we can still > walk them all and verify
Yes, we should have done that earlier, thanks for tackling it. > 2012-01-23 Jakub Jelinek <ja...@redhat.com> > > PR rtl-optimization/51933 > * ree.c (transform_ifelse): Return true right away if dstreg is > already wider or equal to cand->mode. > (enum ext_modified_kind, struct ext_modified, ext_state): New types. > (make_defs_and_copies_lists): Remove defs_list and copies_list > arguments, add state argument, just truncate state->work_list > instead of always allocating and freeing the vector. Assert that > get_defs succeeds instead of returning 2. Changed return type to > bool. > (merge_def_and_ext): Add state argument. If SET_DEST doesn't > have ext_src_mode, see if it has been modified already with the > right kind of extension and has been extended before from the > ext_src_mode. If SET_DEST is already wider or equal to cand->mode, > just return true. Remember the original mode in state->modified > array. > (combine_reaching_defs): Add state argument. Don't allocate and > free here def_list, copied_list and vec vectors, instead just > VEC_truncate the vectors in *state. Don't handle outcome == 2 > here. > (find_and_remove_re): Set DF_DEFER_INSN_RESCAN df flag. > Add state variable, clear vectors in it, initialize state.modified > if needed. Free all the vectors at the end and state.modified too. > Don't skip a candidate if the extension expression has been modified. > > * gcc.c-torture/execute/pr51933.c: New test. OK, modulo: > + are successful. The function returns 0 upon failure, 1 upon success. */ The function returns a boolean now. -- Eric Botcazou