Skip to content
Snippets Groups Projects
  • Ilya Leoshkevich's avatar
    70e2a30a
    Allow COND_EXPR and VEC_COND_EXPR condtions to trap · 70e2a30a
    Ilya Leoshkevich authored
    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  <iii@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.
    
    From-SVN: r276659
    70e2a30a
    History
    Allow COND_EXPR and VEC_COND_EXPR condtions to trap
    Ilya Leoshkevich authored
    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  <iii@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.
    
    From-SVN: r276659