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

--- Comment #6 from iii at gcc dot gnu.org ---
Author: iii
Date: Mon Oct  7 14:59:00 2019
New Revision: 276659

URL: https://gcc.gnu.org/viewcvs?rev=276659&root=gcc&view=rev
Log:
Allow COND_EXPR and VEC_COND_EXPR condtions to trap

Right now gimplifier does not allow VEC_COND_EXPR's condition to trap
and introduces a temporary if this could happen, for example, generating

  _5 = _4 > { 2.0e+0, 2.0e+0, 2.0e+0, 2.0e+0 };
  _6 = VEC_COND_EXPR <_5, { -1, -1, -1, -1 }, { 0, 0, 0, 0 }>;

from GENERIC

  VEC_COND_EXPR < (*b > { 2.0e+0, 2.0e+0, 2.0e+0, 2.0e+0 }) ,
                  { -1, -1, -1, -1 } ,
                  { 0, 0, 0, 0 } >

This is not necessary and makes the resulting GIMPLE harder to analyze.
Change the gimplifier so as to allow COND_EXPR and VEC_COND_EXPR
conditions to trap.

This patch takes special care to avoid introducing trapping comparisons
in GIMPLE_COND.  They are not allowed, because they would require 3
outgoing edges (then, else and EH), which is awkward to say the least.
Therefore, computations of such conditions should live in their own basic
blocks.

gcc/ChangeLog:

2019-10-07  Ilya Leoshkevich  <i...@linux.ibm.com>

        PR target/77918
        * gimple-expr.c (gimple_cond_get_ops_from_tree): Assert that the
        caller passes a non-trapping condition.
        (is_gimple_condexpr): Allow trapping conditions.
        (is_gimple_condexpr_1): New helper function.
        (is_gimple_condexpr_for_cond): New function, acts like old
        is_gimple_condexpr.
        * gimple-expr.h (is_gimple_condexpr_for_cond): New function.
        * gimple.c (gimple_could_trap_p_1): Handle COND_EXPR and
        VEC_COND_EXPR. Fix an issue with statements like i = (fp < 1.).
        * gimplify.c (gimplify_cond_expr): Use
        is_gimple_condexpr_for_cond.
        (gimplify_expr): Allow is_gimple_condexpr_for_cond.
        * tree-eh.c (operation_could_trap_p): Assert on COND_EXPR and
        VEC_COND_EXPR.
        (tree_could_trap_p): Handle COND_EXPR and VEC_COND_EXPR.
        * tree-ssa-forwprop.c (forward_propagate_into_gimple_cond): Use
        is_gimple_condexpr_for_cond, remove pointless tmp check
        (forward_propagate_into_cond): Remove pointless tmp check.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/gimple-expr.c
    trunk/gcc/gimple-expr.h
    trunk/gcc/gimple.c
    trunk/gcc/gimplify.c
    trunk/gcc/tree-eh.c
    trunk/gcc/tree-ssa-forwprop.c

Reply via email to