the problem is caused by constant fold of node with TREE_CLOBBER_P be true.
according to rtl expander, the purpose of clobber is to mark the going out of
scope.
if (TREE_CLOBBER_P (rhs))
/* This is a clobber to mark the going out of scope for
this LHS. */
for vshuf-v16hi, there will be such node
<bb 5>:
r ={v} {CLOBBER};
while the new added "fold_all_stmts" since r216728 will invoke generic "fold"
and that function in fold-const.c has a bug when folding CONSTRUCTOR. we should
not do
fold if the tree node is also with TREE_THIS_VOLATILE (t) be true, otherwise we
will
generate extra insn during expand.
for example, above assignment will be transformed into
r = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
while OImode immediate move is not supported when "-mcpu=cortex-a9
-mfloat-abi=softfp -mfpu=neon" specified,
thus trigger "insn_invalid_p" error for this testcase.
bootstrap ok on x86-64, no regression.
ICE on arm gone away.
ok to trunk?
gcc/
PR tree/63676
fold-const.c (fold): Do not fold node when TREE_CLOBBER_P be true.
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index efcefa7..006fb70 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -14318,6 +14318,10 @@ fold (tree expr)
if (kind == tcc_constant)
return t;
+ /* Return right away if a TREE_CLOBBER node. */
+ if (TREE_CLOBBER_P (t))
+ return t;
+
/* CALL_EXPR-like objects with variable numbers of operands are
treated specially. */
if (kind == tcc_vl_exp)