[PATCH v2 1/2] Allow vec_duplicate_optab to fail

H.J. Lu hjl.tools@gmail.com
Sat Jun 5 15:18:43 GMT 2021


Update vec_duplicate to allow to fail so that backend can only allow
broadcasting an integer constant to a vector when broadcast instruction
is available.

	* expr.c (store_constructor): Replace expand_insn with
	maybe_expand_insn for vec_duplicate_optab.
	* doc/md.texi: Update vec_duplicate.
---
 gcc/doc/md.texi |  2 --
 gcc/expr.c      | 10 ++++++----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi
index 00caf3844cc..e66c41c4779 100644
--- a/gcc/doc/md.texi
+++ b/gcc/doc/md.texi
@@ -5077,8 +5077,6 @@ the mode appropriate for one element of @var{m}.
 This pattern only handles duplicates of non-constant inputs.  Constant
 vectors go through the @code{mov@var{m}} pattern instead.
 
-This pattern is not allowed to @code{FAIL}.
-
 @cindex @code{vec_series@var{m}} instruction pattern
 @item @samp{vec_series@var{m}}
 Initialize vector output operand 0 so that element @var{i} is equal to
diff --git a/gcc/expr.c b/gcc/expr.c
index e4660f0e90a..3107c32f259 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -7075,10 +7075,12 @@ store_constructor (tree exp, rtx target, int cleared, poly_int64 size,
 	    class expand_operand ops[2];
 	    create_output_operand (&ops[0], target, mode);
 	    create_input_operand (&ops[1], expand_normal (elt), eltmode);
-	    expand_insn (icode, 2, ops);
-	    if (!rtx_equal_p (target, ops[0].value))
-	      emit_move_insn (target, ops[0].value);
-	    break;
+	    if (maybe_expand_insn (icode, 2, ops))
+	      {
+		if (!rtx_equal_p (target, ops[0].value))
+		  emit_move_insn (target, ops[0].value);
+		break;
+	      }
 	  }
 
 	n_elts = TYPE_VECTOR_SUBPARTS (type);
-- 
2.31.1



More information about the Gcc-patches mailing list