]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/52199 (V2DI vec_duplicate ICE on valid code)
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Wed, 15 Feb 2012 21:17:42 +0000 (21:17 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Wed, 15 Feb 2012 21:17:42 +0000 (21:17 +0000)
[gcc]
2012-02-15  Michael Meissner  <meissner@linux.vnet.ibm.com>

PR target/52199
* config/rs6000/rs6000.c (rs6000_expand_vector_init): Use
force_reg instead of copy_to_reg for better optimization.  Force
non-register or memory operands into a register.

[gcc/testsuite]
2012-02-15  Michael Meissner  <meissner@linux.vnet.ibm.com>

PR target/52199
* gcc.target/powerpc/pr52199.c: New file.

From-SVN: r184285

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/pr52199.c [new file with mode: 0644]

index da9520a4bbefd6e630e3470b8791cb0952ec30d6..578f1ee1f1d2000b191a0f2601141f33e5afd744 100644 (file)
@@ -1,3 +1,13 @@
+2012-02-15  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       Backport from mainline
+       2012-02-15  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       PR target/52199
+       * config/rs6000/rs6000.c (rs6000_expand_vector_init): Use
+       force_reg instead of copy_to_reg for better optimization.  Force
+       non-register or memory operands into a register.
+
 2012-02-15  Richard Guenther  <rguenther@suse.de>
 
        Backport from mainline
index a9cd835577e5827ce2b13d7528cd0612ffc05749..2f2f342e7920b594f8e7659dd4ffd0d16f5593b7 100644 (file)
@@ -5324,28 +5324,25 @@ rs6000_expand_vector_init (rtx target, rtx vals)
   /* Double word values on VSX can use xxpermdi or lxvdsx.  */
   if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode))
     {
+      rtx op0 = XVECEXP (vals, 0, 0);
+      rtx op1 = XVECEXP (vals, 0, 1);
       if (all_same)
        {
-         rtx element = XVECEXP (vals, 0, 0);
+         if (!MEM_P (op0) && !REG_P (op0))
+           op0 = force_reg (inner_mode, op0);
          if (mode == V2DFmode)
-           emit_insn (gen_vsx_splat_v2df (target, element));
+           emit_insn (gen_vsx_splat_v2df (target, op0));
          else
-           emit_insn (gen_vsx_splat_v2di (target, element));
+           emit_insn (gen_vsx_splat_v2di (target, op0));
        }
       else
        {
+         op0 = force_reg (inner_mode, op0);
+         op1 = force_reg (inner_mode, op1);
          if (mode == V2DFmode)
-           {
-             rtx op0 = copy_to_mode_reg (DFmode, XVECEXP (vals, 0, 0));
-             rtx op1 = copy_to_mode_reg (DFmode, XVECEXP (vals, 0, 1));
-             emit_insn (gen_vsx_concat_v2df (target, op0, op1));
-           }
+           emit_insn (gen_vsx_concat_v2df (target, op0, op1));
          else
-           {
-             rtx op0 = copy_to_mode_reg (DImode, XVECEXP (vals, 0, 0));
-             rtx op1 = copy_to_mode_reg (DImode, XVECEXP (vals, 0, 1));
-             emit_insn (gen_vsx_concat_v2di (target, op0, op1));
-           }
+           emit_insn (gen_vsx_concat_v2di (target, op0, op1));
        }
       return;
     }
@@ -5359,7 +5356,7 @@ rs6000_expand_vector_init (rtx target, rtx vals)
       if (all_same)
        {
          rtx freg = gen_reg_rtx (V4SFmode);
-         rtx sreg = copy_to_reg (XVECEXP (vals, 0, 0));
+         rtx sreg = force_reg (SFmode, XVECEXP (vals, 0, 0));
 
          emit_insn (gen_vsx_xscvdpsp_scalar (freg, sreg));
          emit_insn (gen_vsx_xxspltw_v4sf (target, freg, const0_rtx));
@@ -5370,13 +5367,13 @@ rs6000_expand_vector_init (rtx target, rtx vals)
          rtx dbl_odd  = gen_reg_rtx (V2DFmode);
          rtx flt_even = gen_reg_rtx (V4SFmode);
          rtx flt_odd  = gen_reg_rtx (V4SFmode);
+         rtx op0 = force_reg (SFmode, XVECEXP (vals, 0, 0));
+         rtx op1 = force_reg (SFmode, XVECEXP (vals, 0, 1));
+         rtx op2 = force_reg (SFmode, XVECEXP (vals, 0, 2));
+         rtx op3 = force_reg (SFmode, XVECEXP (vals, 0, 3));
 
-         emit_insn (gen_vsx_concat_v2sf (dbl_even,
-                                         copy_to_reg (XVECEXP (vals, 0, 0)),
-                                         copy_to_reg (XVECEXP (vals, 0, 1))));
-         emit_insn (gen_vsx_concat_v2sf (dbl_odd,
-                                         copy_to_reg (XVECEXP (vals, 0, 2)),
-                                         copy_to_reg (XVECEXP (vals, 0, 3))));
+         emit_insn (gen_vsx_concat_v2sf (dbl_even, op0, op1));
+         emit_insn (gen_vsx_concat_v2sf (dbl_odd, op2, op3));
          emit_insn (gen_vsx_xvcvdpsp (flt_even, dbl_even));
          emit_insn (gen_vsx_xvcvdpsp (flt_odd, dbl_odd));
          emit_insn (gen_vec_extract_evenv4sf (target, flt_even, flt_odd));
index d87feb9059c2a7781961cf5f902b03efca860268..3e74b86e396b8c7f65725d5e33dc12826f6be818 100644 (file)
@@ -1,3 +1,11 @@
+2012-02-15  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       Backport from mainline
+       2012-02-15  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       PR target/52199
+       * gcc.target/powerpc/pr52199.c: New file.
+
 2012-02-14  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
diff --git a/gcc/testsuite/gcc.target/powerpc/pr52199.c b/gcc/testsuite/gcc.target/powerpc/pr52199.c
new file mode 100644 (file)
index 0000000..e223193
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-require-effective-target powerpc_vsx_ok } */
+/* { dg-options "-O3 -mcpu=power7 -fmerge-all-constants" } */
+
+struct locale_time_t
+{
+  const char *abday[7];
+  const unsigned int *wabday[7];
+};
+
+static const unsigned int empty_wstr[1] = { 0 };
+
+void
+time_read (struct locale_time_t *time)
+{
+  int cnt;
+
+  for (cnt=0; cnt < 7; cnt++)
+    {
+      time->abday[cnt] = "";
+      time->wabday[cnt] = empty_wstr;
+    }
+}