diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2010-01-18 18:46:17 +0100 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2010-01-18 18:46:17 +0100 |
commit | f249b40509dc146068a828032871baef906f688b (patch) | |
tree | 577ca2783f93ad38783670c71add446ae68ee484 /gcc | |
parent | 8c0a593b84966fb8dd64fc5d02645c51a5f33ea7 (diff) | |
download | gcc-f249b40509dc146068a828032871baef906f688b.zip gcc-f249b40509dc146068a828032871baef906f688b.tar.gz gcc-f249b40509dc146068a828032871baef906f688b.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/alpha/predicates.md | 46 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/alpha/pr42774.c | 10 |
4 files changed, 59 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 795b89c..14e8f8f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-01-18 Uros Bizjak <ubizjak@gmail.com> + + 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 <rguenther@suse.de> PR middle-end/39954 diff --git a/gcc/config/alpha/predicates.md b/gcc/config/alpha/predicates.md index b52d9dc..0852f69 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 dabbca1..2b0d96d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-01-18 Uros Bizjak <ubizjak@gmail.com> + + PR target/42774 + * gcc.target/alpha/pr42774.c: New test. + 2010-01-18 Richard Guenther <rguenther@suse.de> 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 0000000..6568800 --- /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); +} |