Commit c0cc00c4 by Jakub Jelinek Committed by Jakub Jelinek

re PR rtl-optimization/82973 (ICE in output_constant_pool_2, at varasm.c:3896 on aarch64)

	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
parent b1ccd09a
2017-12-21 Jakub Jelinek <jakub@redhat.com> 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 PR target/83488
* config/i386/i386.c (ix86_target_string): Move -mavx512vbmi2 and * config/i386/i386.c (ix86_target_string): Move -mavx512vbmi2 and
-mshstk entries from isa_opts2 to isa_opts and -mhle, -mmovbe, -mshstk entries from isa_opts2 to isa_opts and -mhle, -mmovbe,
...@@ -5861,11 +5861,11 @@ init_emit (void) ...@@ -5861,11 +5861,11 @@ init_emit (void)
#endif #endif
} }
/* Return true if X is a valid element for a duplicated vector constant /* Return true if X is a valid element for a CONST_VECTOR of the given
of the given mode. */ mode. */
bool 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) return (CONST_SCALAR_INT_P (x)
|| CONST_DOUBLE_AS_FLOAT_P (x) || CONST_DOUBLE_AS_FLOAT_P (x)
...@@ -5907,7 +5907,7 @@ gen_const_vec_duplicate (machine_mode mode, rtx elt) ...@@ -5907,7 +5907,7 @@ gen_const_vec_duplicate (machine_mode mode, rtx elt)
rtx rtx
gen_vec_duplicate (machine_mode mode, rtx x) 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_const_vec_duplicate (mode, x);
return gen_rtx_VEC_DUPLICATE (mode, x); return gen_rtx_VEC_DUPLICATE (mode, x);
} }
......
...@@ -439,7 +439,7 @@ get_max_uid (void) ...@@ -439,7 +439,7 @@ get_max_uid (void)
return crtl->emit.x_cur_insn_uid; 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_const_vec_duplicate (machine_mode, rtx);
extern rtx gen_vec_duplicate (machine_mode, rtx); extern rtx gen_vec_duplicate (machine_mode, rtx);
......
...@@ -377,7 +377,7 @@ expand_vector_broadcast (machine_mode vmode, rtx op) ...@@ -377,7 +377,7 @@ expand_vector_broadcast (machine_mode vmode, rtx op)
gcc_checking_assert (VECTOR_MODE_P (vmode)); 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); return gen_const_vec_duplicate (vmode, op);
icode = optab_handler (vec_duplicate_optab, vmode); icode = optab_handler (vec_duplicate_optab, vmode);
......
...@@ -1768,7 +1768,7 @@ simplify_const_unary_operation (enum rtx_code code, machine_mode mode, ...@@ -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), rtx x = simplify_unary_operation (code, GET_MODE_INNER (mode),
CONST_VECTOR_ELT (op, i), CONST_VECTOR_ELT (op, i),
GET_MODE_INNER (opmode)); GET_MODE_INNER (opmode));
if (!x) if (!x || !valid_for_const_vector_p (mode, x))
return 0; return 0;
RTVEC_ELT (v, i) = x; RTVEC_ELT (v, i) = x;
} }
...@@ -4030,7 +4030,7 @@ simplify_const_binary_operation (enum rtx_code code, machine_mode mode, ...@@ -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), rtx x = simplify_binary_operation (code, GET_MODE_INNER (mode),
CONST_VECTOR_ELT (op0, i), CONST_VECTOR_ELT (op0, i),
CONST_VECTOR_ELT (op1, i)); CONST_VECTOR_ELT (op1, i));
if (!x) if (!x || !valid_for_const_vector_p (mode, x))
return 0; return 0;
RTVEC_ELT (v, i) = x; RTVEC_ELT (v, i) = x;
} }
...@@ -4041,11 +4041,11 @@ simplify_const_binary_operation (enum rtx_code code, machine_mode mode, ...@@ -4041,11 +4041,11 @@ simplify_const_binary_operation (enum rtx_code code, machine_mode mode,
if (VECTOR_MODE_P (mode) if (VECTOR_MODE_P (mode)
&& code == VEC_CONCAT && code == VEC_CONCAT
&& (CONST_SCALAR_INT_P (op0) && (CONST_SCALAR_INT_P (op0)
|| GET_CODE (op0) == CONST_FIXED || CONST_FIXED_P (op0)
|| CONST_DOUBLE_AS_FLOAT_P (op0)) || CONST_DOUBLE_AS_FLOAT_P (op0))
&& (CONST_SCALAR_INT_P (op1) && (CONST_SCALAR_INT_P (op1)
|| CONST_DOUBLE_AS_FLOAT_P (op1) || CONST_DOUBLE_AS_FLOAT_P (op1)
|| GET_CODE (op1) == CONST_FIXED)) || CONST_FIXED_P (op1)))
{ {
unsigned n_elts = GET_MODE_NUNITS (mode); unsigned n_elts = GET_MODE_NUNITS (mode);
rtvec v = rtvec_alloc (n_elts); rtvec v = rtvec_alloc (n_elts);
...@@ -6268,7 +6268,7 @@ simplify_subreg (machine_mode outermode, rtx op, ...@@ -6268,7 +6268,7 @@ simplify_subreg (machine_mode outermode, rtx op,
if (CONST_SCALAR_INT_P (op) if (CONST_SCALAR_INT_P (op)
|| CONST_DOUBLE_AS_FLOAT_P (op) || CONST_DOUBLE_AS_FLOAT_P (op)
|| GET_CODE (op) == CONST_FIXED || CONST_FIXED_P (op)
|| GET_CODE (op) == CONST_VECTOR) || GET_CODE (op) == CONST_VECTOR)
{ {
/* simplify_immed_subreg deconstructs OP into bytes and constructs /* simplify_immed_subreg deconstructs OP into bytes and constructs
......
2017-12-21 Jakub Jelinek <jakub@redhat.com> 2017-12-21 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/82973
* gfortran.dg/pr82973.f90: New test.
PR target/83488 PR target/83488
* gcc.target/i386/pr83488.c: New test. * gcc.target/i386/pr83488.c: New test.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment