diff options
Diffstat (limited to 'gcc/jump.c')
-rw-r--r-- | gcc/jump.c | 10 |
1 files changed, 9 insertions, 1 deletions
@@ -855,7 +855,11 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan) && ! reg_referenced_between_p (temp1, p, NEXT_INSN (temp3)) && ! reg_set_between_p (temp1, p, temp3) && (GET_CODE (SET_SRC (temp4)) == CONST_INT - || ! modified_between_p (SET_SRC (temp4), p, temp2))) + || ! modified_between_p (SET_SRC (temp4), p, temp2)) + /* Verify that registers used by the jump are not clobbered + by the instruction being moved. */ + && ! modified_between_p (PATTERN (temp), temp2, + NEXT_INSN (temp2))) { emit_insn_after_with_line_notes (PATTERN (temp2), p, temp2); delete_insn (temp2); @@ -953,6 +957,10 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan) NEXT_INSN (temp2)) && ! reg_set_between_p (temp1, insert_after, temp) && ! modified_between_p (SET_SRC (temp4), insert_after, temp) + /* Verify that registers used by the jump are not clobbered + by the instruction being moved. */ + && ! modified_between_p (PATTERN (temp), temp3, + NEXT_INSN (temp3)) && invert_jump (temp, JUMP_LABEL (insn))) { emit_insn_after_with_line_notes (PATTERN (temp3), |