aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAdam Nemet <anemet@caviumnetworks.com>2009-07-18 21:55:40 +0000
committerAdam Nemet <nemet@gcc.gnu.org>2009-07-18 21:55:40 +0000
commit827f4079406b72fce7b49a29abe60ecb801462d5 (patch)
tree31910105b61e164fdc184c5ff130eb63a48de118 /gcc
parentf3ce108897e16f828b3350ac5c5be9d0ffc622c0 (diff)
downloadgcc-827f4079406b72fce7b49a29abe60ecb801462d5.zip
gcc-827f4079406b72fce7b49a29abe60ecb801462d5.tar.gz
gcc-827f4079406b72fce7b49a29abe60ecb801462d5.tar.bz2
combine.c (make_compound_operation): If force_to_mode re-expanded the compound use gen_lowpart instead to convert to...
* combine.c (make_compound_operation) <SUBREG>: If force_to_mode re-expanded the compound use gen_lowpart instead to convert to the desired mode. testsuite/ * gcc.target/mips/ext-2.c: New test. From-SVN: r149781
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/combine.c6
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/mips/ext-2.c14
4 files changed, 30 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c087253..8ad42bf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2009-07-18 Adam Nemet <anemet@caviumnetworks.com>
+ * combine.c (make_compound_operation) <SUBREG>: If force_to_mode
+ re-expanded the compound use gen_lowpart instead to convert to the
+ desired mode.
+
+2009-07-18 Adam Nemet <anemet@caviumnetworks.com>
+
* combine.c (try_widen_shift_mode): Add COUNT, OUTER_CODE and
OUTER_CONST arguments.
<LSHIFTRT>: Use them to allow widening if the bits shifted in from
diff --git a/gcc/combine.c b/gcc/combine.c
index 39daf28..3f39bc3 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -7061,6 +7061,12 @@ make_compound_operation (rtx x, enum rtx_code in_code)
if (GET_CODE (newer) != SUBREG)
newer = make_compound_operation (newer, in_code);
+ /* force_to_mode can expand compounds. If it just re-expanded the
+ compound use gen_lowpart instead to convert to the desired
+ mode. */
+ if (rtx_equal_p (newer, x))
+ return gen_lowpart (GET_MODE (x), tem);
+
return newer;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3200817..b1f8698 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,9 @@
2009-07-18 Adam Nemet <anemet@caviumnetworks.com>
+ * gcc.target/mips/ext-2.c: New test.
+
+2009-07-18 Adam Nemet <anemet@caviumnetworks.com>
+
* gcc.target/mips/octeon-exts-7.c: New test.
* gcc.target/mips/octeon-exts-2.c: Revert previous change.
* gcc.target/mips/octeon-exts-5.c: Likewise.
diff --git a/gcc/testsuite/gcc.target/mips/ext-2.c b/gcc/testsuite/gcc.target/mips/ext-2.c
new file mode 100644
index 0000000..8d502b2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/ext-2.c
@@ -0,0 +1,14 @@
+/* Turn the truncate,zero_extend,lshiftrt sequence before the or into a
+ zero_extract. The truncate is due to TARGET_PROMOTE_PROTOTYPES, the
+ zero_extend to PROMOTE_MODE. */
+/* { dg-do compile } */
+/* { dg-options "-O isa_rev>=2 -mgp64" } */
+/* { dg-final { scan-assembler "\tdext\t" } } */
+/* { dg-final { scan-assembler-not "and" } } */
+/* { dg-final { scan-assembler-not "srl" } } */
+
+void
+f (unsigned char x, unsigned char *r)
+{
+ *r = 0x50 | (x >> 4);
+}