"Robin Dapp" <rdapp....@gmail.com> writes: > Hi, > > in PR118140 we simplify > > _ifc__33 = .COND_IOR (_41, d_lsm.7_11, _46, d_lsm.7_11); > > to "1": > > Match-and-simplified .COND_IOR (_41, d_lsm.7_11, _46, d_lsm.7_11) to 1 > > when _46 == 1. This happens by removing the conditional and applying > a | 1 = 1. Normally we re-introduce the conditional and its else value > if needed but that does not happen here as we're not dealing with a > vector type. For correctness's sake, we must not remove the conditional > even for non-vector types. > > This patch re-introduces a COND_EXPR in such cases. For PR118140 this > result in a non-vectorized loop. > > Bootstrapped and regtested on x86 and aarch64. Regtested on rv64gcv_zvl512b. > > Regards > Robin > > PR middle-end/118140 > > gcc/ChangeLog: > > * gimple-match-exports.cc (maybe_resimplify_conditional_op): Add > COND_EXPR when we simplified to a scalar gimple value but still > have an else value. > > gcc/testsuite/ChangeLog: > > * gcc.dg/vect/pr118140.c: New test. > * gcc.target/riscv/rvv/pr118140.c: New test.
OK, thanks. Richard > --- > gcc/gimple-match-exports.cc | 26 ++++++++++------- > gcc/testsuite/gcc.dg/vect/pr118140.c | 27 +++++++++++++++++ > .../gcc.target/riscv/rvv/autovec/pr118140.c | 29 +++++++++++++++++++ > 3 files changed, 72 insertions(+), 10 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/vect/pr118140.c > create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr118140.c > > diff --git a/gcc/gimple-match-exports.cc b/gcc/gimple-match-exports.cc > index e06a8aaa171..ccba046a1d4 100644 > --- a/gcc/gimple-match-exports.cc > +++ b/gcc/gimple-match-exports.cc > @@ -337,23 +337,29 @@ maybe_resimplify_conditional_op (gimple_seq *seq, > gimple_match_op *res_op, > } > > /* If the "then" value is a gimple value and the "else" value matters, > - create a VEC_COND_EXPR between them, then see if it can be further > + create a (VEC_)COND_EXPR between them, then see if it can be further > simplified. */ > gimple_match_op new_op; > if (res_op->cond.else_value > - && VECTOR_TYPE_P (res_op->type) > && gimple_simplified_result_is_gimple_val (res_op)) > { > - tree len = res_op->cond.len; > - if (!len) > - new_op.set_op (VEC_COND_EXPR, res_op->type, > - res_op->cond.cond, res_op->ops[0], > - res_op->cond.else_value); > + if (VECTOR_TYPE_P (res_op->type)) > + { > + tree len = res_op->cond.len; > + if (!len) > + new_op.set_op (VEC_COND_EXPR, res_op->type, > + res_op->cond.cond, res_op->ops[0], > + res_op->cond.else_value); > + else > + new_op.set_op (IFN_VCOND_MASK_LEN, res_op->type, > + res_op->cond.cond, res_op->ops[0], > + res_op->cond.else_value, > + res_op->cond.len, res_op->cond.bias); > + } > else > - new_op.set_op (IFN_VCOND_MASK_LEN, res_op->type, > + new_op.set_op (COND_EXPR, res_op->type, > res_op->cond.cond, res_op->ops[0], > - res_op->cond.else_value, > - res_op->cond.len, res_op->cond.bias); > + res_op->cond.else_value); > *res_op = new_op; > return gimple_resimplify3 (seq, res_op, valueize); > } > diff --git a/gcc/testsuite/gcc.dg/vect/pr118140.c > b/gcc/testsuite/gcc.dg/vect/pr118140.c > new file mode 100644 > index 00000000000..2dab98bfc91 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/vect/pr118140.c > @@ -0,0 +1,27 @@ > +/* { dg-do run { target { aarch64*-*-* || riscv*-*-* } } } */ > +/* { dg-additional-options "-std=gnu99" } */ > + > +long long a; > +_Bool d; > +char e; > +_Bool f[17]; > +_Bool f_3; > + > +int main() { > + for (char g = 3; g < 16; g++) { > + d |= ({ > + int h = f[g - 1] ? 2 : 0; > + _Bool t; > + if (f[g - 1]) > + t = f_3; > + else > + t = 0; > + int i = t; > + h > i; > + }); > + e += f[g + 1]; > + } > + > + if (d != 0) > + __builtin_abort (); > +} > diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr118140.c > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr118140.c > new file mode 100644 > index 00000000000..31134de7b3a > --- /dev/null > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr118140.c > @@ -0,0 +1,29 @@ > +/* { dg-do run } */ > +/* { dg-require-effective-target riscv_v_ok } */ > +/* { dg-add-options riscv_v } */ > +/* { dg-additional-options "-std=gnu99 -Wno-pedantic" } */ > + > +long long a; > +_Bool d; > +char e; > +_Bool f[17]; > +_Bool f_3; > + > +int main() { > + for (char g = 3; g < 16; g++) { > + d |= ({ > + int h = f[g - 1] ? 2 : 0; > + _Bool t; > + if (f[g - 1]) > + t = f_3; > + else > + t = 0; > + int i = t; > + h > i; > + }); > + e += f[g + 1]; > + } > + > + if (d != 0) > + __builtin_abort (); > +}