From 03743286836c9d50ae98ce033d057789cd8eb3f0 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 1 Jun 2007 15:06:19 +0000 Subject: [PATCH] re PR rtl-optimization/31455 (lower subreg causes a performance regression in the inner loop sometimes) PR rtl-optimization/31455 * lower-subreg.c (find_decomposable_subregs): Don't decompose subregs which have a cast between modes which are not tieable. From-SVN: r125265 --- gcc/ChangeLog | 6 ++++++ gcc/lower-subreg.c | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c1ee9fbfe42..ece60c7ae48 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-06-01 Ian Lance Taylor + + PR rtl-optimization/31455 + * lower-subreg.c (find_decomposable_subregs): Don't decompose + subregs which have a cast between modes which are not tieable. + 2007-06-01 Uros Bizjak * expr.c (force_operand) [DIV, MOD, UDIV, UMOD, ASHIFTRT]: Remove diff --git a/gcc/lower-subreg.c b/gcc/lower-subreg.c index ac29272211d..0b50a88de99 100644 --- a/gcc/lower-subreg.c +++ b/gcc/lower-subreg.c @@ -281,6 +281,18 @@ find_decomposable_subregs (rtx *px, void *data) bitmap_set_bit (decomposable_context, regno); return -1; } + + /* If this is a cast from one mode to another, where the modes + have the same size, and they are not tieable, then mark this + register as non-decomposable. If we decompose it we are + likely to mess up whatever the backend is trying to do. */ + if (outer_words > 1 + && outer_size == inner_size + && !MODES_TIEABLE_P (GET_MODE (x), GET_MODE (inner))) + { + bitmap_set_bit (non_decomposable_context, regno); + return -1; + } } else if (REG_P (x)) {