diff mbox

[1/2] Remove GENERIC comparison folding from fold_stmt

Message ID alpine.LSU.2.11.1507291415370.19642@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener July 29, 2015, 12:20 p.m. UTC
This removes folding of conditions in GIMPLE_CONDs using fold_binary
from fold_stmt.  All cases appearing during bootstrap and regtest on
x86_64-unknown-linux-gnu are now handled by gimple_simplify and
match.pd patterns (remember this is just two bare operand cases).
I've verified this using the 2nd patch below which passes bootstrap &
regtest.

Boostrapped and tested on x86_64-unknown-linux-gnu.

[2/2] will do the same for comparisons on the RHS of assignments
(note fold_stmt never folded the comparison embedded in RHS
[VEC_]COND_EXPRs, only forward_propagate_into_cond does right now).

Richard.

2015-07-29  Richard Biener  <rguenther@suse.de>

	* gimple-fold.c (fold_gimple_cond): Remove.
	(fold_stmt_1): Do not call it.
diff mbox

Patch

Index: gcc/gimple-fold.c
===================================================================
--- gcc/gimple-fold.c	(revision 226340)
+++ gcc/gimple-fold.c	(working copy)
@@ -529,33 +529,6 @@  fold_gimple_assign (gimple_stmt_iterator
   return NULL_TREE;
 }
 
-/* Attempt to fold a conditional statement. Return true if any changes were
-   made. We only attempt to fold the condition expression, and do not perform
-   any transformation that would require alteration of the cfg.  It is
-   assumed that the operands have been previously folded.  */
-
-static bool
-fold_gimple_cond (gcond *stmt)
-{
-  tree result = fold_binary_loc (gimple_location (stmt),
-			     gimple_cond_code (stmt),
-                             boolean_type_node,
-                             gimple_cond_lhs (stmt),
-                             gimple_cond_rhs (stmt));
-
-  if (result)
-    {
-      STRIP_USELESS_TYPE_CONVERSION (result);
-      if (is_gimple_condexpr (result))
-        {
-          gimple_cond_set_condition_from_tree (stmt, result);
-          return true;
-        }
-    }
-
-  return false;
-}
-
 
 /* Replace a statement at *SI_P with a sequence of statements in STMTS,
    adjusting the replacement stmts location and virtual operands.
@@ -3711,10 +3684,6 @@  fold_stmt_1 (gimple_stmt_iterator *gsi,
 	break;
       }
 
-    case GIMPLE_COND:
-      changed |= fold_gimple_cond (as_a <gcond *> (stmt));
-      break;
-
     case GIMPLE_CALL:
       changed |= gimple_fold_call (gsi, inplace);
       break;


Testing patch:

Index: gcc/gimple-fold.c
===================================================================
--- gcc/gimple-fold.c	(revision 226340)
+++ gcc/gimple-fold.c	(working copy)
@@ -548,6 +551,13 @@  fold_gimple_cond (gcond *stmt)
       STRIP_USELESS_TYPE_CONVERSION (result);
       if (is_gimple_condexpr (result))
         {
+	  /* Folding changes 1 != 0 to 1 thus avoid false changed
+	     reporting if the condition didn't really change.  */
+	  if (is_gimple_val (result)
+	      && gimple_cond_code (stmt) == NE_EXPR
+	      && integer_zerop (gimple_cond_rhs (stmt))
+	      && operand_equal_p (gimple_cond_lhs (stmt), result, 0))
+	    return false;
           gimple_cond_set_condition_from_tree (stmt, result);
           return true;
         }
@@ -3712,8 +3708,11 @@  fold_stmt_1 (gimple_stmt_iterator *gsi,
       }
 
     case GIMPLE_COND:
-      changed |= fold_gimple_cond (as_a <gcond *> (stmt));
-      break;
+      {
+	bool cg = fold_gimple_cond (as_a <gcond *> (stmt));
+	gcc_assert (!cg);
+	break;
+      }
 
     case GIMPLE_CALL:
       changed |= gimple_fold_call (gsi, inplace);