[PATCH] Fix IA-64 ia64_adjust_cost ICE

Jakub Jelinek jakub@redhat.com
Tue Nov 13 15:03:00 GMT 2001


Hi!

The following testcase ICEs on IA-64.
The reason is that at sched time, ia64_adjust_cost comes over:
(insn 47 63 66 (set (reg:DI 354)
        (zero_extend:DI (subreg:HI (mem/s:SI (post_inc:DI (reg/f:DI 360)) [4 S4 A32]) 0))) 20 {zero_extendhidi2} (insn_list 132
(insn_list:REG_DEP_ANTI 32 (nil)))
    (expr_list:REG_INC (reg/f:DI 360)
        (nil)))

This insn has ITANIUM_CLASS_LD class, but we haven't found corresponding
addr.
Ok to commit?

2001-11-14  Jakub Jelinek  <jakub@redhat.com>

	* config/ia64/ia64.c (ia64_adjust_cost): Handle SUBREGs.

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

--- gcc/config/ia64/ia64.c.jj	Tue Nov  6 19:56:03 2001
+++ gcc/config/ia64/ia64.c	Wed Nov 14 15:44:59 2001
@@ -5241,17 +5241,27 @@ ia64_adjust_cost (insn, link, dep_insn, 
 
   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);
 
--- gcc/testsuite/gcc.c-torture/compile/20011114-2.c.jj	Wed Nov 14 15:46:57 2001
+++ gcc/testsuite/gcc.c-torture/compile/20011114-2.c	Wed Nov 14 15:10:35 2001
@@ -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));
+}

	Jakub



More information about the Gcc-patches mailing list