re PR rtl-optimization/13313 (Wrong code generated)
authorEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 16 Dec 2003 07:50:31 +0000 (07:50 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 16 Dec 2003 07:50:31 +0000 (07:50 +0000)
PR optimization/13313
* combine.c (make_extraction) [REG]: Do not use
gen_lowpart_for_combine when POS is non-zero.

From-SVN: r74676

gcc/ChangeLog
gcc/combine.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20031216-1.c [new file with mode: 0644]

index 45e05a8c989a4d65b33cab0497f957ce50ad8e07..733c289f06fb8b5b4a6b9bb0f873e66b6a1b9818 100644 (file)
@@ -1,3 +1,9 @@
+2003-12-16  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       PR optimization/13313
+       * combine.c (make_extraction) [REG]: Do not use
+       gen_lowpart_for_combine when POS is non-zero.
+
 2003-12-16  Hartmut Penner  <hpenner@de.ibm.com>
 
        * altivec.h (vec_cmple, vec_all_numeric): Fix typo.
index 02a92c1609dc38b528638913fa4d3ff648d21cf2..2c92d247aa8357b41cde165cd5f6df2a185ea3e9 100644 (file)
@@ -6043,10 +6043,11 @@ make_extraction (enum machine_mode mode, rtx inner, HOST_WIDE_INT pos,
        {
          if (tmode != inner_mode)
            {
-             if (in_dest)
+             /* We can't call gen_lowpart_for_combine in a DEST since we
+                always want a SUBREG (see below) and it would sometimes
+                return a new hard register.  */
+             if (pos || in_dest)
                {
-                 /* We can't call gen_lowpart_for_combine here since we always want
-                    a SUBREG and it would sometimes return a new hard register.  */
                  HOST_WIDE_INT final_word = pos / BITS_PER_WORD;
 
                  if (WORDS_BIG_ENDIAN
index 6e1f126e67046d1523df4c276f7b8ea96dacc1ac..3dd3a023bd0065675c0aeea69944b15796ad5061 100644 (file)
@@ -1,3 +1,7 @@
+2003-12-16  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       * gcc.c-torture/execute/20031216-1.c: New test.
+
 2003-12-16  Giovanni Bajo  <giovannibajo@gcc.gnu.org>
 
        * g++.dg/template/ptrmem7.C: Simplified the test case to not hit
        * g++.dg/ext/visibility-5.C: Likewise.
        * g++.dg/ext/visibility-6.C: Likewise.
 
-2003-12-07  Giovanni Bajo  <giovannibajo@gcc.gnu.org>\r
-\r
-       * g++.dg/lookup/java1.C: New test.\r
-       * g++.dg/lookup/java2.C: New test.\r
+2003-12-07  Giovanni Bajo  <giovannibajo@gcc.gnu.org>
+
+       * g++.dg/lookup/java1.C: New test.
+       * g++.dg/lookup/java2.C: New test.
 
 2003-12-07  Falk Hueffner  <falk@debian.org>
 
diff --git a/gcc/testsuite/gcc.c-torture/execute/20031216-1.c b/gcc/testsuite/gcc.c-torture/execute/20031216-1.c
new file mode 100644 (file)
index 0000000..709f016
--- /dev/null
@@ -0,0 +1,23 @@
+/* PR optimization/13313 */
+/* Origin: Mike Lerwill <mike@ml-solutions.co.uk> */
+
+extern void abort(void);
+
+void DisplayNumber (unsigned long v)
+{
+  if (v != 0x9aL)
+    abort();
+}
+
+unsigned long ReadNumber (void)
+{
+  return 0x009a0000L;
+}
+
+int main (void)
+{
+  unsigned long tmp;
+  tmp = (ReadNumber() & 0x00ff0000L) >> 16;
+  DisplayNumber (tmp);
+  return 0;
+}