* combine.c (make_compound_operation) <SUBREG>: If force_to_mode
authornemet <nemet@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 18 Jul 2009 21:55:40 +0000 (21:55 +0000)
committernemet <nemet@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 18 Jul 2009 21:55:40 +0000 (21:55 +0000)
re-expanded the compound use gen_lowpart instead to convert to the
desired mode.

testsuite/
* gcc.target/mips/ext-2.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@149781 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/combine.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/mips/ext-2.c [new file with mode: 0644]

index c087253..8ad42bf 100644 (file)
@@ -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
index 39daf28..3f39bc3 100644 (file)
@@ -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;
          }
 
index 3200817..b1f8698 100644 (file)
@@ -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 (file)
index 0000000..8d502b2
--- /dev/null
@@ -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);
+}