This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR56483


This fixes PR56483 by properly testing for boolean values
during expansion of conditionals.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2013-03-18  Richard Biener  <rguenther@suse.de>

	PR middle-end/56483
	* cfgexpand.c (expand_gimple_cond): Inline gimple_cond_single_var_p
	and implement properly.
	* gimple.h (gimple_cond_single_var_p): Remove.

Index: gcc/cfgexpand.c
===================================================================
*** gcc/cfgexpand.c	(revision 196309)
--- gcc/cfgexpand.c	(working copy)
*************** expand_gimple_cond (basic_block bb, gimp
*** 1886,1894 ****
       be cleaned up by combine.  But some pattern matchers like if-conversion
       work better when there's only one compare, so make up for this
       here as special exception if TER would have made the same change.  */
!   if (gimple_cond_single_var_p (stmt)
!       && SA.values
        && TREE_CODE (op0) == SSA_NAME
        && bitmap_bit_p (SA.values, SSA_NAME_VERSION (op0)))
      {
        gimple second = SSA_NAME_DEF_STMT (op0);
--- 1886,1899 ----
       be cleaned up by combine.  But some pattern matchers like if-conversion
       work better when there's only one compare, so make up for this
       here as special exception if TER would have made the same change.  */
!   if (SA.values
        && TREE_CODE (op0) == SSA_NAME
+       && TREE_CODE (TREE_TYPE (op0)) == BOOLEAN_TYPE
+       && TREE_CODE (op1) == INTEGER_CST
+       && ((gimple_cond_code (stmt) == NE_EXPR
+ 	   && integer_zerop (op1))
+ 	  || (gimple_cond_code (stmt) == EQ_EXPR
+ 	      && integer_onep (op1)))
        && bitmap_bit_p (SA.values, SSA_NAME_VERSION (op0)))
      {
        gimple second = SSA_NAME_DEF_STMT (op0);
Index: gcc/gimple.h
===================================================================
*** gcc/gimple.h	(revision 196309)
--- gcc/gimple.h	(working copy)
*************** gimple_cond_false_p (const_gimple gs)
*** 2747,2769 ****
    return false;
  }
  
- /* Check if conditional statement GS is of the form 'if (var != 0)' or
-    'if (var == 1)' */
- 
- static inline bool
- gimple_cond_single_var_p (gimple gs)
- {
-   if (gimple_cond_code (gs) == NE_EXPR
-       && gimple_cond_rhs (gs) == boolean_false_node)
-     return true;
- 
-   if (gimple_cond_code (gs) == EQ_EXPR
-       && gimple_cond_rhs (gs) == boolean_true_node)
-     return true;
- 
-   return false;
- }
- 
  /* Set the code, LHS and RHS of GIMPLE_COND STMT from CODE, LHS and RHS.  */
  
  static inline void
--- 2747,2752 ----


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]