summaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorRaksit Ashok <raksit@google.com>2008-01-11 04:20:32 +0000
committerRaksit Ashok <raksit@gcc.gnu.org>2008-01-11 04:20:32 +0000
commitacfb3980eebbc7839b688dad7e4b444adfccf076 (patch)
treec20963f4cf9d25ceb53cacc6ed4dbca6306ab622 /gcc/combine.c
parent3fa87ef8fcb647c77882424daa96bf50b24b3213 (diff)
downloadgcc-acfb3980eebbc7839b688dad7e4b444adfccf076.tar.gz
re PR target/27971 (eliminate shift in array[(x>>2)&3])
gcc/ChangeLog PR rtl-optimization/27971 * combine.c (find_split_point): introduced a new split for certain types of mem rtx. gcc/testsuite/ChangeLog PR rtl-optimization/27971 * gcc.target/i386/pr27971.c: New testcase. From-SVN: r131460
Diffstat (limited to 'gcc/combine.c')
-rw-r--r--gcc/combine.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index b3d064d3f11..43623a4fbc4 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -3967,6 +3967,15 @@ find_split_point (rtx *loc, rtx insn)
&& OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
return &XEXP (XEXP (x, 0), 0);
}
+
+ /* If we have a PLUS whose first operand is complex, try computing it
+ separately by making a split there. */
+ if (GET_CODE (XEXP (x, 0)) == PLUS
+ && ! memory_address_p (GET_MODE (x), XEXP (x, 0))
+ && ! OBJECT_P (XEXP (XEXP (x, 0), 0))
+ && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
+ && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
+ return &XEXP (XEXP (x, 0), 0);
break;
case SET: