From: Jakub Jelinek Date: Thu, 15 Nov 2001 10:30:59 +0000 (+0100) Subject: ia64.c (ia64_adjust_cost): Handle SUBREGs. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8f5a5db8187f51e0cbbf8bbb1b13be97fdf2fe4b;p=gcc.git ia64.c (ia64_adjust_cost): Handle SUBREGs. * config/ia64/ia64.c (ia64_adjust_cost): Handle SUBREGs. * gcc.c-torture/compile/20011114-2.c: New test. From-SVN: r47049 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7fb7529d967..010e93eb01b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 * c-common.c: Include c-lex.h. diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 87c35e76f2f..a63376c4e79 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9c2c4c8e29f..38adc49465f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,6 @@ 2001-11-15 Jakub Jelinek + * gcc.c-torture/compile/20011114-2.c: New test. * gcc.c-torture/compile/20011114-4.c: New test. 2001-11-15 Nathan Sidwell 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 index 00000000000..46f0aedeb3a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20011114-2.c @@ -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)); +}