From f249b40509dc146068a828032871baef906f688b Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Mon, 18 Jan 2010 18:46:17 +0100 Subject: [PATCH] re PR target/42774 (ICE in get_aligned_mem, at config/alpha/alpha.c:1484) PR target/42774 * config/alpha/predicates.md (aligned_memory_operand): Return 0 for memory references with unaligned offsets. Remove CQImode handling. (unaligned_memory_operand): Return 1 for memory references with unaligned offsets. Remove CQImode handling. testsuite/ChangeLog: PR target/42774 * gcc.target/alpha/pr42774.c: New test. From-SVN: r156017 --- gcc/ChangeLog | 8 +++++ gcc/config/alpha/predicates.md | 46 ++++++++++++++++++------ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.target/alpha/pr42774.c | 10 ++++++ 4 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.target/alpha/pr42774.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 795b89c29f1..14e8f8fa2c1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-01-18 Uros Bizjak + + PR target/42774 + * config/alpha/predicates.md (aligned_memory_operand): Return 0 for + memory references with unaligned offsets. Remove CQImode handling. + (unaligned_memory_operand): Return 1 for memory references with + unaligned offsets. Remove CQImode handling. + 2010-01-18 Richard Guenther PR middle-end/39954 diff --git a/gcc/config/alpha/predicates.md b/gcc/config/alpha/predicates.md index b52d9dce028..0852f692998 100644 --- a/gcc/config/alpha/predicates.md +++ b/gcc/config/alpha/predicates.md @@ -439,13 +439,11 @@ (match_code "mem")) { rtx base; + int offset; if (MEM_ALIGN (op) >= 32) return 1; - if (mode == CQImode) - return 0; - op = XEXP (op, 0); /* LEGITIMIZE_RELOAD_ADDRESS creates (plus (plus reg const_hi) const_lo) @@ -453,14 +451,29 @@ if (reload_in_progress && GET_CODE (op) == PLUS && GET_CODE (XEXP (op, 0)) == PLUS) - base = XEXP (XEXP (op, 0), 0); + { + base = XEXP (XEXP (op, 0), 0); + offset = INTVAL (XEXP (op, 1)); + } else { if (! memory_address_p (mode, op)) return 0; - base = (GET_CODE (op) == PLUS ? XEXP (op, 0) : op); + if (GET_CODE (op) == PLUS) + { + base = XEXP (op, 0); + offset = INTVAL (XEXP (op, 1)); + } + else + { + base = op; + offset = 0; + } } + if (offset % GET_MODE_SIZE (mode)) + return 0; + return (REG_P (base) && REGNO_POINTER_ALIGN (REGNO (base)) >= 32); }) @@ -471,13 +484,11 @@ (match_code "mem")) { rtx base; + int offset; if (MEM_ALIGN (op) >= 32) return 0; - if (mode == CQImode) - return 1; - op = XEXP (op, 0); /* LEGITIMIZE_RELOAD_ADDRESS creates (plus (plus reg const_hi) const_lo) @@ -485,14 +496,29 @@ if (reload_in_progress && GET_CODE (op) == PLUS && GET_CODE (XEXP (op, 0)) == PLUS) - base = XEXP (XEXP (op, 0), 0); + { + base = XEXP (XEXP (op, 0), 0); + offset = INTVAL (XEXP (op, 1)); + } else { if (! memory_address_p (mode, op)) return 0; - base = (GET_CODE (op) == PLUS ? XEXP (op, 0) : op); + if (GET_CODE (op) == PLUS) + { + base = XEXP (op, 0); + offset = INTVAL (XEXP (op, 1)); + } + else + { + base = op; + offset = 0; + } } + if (offset % GET_MODE_SIZE (mode)) + return 1; + return (REG_P (base) && REGNO_POINTER_ALIGN (REGNO (base)) < 32); }) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dabbca1ada6..2b0d96d794a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-01-18 Uros Bizjak + + PR target/42774 + * gcc.target/alpha/pr42774.c: New test. + 2010-01-18 Richard Guenther PR tree-optimization/42781 diff --git a/gcc/testsuite/gcc.target/alpha/pr42774.c b/gcc/testsuite/gcc.target/alpha/pr42774.c new file mode 100644 index 00000000000..65688002b3a --- /dev/null +++ b/gcc/testsuite/gcc.target/alpha/pr42774.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mcpu=ev4" } */ + +unsigned int ntfs_getinfo(void *p) +{ + char bootsect[8]; + + __builtin_memcpy(bootsect, p, sizeof bootsect); + return *(unsigned short *)(bootsect + 3); +} -- 2.30.2