re PR rtl-optimization/82973 (ICE in output_constant_pool_2, at varasm.c:3896 on...
authorJakub Jelinek <jakub@redhat.com>
Thu, 21 Dec 2017 09:11:29 +0000 (10:11 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 21 Dec 2017 09:11:29 +0000 (10:11 +0100)
PR rtl-optimization/82973
* emit-rtl.h (valid_for_const_vec_duplicate_p): Rename to ...
(valid_for_const_vector_p): ... this.
* emit-rtl.c (valid_for_const_vec_duplicate_p): Rename to ...
(valid_for_const_vector_p): ... this.  Adjust function comment.
(gen_vec_duplicate): Adjust caller.
* optabs.c (expand_vector_broadcast): Likewise.
* simplify-rtx.c (simplify_const_unary_operation): Don't optimize into
CONST_VECTOR if some element isn't simplified valid_for_const_vector_p
constant.
(simplify_const_binary_operation): Likewise.  Use CONST_FIXED_P macro
instead of GET_CODE == CONST_FIXED.
(simplify_subreg): Use CONST_FIXED_P macro instead of
GET_CODE == CONST_FIXED.

* gfortran.dg/pr82973.f90: New test.

From-SVN: r255938

gcc/ChangeLog
gcc/emit-rtl.c
gcc/emit-rtl.h
gcc/optabs.c
gcc/simplify-rtx.c
gcc/testsuite/ChangeLog

index c526dd9c322075b62353c7845bf4d2d9e90733ff..c411e4906db0079ff6e5d35f31e8bf5dfc1496b5 100644 (file)
@@ -1,5 +1,20 @@
 2017-12-21  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/82973
+       * emit-rtl.h (valid_for_const_vec_duplicate_p): Rename to ...
+       (valid_for_const_vector_p): ... this.
+       * emit-rtl.c (valid_for_const_vec_duplicate_p): Rename to ...
+       (valid_for_const_vector_p): ... this.  Adjust function comment.
+       (gen_vec_duplicate): Adjust caller.
+       * optabs.c (expand_vector_broadcast): Likewise.
+       * simplify-rtx.c (simplify_const_unary_operation): Don't optimize into
+       CONST_VECTOR if some element isn't simplified valid_for_const_vector_p
+       constant.
+       (simplify_const_binary_operation): Likewise.  Use CONST_FIXED_P macro
+       instead of GET_CODE == CONST_FIXED.
+       (simplify_subreg): Use CONST_FIXED_P macro instead of
+       GET_CODE == CONST_FIXED.
+
        PR target/83488
        * config/i386/i386.c (ix86_target_string): Move -mavx512vbmi2 and
        -mshstk entries from isa_opts2 to isa_opts and -mhle, -mmovbe,
index 8ca192f5daf2702b14797b10fad249450f41bc44..53693bdfa742935466907ba2dd23118c2e98c3a7 100644 (file)
@@ -5861,11 +5861,11 @@ init_emit (void)
 #endif
 }
 
-/* Return true if X is a valid element for a duplicated vector constant
-   of the given mode.  */
+/* Return true if X is a valid element for a CONST_VECTOR of the given
+  mode.  */
 
 bool
-valid_for_const_vec_duplicate_p (machine_mode, rtx x)
+valid_for_const_vector_p (machine_mode, rtx x)
 {
   return (CONST_SCALAR_INT_P (x)
          || CONST_DOUBLE_AS_FLOAT_P (x)
@@ -5907,7 +5907,7 @@ gen_const_vec_duplicate (machine_mode mode, rtx elt)
 rtx
 gen_vec_duplicate (machine_mode mode, rtx x)
 {
-  if (valid_for_const_vec_duplicate_p (mode, x))
+  if (valid_for_const_vector_p (mode, x))
     return gen_const_vec_duplicate (mode, x);
   return gen_rtx_VEC_DUPLICATE (mode, x);
 }
index b219762d2790efdbcb7ee773900a14bceb7de783..b8c2f8cbe2e4c92f41af2ba3c52bb3f5d43e89df 100644 (file)
@@ -439,7 +439,7 @@ get_max_uid (void)
   return crtl->emit.x_cur_insn_uid;
 }
 
-extern bool valid_for_const_vec_duplicate_p (machine_mode, rtx);
+extern bool valid_for_const_vector_p (machine_mode, rtx);
 extern rtx gen_const_vec_duplicate (machine_mode, rtx);
 extern rtx gen_vec_duplicate (machine_mode, rtx);
 
index 9fd0f823060db693dcacdf37b0faa2ab90772127..225e9558bc3256bf0fabe4419a4328e4b0427fdb 100644 (file)
@@ -377,7 +377,7 @@ expand_vector_broadcast (machine_mode vmode, rtx op)
 
   gcc_checking_assert (VECTOR_MODE_P (vmode));
 
-  if (valid_for_const_vec_duplicate_p (vmode, op))
+  if (valid_for_const_vector_p (vmode, op))
     return gen_const_vec_duplicate (vmode, op);
 
   icode = optab_handler (vec_duplicate_optab, vmode);
index 35c98fb883f0b250c53e75d2e06038ac73d359c5..4f9796c7c84bede12550c8492a38bf502ba4248f 100644 (file)
@@ -1768,7 +1768,7 @@ simplify_const_unary_operation (enum rtx_code code, machine_mode mode,
          rtx x = simplify_unary_operation (code, GET_MODE_INNER (mode),
                                            CONST_VECTOR_ELT (op, i),
                                            GET_MODE_INNER (opmode));
-         if (!x)
+         if (!x || !valid_for_const_vector_p (mode, x))
            return 0;
          RTVEC_ELT (v, i) = x;
        }
@@ -4030,7 +4030,7 @@ simplify_const_binary_operation (enum rtx_code code, machine_mode mode,
          rtx x = simplify_binary_operation (code, GET_MODE_INNER (mode),
                                             CONST_VECTOR_ELT (op0, i),
                                             CONST_VECTOR_ELT (op1, i));
-         if (!x)
+         if (!x || !valid_for_const_vector_p (mode, x))
            return 0;
          RTVEC_ELT (v, i) = x;
        }
@@ -4041,11 +4041,11 @@ simplify_const_binary_operation (enum rtx_code code, machine_mode mode,
   if (VECTOR_MODE_P (mode)
       && code == VEC_CONCAT
       && (CONST_SCALAR_INT_P (op0)
-         || GET_CODE (op0) == CONST_FIXED
+         || CONST_FIXED_P (op0)
          || CONST_DOUBLE_AS_FLOAT_P (op0))
       && (CONST_SCALAR_INT_P (op1)
          || CONST_DOUBLE_AS_FLOAT_P (op1)
-         || GET_CODE (op1) == CONST_FIXED))
+         || CONST_FIXED_P (op1)))
     {
       unsigned n_elts = GET_MODE_NUNITS (mode);
       rtvec v = rtvec_alloc (n_elts);
@@ -6268,7 +6268,7 @@ simplify_subreg (machine_mode outermode, rtx op,
 
   if (CONST_SCALAR_INT_P (op)
       || CONST_DOUBLE_AS_FLOAT_P (op)
-      || GET_CODE (op) == CONST_FIXED
+      || CONST_FIXED_P (op)
       || GET_CODE (op) == CONST_VECTOR)
     {
       /* simplify_immed_subreg deconstructs OP into bytes and constructs
index 42d1746f68d6d0b009e3ac17ec2133719098e6bb..932ff87b7ff9dbc6a885f818ca674c7742d8d9d2 100644 (file)
@@ -1,5 +1,8 @@
 2017-12-21  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/82973
+       * gfortran.dg/pr82973.f90: New test.
+
        PR target/83488
        * gcc.target/i386/pr83488.c: New test.