diff --git a/gcc/ext-dce.cc b/gcc/ext-dce.cc index 44f64e2d18c..21feabd9ce3 100644 --- a/gcc/ext-dce.cc +++ b/gcc/ext-dce.cc @@ -270,11 +270,18 @@ ext_dce_process_sets (rtx_insn *insn, rtx obj, bitmap live_tmp) = GET_MODE_MASK (GET_MODE_INNER (GET_MODE (x))); if (SUBREG_P (x)) { - /* If we have a SUBREG that is too wide, just continue the loop - and let the iterator go down into SUBREG_REG. */ + /* If we have a SUBREG destination that is too wide, just + skip the destination rather than continuing this iterator. + While continuing would be better, we'd need to strip the + subreg and restart within the SET processing rather than + the top of the loop which just complicates the flow even + more. */ if (!is_a (GET_MODE (SUBREG_REG (x)), &outer_mode) || GET_MODE_BITSIZE (outer_mode) > 64) - continue; + { + iter.skip_subrtxes (); + continue; + } /* We can safely strip a paradoxical subreg. The inner mode will be narrower than the outer mode. We'll clear fewer bits in