]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/78310 (ICE: insn does not satisfy its constraints: {*bmi2_rorxdi3_1...
authorUros Bizjak <ubizjak@gmail.com>
Fri, 11 Nov 2016 17:04:18 +0000 (18:04 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Fri, 11 Nov 2016 17:04:18 +0000 (18:04 +0100)
PR target/78310
* config/i386/i386.md (rotate to rotatex splitter): Avoid overflow
when calculating operand 2.
(rotate to rotatex zext splitter): Ditto.

testsuite/ChangeLog:

PR target/78310
* gcc.target/i386/pr78310.c: New test.

From-SVN: r242124

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

index 1981638eea576feb2161d39bfddfe9ff349cbecd..63509bf7f162fb8611be0f399a26570ed0e7f74a 100644 (file)
@@ -1,3 +1,10 @@
+2016-11-11  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/78310
+       * config/i386/i386.md (rotate to rotatex splitter): Avoid overflow
+       when calculating operand 2.
+       (rotate to rotatex zext splitter): Ditto.
+
 2016-11-09  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/78262
index 0807fa8db0d981c1b13c9260ff63e4256e249143..c0c64ee2e71f58204200776cd2b7ed6d099e381d 100644 (file)
   [(set (match_dup 0)
        (rotatert:SWI48 (match_dup 1) (match_dup 2)))]
 {
-  operands[2]
-    = GEN_INT (GET_MODE_BITSIZE (<MODE>mode) - INTVAL (operands[2]));
+  int bitsize = GET_MODE_BITSIZE (<MODE>mode);
+
+  operands[2] = GEN_INT ((bitsize - INTVAL (operands[2])) % bitsize);
 })
 
 (define_split
   [(set (match_dup 0)
        (zero_extend:DI (rotatert:SI (match_dup 1) (match_dup 2))))]
 {
-  operands[2]
-    = GEN_INT (GET_MODE_BITSIZE (SImode) - INTVAL (operands[2]));
+  int bitsize = GET_MODE_BITSIZE (SImode);
+
+  operands[2] = GEN_INT ((bitsize - INTVAL (operands[2])) % bitsize);
 })
 
 (define_split
index bb5e61c419a4e39e50cdb281ac3982aa17f866b2..51a798f3c6525e9e8c9e7f385f8e5f95b0d4007f 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-11  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/78310
+       * gcc.target/i386/pr78310.c: New test.
+
 2016-11-09  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/78262
diff --git a/gcc/testsuite/gcc.target/i386/pr78310.c b/gcc/testsuite/gcc.target/i386/pr78310.c
new file mode 100644 (file)
index 0000000..dfeae4c
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-O -mbmi2" } */
+
+unsigned long long a;
+int b;
+
+int
+fn1(int p1)
+{
+  p1 &= 1;
+  p1 &= (short)~p1;
+  b = a;
+  a = a << p1 | a >> (64 - p1);
+  return p1 + 1 + a;
+}