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

Reply via email to