https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107485

--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> ---
Note that while this might be part of the solution we then still "wreck" EH
anyway by throwing it away instead of trying to replicate it for each component
compare.

So I'm not sure the proposed change is an improvement.  See the comment
in expand_vector_operations which says

          /* ???  If we do not cleanup EH then we will ICE in
             verification.  But in reality we have created wrong-code
             as we did not properly transition EH info and edges to
             the piecewise computations.  */
          if (maybe_clean_eh_stmt (gsi_stmt (gsi))
              && gimple_purge_dead_eh_edges (bb))
            cfg_changed = true;

that basically says we don't support -fnon-call-exceptions for generic
vector code.  Maybe it wouldn't be too difficult to do it correctly
but most definitely we don't do it.

Confirmed also on x86_64.

Note the issue in the PR is that we have a scalar condition with a
vector value.  That's not supposed to be a VEC_COND_EXPR, it's a
COND_EXPR!

Interestingly the scalar condition appears as part of inlining f(),
the code

      if (gassign *ass = dyn_cast <gassign *> (copy))
        if ((gimple_assign_rhs_code (ass) == COND_EXPR
             || gimple_assign_rhs_code (ass) == VEC_COND_EXPR)
            && gimple_could_trap_p (ass))
          {
            gassign *cmp
              = gimple_build_assign (make_ssa_name (boolean_type_node),
                                     gimple_assign_rhs1 (ass));
            gimple_seq_add_stmt (&stmts, cmp);
            gimple_assign_set_rhs1 (ass, gimple_assign_lhs (cmp));
          }

is wrong.

Reply via email to