re PR target/62262 (aarch64 gcc generates invalid assembler)
authorGuozhi Wei <carrot@google.com>
Wed, 27 Aug 2014 16:48:09 +0000 (16:48 +0000)
committerWei Guozhi <carrot@gcc.gnu.org>
Wed, 27 Aug 2014 16:48:09 +0000 (16:48 +0000)
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

gcc/ChangeLog
gcc/config/aarch64/aarch64.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/pr62262.c [new file with mode: 0644]

index 6ccb0d3..66eece0 100644 (file)
@@ -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
index 3c51fd3..1f7ab91 100644 (file)
        (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")]
index 3290e7d..8835822 100644 (file)
@@ -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 (file)
index 0000000..5bf90bf
--- /dev/null
@@ -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;
+}