[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