diff options
author | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-03-02 18:54:27 +0000 |
---|---|---|
committer | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-03-02 18:54:27 +0000 |
commit | ea6ad4ae9afbd45b5c19aadab39ddbf1db0d50f8 (patch) | |
tree | e048559755be8433fcd1451da667e6e6d5852ac2 /gcc/compare-elim.c | |
parent | b1addacca4a67ce639c108f47f71941b3f6bfa26 (diff) | |
download | gcc-ea6ad4ae9afbd45b5c19aadab39ddbf1db0d50f8.tar.gz |
* compare-elim.c (find_comparisons_in_bb): Eliminate only compares
having mode compatible with the mode of previous compare. Substitute
compare mode of previous compare with the mode, compatible
with eliminated and previous compare.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@184816 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/compare-elim.c')
-rw-r--r-- | gcc/compare-elim.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/gcc/compare-elim.c b/gcc/compare-elim.c index 15d8d622585..5157e766e8a 100644 --- a/gcc/compare-elim.c +++ b/gcc/compare-elim.c @@ -301,15 +301,37 @@ find_comparisons_in_bb (struct dom_walk_data *data ATTRIBUTE_UNUSED, /* Eliminate a compare that's redundant with the previous. */ if (last_cmp_valid - && src_mode == last_cmp->orig_mode && rtx_equal_p (last_cmp->in_a, XEXP (src, 0)) && rtx_equal_p (last_cmp->in_b, XEXP (src, 1))) { + rtx flags, x; + enum machine_mode new_mode + = targetm.cc_modes_compatible (last_cmp->orig_mode, src_mode); + + /* New mode is incompatible with the previous compare mode. */ + if (new_mode == VOIDmode) + continue; + + if (new_mode != last_cmp->orig_mode) + { + flags = gen_rtx_REG (src_mode, targetm.flags_regnum); + + /* Generate new comparison for substitution. */ + x = gen_rtx_COMPARE (new_mode, XEXP (src, 0), XEXP (src, 1)); + x = gen_rtx_SET (VOIDmode, flags, x); + + if (!validate_change (last_cmp->insn, + &PATTERN (last_cmp->insn), x, false)) + continue; + + last_cmp->orig_mode = new_mode; + } + delete_insn (insn); continue; } - last_cmp = XCNEW (struct comparison); + last_cmp = XCNEW (struct comparison); last_cmp->insn = insn; last_cmp->prev_clobber = last_clobber; last_cmp->in_a = XEXP (src, 0); |