re PR target/81471 (internal compiler error: in curr_insn_transform, at lra-constrain...
authorUros Bizjak <ubizjak@gmail.com>
Tue, 18 Jul 2017 16:10:20 +0000 (18:10 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Tue, 18 Jul 2017 16:10:20 +0000 (18:10 +0200)
PR target/81471
* config/i386/i386.md (rorx_immediate_operand): New mode attribute.
(*bmi2_rorx<mode>3_1): Use rorx_immediate_operand as
operand 2 predicate.
(*bmi2_rorxsi3_1_zext): Use const_0_to_31_operand as
operand 2 predicate.
(ror,rol -> rorx splitters): Use const_int_operand as
operand 2 predicate.

testsuite/ChangeLog:

PR target/81471
* gcc.target/i386/pr81471.c: New test.

From-SVN: r250315

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

index d6ffb757d01d55b43807050b3be8833f9a566c2a..ef0e78810732ae9d9aa9af21cc8ebda37537f157 100644 (file)
@@ -1,3 +1,14 @@
+2017-07-18  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/81471
+       * config/i386/i386.md (rorx_immediate_operand): New mode attribute.
+       (*bmi2_rorx<mode>3_1): Use rorx_immediate_operand as
+       operand 2 predicate.
+       (*bmi2_rorxsi3_1_zext): Use const_0_to_31_operand as
+       operand 2 predicate.
+       (ror,rol -> rorx splitters): Use const_int_operand as
+       operand 2 predicate.
+
 2017-06-18  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/81410
index 4018e6746b696320b2a77d1622e9094fc83ffee4..5eff4e46fff3071dade314801ed22062bae50ab8 100644 (file)
   split_double_mode (<DWI>mode, &operands[0], 1, &operands[4], &operands[5]);
 })
 
+(define_mode_attr rorx_immediate_operand
+       [(SI "const_0_to_31_operand")
+        (DI "const_0_to_63_operand")])
+
 (define_insn "*bmi2_rorx<mode>3_1"
   [(set (match_operand:SWI48 0 "register_operand" "=r")
-       (rotatert:SWI48 (match_operand:SWI48 1 "nonimmediate_operand" "rm")
-                       (match_operand:QI 2 "immediate_operand" "<S>")))]
+       (rotatert:SWI48
+         (match_operand:SWI48 1 "nonimmediate_operand" "rm")
+         (match_operand:QI 2 "<rorx_immediate_operand>" "<S>")))]
   "TARGET_BMI2"
   "rorx\t{%2, %1, %0|%0, %1, %2}"
   [(set_attr "type" "rotatex")
 (define_split
   [(set (match_operand:SWI48 0 "register_operand")
        (rotate:SWI48 (match_operand:SWI48 1 "nonimmediate_operand")
-                     (match_operand:QI 2 "immediate_operand")))
+                     (match_operand:QI 2 "const_int_operand")))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_BMI2 && reload_completed"
   [(set (match_dup 0)
 (define_split
   [(set (match_operand:SWI48 0 "register_operand")
        (rotatert:SWI48 (match_operand:SWI48 1 "nonimmediate_operand")
-                       (match_operand:QI 2 "immediate_operand")))
+                       (match_operand:QI 2 "const_int_operand")))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_BMI2 && reload_completed"
   [(set (match_dup 0)
   [(set (match_operand:DI 0 "register_operand" "=r")
        (zero_extend:DI
          (rotatert:SI (match_operand:SI 1 "nonimmediate_operand" "rm")
-                      (match_operand:QI 2 "immediate_operand" "I"))))]
+                      (match_operand:QI 2 "const_0_to_31_operand" "I"))))]
   "TARGET_64BIT && TARGET_BMI2"
   "rorx\t{%2, %1, %k0|%k0, %1, %2}"
   [(set_attr "type" "rotatex")
   [(set (match_operand:DI 0 "register_operand")
        (zero_extend:DI
          (rotate:SI (match_operand:SI 1 "nonimmediate_operand")
-                    (match_operand:QI 2 "immediate_operand"))))
+                    (match_operand:QI 2 "const_int_operand"))))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_64BIT && TARGET_BMI2 && reload_completed"
   [(set (match_dup 0)
   [(set (match_operand:DI 0 "register_operand")
        (zero_extend:DI
          (rotatert:SI (match_operand:SI 1 "nonimmediate_operand")
-                      (match_operand:QI 2 "immediate_operand"))))
+                      (match_operand:QI 2 "const_int_operand"))))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_64BIT && TARGET_BMI2 && reload_completed"
   [(set (match_dup 0)
index 80d57b8773dca16b3025ad55a11191c7d556a409..1929d15be82ef8df052262ddc97b2c3381cecca2 100644 (file)
@@ -1,3 +1,8 @@
+2017-07-18  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/81471
+       * gcc.target/i386/pr81471.c: New test.
+
 2017-06-18  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/81410
diff --git a/gcc/testsuite/gcc.target/i386/pr81471.c b/gcc/testsuite/gcc.target/i386/pr81471.c
new file mode 100644 (file)
index 0000000..68b4497
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR target/81471 */
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-O2 -mbmi2" } */
+
+static inline unsigned int rotl (unsigned int x, int k)
+{
+  return (x << k) | (x >> (32 - k));
+}
+
+unsigned long long test (unsigned int z)
+{
+  return rotl (z, 55);
+}