ia64.c (ia64_adjust_cost): Handle SUBREGs.
authorJakub Jelinek <jakub@redhat.com>
Thu, 15 Nov 2001 10:30:59 +0000 (11:30 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 15 Nov 2001 10:30:59 +0000 (11:30 +0100)
* config/ia64/ia64.c (ia64_adjust_cost): Handle SUBREGs.

* gcc.c-torture/compile/20011114-2.c: New test.

From-SVN: r47049

gcc/ChangeLog
gcc/config/ia64/ia64.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20011114-2.c [new file with mode: 0644]

index 7fb7529d9672dd36644b48e45b6ef059cf1e45ab..010e93eb01bd21beb2e7d01b5fbaf299a268aa01 100644 (file)
@@ -10,6 +10,8 @@
        * ifcvt.c (dead_or_predicable): Return TRUE if squeeze_notes doesn't
        find any real instructions.
 
+       * config/ia64/ia64.c (ia64_adjust_cost): Handle SUBREGs.
+
 2001-11-15  Neil Booth  <neil@daikokuya.demon.co.uk>
 
        * c-common.c: Include c-lex.h.
index 87c35e76f2f3f474db5d571c0e83aff761a45ddd..a63376c4e797d2cf1705f891ebdb5786acd987e7 100644 (file)
@@ -5241,17 +5241,27 @@ ia64_adjust_cost (insn, link, dep_insn, cost)
 
   src = set ? SET_SRC (set) : 0;
   addr = 0;
-  if (set && GET_CODE (SET_DEST (set)) == MEM)
-    addr = XEXP (SET_DEST (set), 0);
-  else if (set && GET_CODE (src) == MEM)
-    addr = XEXP (src, 0);
-  else if (set && GET_CODE (src) == ZERO_EXTEND
-          && GET_CODE (XEXP (src, 0)) == MEM)
-    addr = XEXP (XEXP (src, 0), 0);
-  else if (set && GET_CODE (src) == UNSPEC
-          && XVECLEN (XEXP (src, 0), 0) > 0
-          && GET_CODE (XVECEXP (src, 0, 0)) == MEM)
-    addr = XEXP (XVECEXP (src, 0, 0), 0);
+  if (set)
+    {
+      if (GET_CODE (SET_DEST (set)) == MEM)
+       addr = XEXP (SET_DEST (set), 0);
+      else if (GET_CODE (SET_DEST (set)) == SUBREG
+              && GET_CODE (SUBREG_REG (SET_DEST (set))) == MEM)
+       addr = XEXP (SUBREG_REG (SET_DEST (set)), 0);
+      else
+       {
+         addr = src;
+         if (GET_CODE (addr) == UNSPEC && XVECLEN (addr, 0) > 0)
+           addr = XVECEXP (addr, 0, 0);
+         while (GET_CODE (addr) == SUBREG || GET_CODE (addr) == ZERO_EXTEND)
+           addr = XEXP (addr, 0);
+         if (GET_CODE (addr) == MEM)
+           addr = XEXP (addr, 0);
+         else
+           addr = 0;
+       }
+    }
+
   if (addr && GET_CODE (addr) == POST_MODIFY)
     addr = XEXP (addr, 0);
 
index 9c2c4c8e29fc1aff26eb481e8956142233affc04..38adc49465fac126b4a3671da33e0f92662c791b 100644 (file)
@@ -1,5 +1,6 @@
 2001-11-15  Jakub Jelinek  <jakub@redhat.com>
 
+       * gcc.c-torture/compile/20011114-2.c: New test.
        * gcc.c-torture/compile/20011114-4.c: New test.
 
 2001-11-15  Nathan Sidwell  <nathan@codesourcery.com>
diff --git a/gcc/testsuite/gcc.c-torture/compile/20011114-2.c b/gcc/testsuite/gcc.c-torture/compile/20011114-2.c
new file mode 100644 (file)
index 0000000..46f0aed
--- /dev/null
@@ -0,0 +1,13 @@
+typedef struct { int c, d, e, f, g; } D;
+
+void bar (unsigned long, unsigned long);
+void foo (D *y)
+{
+  int x = 0;
+
+  if (y->f == 0)
+    x |= 0x1;
+  if (y->g == 0)
+    x |= 0x2;
+  bar ((x << 16) | (y->c & 0xffff), (y->d << 16) | (y->e & 0xffff));
+}