]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/57896 (ICE in expand_expr_real_2)
authorUros Bizjak <ubizjak@gmail.com>
Fri, 21 Feb 2014 07:55:35 +0000 (08:55 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Fri, 21 Feb 2014 07:55:35 +0000 (08:55 +0100)
Backport from mainline
2014-02-21  Jakub Jelinek  <jakub@redhat.com>

* config/i386/i386.c (ix86_expand_vec_perm): Use V8SImode
mode for mask of V8SFmode permutation.

Backport from 4.8 branch
2014-02-20  Jakub Jelinek  <jakub@redhat.com>

PR target/57896
* config/i386/i386.c (expand_vec_perm_interleave2): Don't call
gen_reg_rtx if d->testing_p.
(expand_vec_perm_pshufb2, expand_vec_perm_even_odd_1,
expand_vec_perm_broadcast_1): Return early if d->testing_p and
we will certainly return true.

From-SVN: r207983

gcc/ChangeLog
gcc/config/i386/i386.c

index 1d8f7426038db94771c24b4335753e75aa9286d3..d617bf77ff87c26a191e6e7b67049c9b29c0644d 100644 (file)
@@ -1,3 +1,21 @@
+2014-02-21  Uros Bizjak  <ubizjak@gmail.com>
+
+       Backport from mainline
+       2014-02-21  Jakub Jelinek  <jakub@redhat.com>
+
+       * config/i386/i386.c (ix86_expand_vec_perm): Use V8SImode
+       mode for mask of V8SFmode permutation.
+
+       Backport from 4.8 branch
+       2014-02-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/57896
+       * config/i386/i386.c (expand_vec_perm_interleave2): Don't call
+       gen_reg_rtx if d->testing_p.
+       (expand_vec_perm_pshufb2, expand_vec_perm_even_odd_1,
+       expand_vec_perm_broadcast_1): Return early if d->testing_p and
+       we will certainly return true.
+
 2014-02-20  Terry Guo  <terry.guo@arm.com>
 
        Backport from mainline
index bbf897854c3aba98be833413aa892a5055a2e63e..8edb480eadca3864b92d057c1abea080e7545fe5 100644 (file)
@@ -20073,7 +20073,7 @@ ix86_expand_vec_perm (rtx operands[])
          return;
 
        case V8SFmode:
-         mask = gen_lowpart (V8SFmode, mask);
+         mask = gen_lowpart (V8SImode, mask);
          if (one_operand_shuffle)
            emit_insn (gen_avx2_permvarv8sf (target, op0, mask));
          else
@@ -36655,7 +36655,9 @@ expand_vec_perm_interleave2 (struct expand_vec_perm_d *d)
       else
        dfinal.perm[i] = e;
     }
-  dfinal.op0 = gen_reg_rtx (dfinal.vmode);
+
+  if (!d->testing_p)
+    dfinal.op0 = gen_reg_rtx (dfinal.vmode);
   dfinal.op1 = dfinal.op0;
   dremap.target = dfinal.op0;
 
@@ -37052,6 +37054,8 @@ expand_vec_perm_even_odd_1 (struct expand_vec_perm_d *d, unsigned odd)
   switch (d->vmode)
     {
     case V4DFmode:
+      if (d->testing_p)
+       break;
       t1 = gen_reg_rtx (V4DFmode);
       t2 = gen_reg_rtx (V4DFmode);
 
@@ -37071,6 +37075,8 @@ expand_vec_perm_even_odd_1 (struct expand_vec_perm_d *d, unsigned odd)
       {
        int mask = odd ? 0xdd : 0x88;
 
+       if (d->testing_p)
+         break;
        t1 = gen_reg_rtx (V8SFmode);
        t2 = gen_reg_rtx (V8SFmode);
        t3 = gen_reg_rtx (V8SFmode);
@@ -37112,6 +37118,8 @@ expand_vec_perm_even_odd_1 (struct expand_vec_perm_d *d, unsigned odd)
        return expand_vec_perm_pshufb2 (d);
       else
        {
+         if (d->testing_p)
+           break;
          /* We need 2*log2(N)-1 operations to achieve odd/even
             with interleave. */
          t1 = gen_reg_rtx (V8HImode);
@@ -37133,6 +37141,8 @@ expand_vec_perm_even_odd_1 (struct expand_vec_perm_d *d, unsigned odd)
        return expand_vec_perm_pshufb2 (d);
       else
        {
+         if (d->testing_p)
+           break;
          t1 = gen_reg_rtx (V16QImode);
          t2 = gen_reg_rtx (V16QImode);
          t3 = gen_reg_rtx (V16QImode);
@@ -37165,6 +37175,9 @@ expand_vec_perm_even_odd_1 (struct expand_vec_perm_d *d, unsigned odd)
          return expand_vec_perm_even_odd_1 (&d_copy, odd);
        }
 
+      if (d->testing_p)
+       break;
+
       t1 = gen_reg_rtx (V4DImode);
       t2 = gen_reg_rtx (V4DImode);
 
@@ -37191,6 +37204,9 @@ expand_vec_perm_even_odd_1 (struct expand_vec_perm_d *d, unsigned odd)
          return expand_vec_perm_even_odd_1 (&d_copy, odd);
        }
 
+      if (d->testing_p)
+       break;
+
       t1 = gen_reg_rtx (V8SImode);
       t2 = gen_reg_rtx (V8SImode);
 
@@ -37283,6 +37299,8 @@ expand_vec_perm_broadcast_1 (struct expand_vec_perm_d *d)
     case V16QImode:
       /* These can be implemented via interleave.  We save one insn by
         stopping once we have promoted to V4SImode and then use pshufd.  */
+      if (d->testing_p)
+       return true;
       do
        {
          rtx dest;