https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121604
--- Comment #2 from Jennifer Schmitz <jschmitz at gcc dot gnu.org> ---
Thanks for catching this.
Both svbrka and svbrkb produce wrong code with _m predication. Same for
svpmov_lane with _m and a pfalse predicate.
The problem for svbrka/b is that they get folded by the code intended to fold
non-unary function shapes with pfalse predicate, because the inactive operand
happens to be a pfalse in the lines I marked.
svpmov_lane on the other hand gets folded by the code intended for unary
shapes:
gimple *
gimple_folder::fold_pfalse ()
{
if (pred == PRED_none)
return nullptr;
tree arg0 = gimple_call_arg (call, 0);
if (pred == PRED_m)
{
/* Unary function shapes with _m predication are folded to the
inactive vector (arg0), while other function shapes are folded
to op1 (arg1). */
tree arg1 = gimple_call_arg (call, 1);
if (is_pfalse (arg1)) // <----- svpmov_lane gets folded HERE
return fold_call_to (arg0); // <----- svpmov_lane gets folded HERE
if (is_pfalse (arg0)) // <----- svbrka/b get folded HERE
return fold_call_to (arg1); // <----- svbrka/b get folded HERE
return nullptr;
}
...
return nullptr;
}
For svbrka/b, the pfalse folding should not apply in the test case you gave,
because the predicate is a svptrue.
For svpmov_lane, the pfalse folding is not applicable because the predicate has
a different role.
So, I was thinking of separating the issue into 2 patches: 1. prevent the
inappropriate pfalse folding of svbrka/b (in the case of a pfalse inactive
operand) and svpmov_lane (for a pfalse predicate); and 2. for svbrka/b, add
folding to pfalse in case predicate and operand are ptrue in the svbrk gimple
folder.
Do you agree?