summaryrefslogtreecommitdiff
path: root/gcc/compare-elim.c
diff options
context:
space:
mode:
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>2012-03-02 18:54:27 +0000
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>2012-03-02 18:54:27 +0000
commitea6ad4ae9afbd45b5c19aadab39ddbf1db0d50f8 (patch)
treee048559755be8433fcd1451da667e6e6d5852ac2 /gcc/compare-elim.c
parentb1addacca4a67ce639c108f47f71941b3f6bfa26 (diff)
downloadgcc-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.c26
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);