diff options
author | Guozhi Wei <carrot@google.com> | 2014-08-27 16:48:09 +0000 |
---|---|---|
committer | Wei Guozhi <carrot@gcc.gnu.org> | 2014-08-27 16:48:09 +0000 |
commit | 3d0b75dee41113c397caabd6b5690c6c39204d0d (patch) | |
tree | 50d95b3ec5a31542890562a98fdfe72015237a6d | |
parent | dcb7fae249bd3b867d91dd85c2e66fd51eb2b45e (diff) | |
download | gcc-3d0b75dee41113c397caabd6b5690c6c39204d0d.zip gcc-3d0b75dee41113c397caabd6b5690c6c39204d0d.tar.gz gcc-3d0b75dee41113c397caabd6b5690c6c39204d0d.tar.bz2 |
re PR target/62262 (aarch64 gcc generates invalid assembler)
PR target/62262
* config/aarch64/aarch64.md (*andim_ashift<mode>_bfiz): Check the shift
amount before using it.
* gcc.target/aarch64/pr62262.c: New test.
From-SVN: r214578
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64.md | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/pr62262.c | 20 |
4 files changed, 33 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6ccb0d3..66eece0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-08-27 Guozhi Wei <carrot@google.com> + + PR target/62262 + * config/aarch64/aarch64.md (*andim_ashift<mode>_bfiz): Check the shift + amount before using it. + 2014-08-27 Richard Biener <rguenther@suse.de> * gimple-fold.c (get_maxval_strlen): Add overload wrapping diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 3c51fd3..1f7ab91 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -3431,7 +3431,8 @@ (and:GPI (ashift:GPI (match_operand:GPI 1 "register_operand" "r") (match_operand 2 "const_int_operand" "n")) (match_operand 3 "const_int_operand" "n")))] - "exact_log2 ((INTVAL (operands[3]) >> INTVAL (operands[2])) + 1) >= 0 + "(INTVAL (operands[2]) < (<GPI:sizen>)) + && exact_log2 ((INTVAL (operands[3]) >> INTVAL (operands[2])) + 1) >= 0 && (INTVAL (operands[3]) & ((1 << INTVAL (operands[2])) - 1)) == 0" "ubfiz\\t%<w>0, %<w>1, %2, %P3" [(set_attr "type" "bfm")] diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3290e7d..8835822 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-08-27 Guozhi Wei <carrot@google.com> + + PR target/62262 + * gcc.target/aarch64/pr62262.c: New test. + 2014-08-26 Joseph Myers <joseph@codesourcery.com> PR target/60606 diff --git a/gcc/testsuite/gcc.target/aarch64/pr62262.c b/gcc/testsuite/gcc.target/aarch64/pr62262.c new file mode 100644 index 0000000..5bf90bf --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/pr62262.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fprofile-use" } */ + +static inline int CLZ(int mask) { + return mask ? __builtin_clz(mask) : 32; +} + +int foo(int value) +{ + if (value == 0) + return 0; + + int bias = CLZ(value); + value >>= bias; + int zeros = CLZ(value << 1); + value <<= zeros; + + int packed = (unsigned)(value << 9) >> 9; + return packed; +} |