From 7dc5a9bb0dc774a74d3f845f056f678ada0706b4 Mon Sep 17 00:00:00 2001 From: Oleg Endo Date: Mon, 21 Sep 2015 12:57:31 +0000 Subject: [PATCH] re PR target/67657 ([SH][5/6 Regression]: internal compiler error: in cselib_record_set, at cselib.c:2396 when compiling libjpeg-turbo) gcc/ PR target/67657 * config/sh/sh.c (sh_remove_overlapping_post_inc, sh_peephole_emit_move_insn): Add new functions. * config/sh/sh-protos.h (sh_remove_overlapping_post_inc, sh_peephole_emit_move_insn): Declere them. * config/sh/sh.md: Use them in various peephole2 patterns. From-SVN: r227969 --- gcc/ChangeLog | 9 +++++++++ gcc/config/sh/sh-protos.h | 2 ++ gcc/config/sh/sh.c | 28 ++++++++++++++++++++++++++++ gcc/config/sh/sh.md | 16 +++++++++------- 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 246237b..bf68896 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2015-09-21 Oleg Endo + + PR target/67657 + * config/sh/sh.c (sh_remove_overlapping_post_inc, + sh_peephole_emit_move_insn): Add new functions. + * config/sh/sh-protos.h (sh_remove_overlapping_post_inc, + sh_peephole_emit_move_insn): Declere them. + * config/sh/sh.md: Use them in various peephole2 patterns. + 2015-09-21 Richard Biener PR middle-end/67651 diff --git a/gcc/config/sh/sh-protos.h b/gcc/config/sh/sh-protos.h index bb7003c..916fe04 100644 --- a/gcc/config/sh/sh-protos.h +++ b/gcc/config/sh/sh-protos.h @@ -306,6 +306,8 @@ extern bool sh_insn_operands_modified_between_p (rtx_insn* operands_insn, extern bool sh_reg_dead_or_unused_after_insn (const rtx_insn* i, int regno); extern void sh_remove_reg_dead_or_unused_notes (rtx_insn* i, int regno); extern rtx_insn* sh_check_add_incdec_notes (rtx_insn* i); +extern rtx sh_remove_overlapping_post_inc (rtx dst, rtx src); +extern rtx_insn* sh_peephole_emit_move_insn (rtx dst, rtx src); extern bool sh_in_recog_treg_set_expr (void); extern bool sh_recog_treg_set_expr (rtx op, machine_mode mode); diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index ec0abc5..3b83dcc 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -13810,6 +13810,34 @@ sh_check_add_incdec_notes (rtx_insn* i) return i; } +/* Given a move insn destiation and a source, make sure that the move source + operand is not a post-inc mem load with the same address reg as the + destination. Returns the modified source operand with the post-inc removed + if necessary. */ +rtx +sh_remove_overlapping_post_inc (rtx dst, rtx src) +{ + if (!MEM_P (src)) + return src; + + rtx addr = XEXP (src, 0); + + if (GET_CODE (addr) == POST_INC + && reg_overlap_mentioned_p (XEXP (addr, 0), dst)) + return replace_equiv_address (src, XEXP (addr, 0)); + + gcc_assert (GET_CODE (addr) != POST_MODIFY); + return src; +} + +/* Emit a move insn that is safe to be used in peephole patterns. */ +rtx_insn* +sh_peephole_emit_move_insn (rtx dst, rtx src) +{ + return sh_check_add_incdec_notes ( + emit_move_insn (dst, sh_remove_overlapping_post_inc (dst, src))); +} + /* Given an op rtx and an insn, try to find out whether the result of the specified op consists only of logical operations on T bit stores. */ bool diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index e0fc903..f3f68c6 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -14681,7 +14681,7 @@ label: [(const_int 0)] { emit_insn (gen_addsi3 (operands[1], operands[1], operands[2])); - sh_check_add_incdec_notes (emit_move_insn (operands[3], operands[1])); + sh_peephole_emit_move_insn (operands[3], operands[1]); }) ;; mov.l @(r0,r9),r1 @@ -14694,7 +14694,7 @@ label: "TARGET_SH1 && peep2_reg_dead_p (2, operands[0])" [(const_int 0)] { - sh_check_add_incdec_notes (emit_move_insn (operands[2], operands[1])); + sh_peephole_emit_move_insn (operands[2], operands[1]); }) (define_peephole2 @@ -14705,7 +14705,7 @@ label: "TARGET_SH1 && peep2_reg_dead_p (2, operands[0])" [(const_int 0)] { - sh_check_add_incdec_notes (emit_move_insn (operands[2], operands[1])); + sh_peephole_emit_move_insn (operands[2], operands[1]); }) (define_peephole2 @@ -14717,7 +14717,7 @@ label: [(const_int 0)] { sh_check_add_incdec_notes (emit_insn (gen_extendsi2 (operands[2], - operands[1]))); + sh_remove_overlapping_post_inc (operands[2], operands[1])))); }) ;; mov.w @(18,r1),r0 (r0 = HImode) @@ -14747,8 +14747,9 @@ label: // We don't know what the new set insn will be in detail. Just make sure // that it still can be recognized and the constraints are satisfied. - rtx_insn* i = emit_insn (gen_rtx_SET (operands[2], operands[3])); - + rtx_insn* i = emit_insn (gen_rtx_SET (operands[2], + sh_remove_overlapping_post_inc (operands[2], operands[3]))); + recog_data_d prev_recog_data = recog_data; bool i_invalid = insn_invalid_p (i, false); recog_data = prev_recog_data; @@ -14786,7 +14787,8 @@ label: { // We don't know what the new set insn will be in detail. Just make sure // that it still can be recognized and the constraints are satisfied. - rtx_insn* i = emit_insn (gen_rtx_SET (operands[2], operands[3])); + rtx_insn* i = emit_insn (gen_rtx_SET (operands[2], + sh_remove_overlapping_post_inc (operands[2], operands[3]))); recog_data_d prev_recog_data = recog_data; bool i_invalid = insn_invalid_p (i, false); -- 2.7.4