[PATCH] Make CCP effectively remove UNDEFINED defs

Richard Biener rguenther@suse.de
Wed Nov 4 08:59:00 GMT 2015


The following patch makes sure that CCP when it computes a lattice
value to UNDEFINED ends up replacing uses with default defs (and thus
removes such UNDEFINED producing defs).  This optimizes the testcase
below to

  <bb 2>:
  return _6(D);

in the first CCP.  Note this patch isn't mainly for the optimization
it does but for making it easier to discover cases where CCP gets
UNDEFINED wrong (similar to VRP2 re-using the range-info that is
still live on SSA names - that's to catch bogus range-info).

If the experiment works out (read: bootstrap / test completes
successfully) I'm going to enhance VRP and will also look at
how value-numbering could do a similar job.

It might also help removing unreachable (undefined) code earlier
of course.

Bootstrap and regtest running on x86_64-unknown-linux-gnu.

Richard.

2015-11-04  Richard Biener  <rguenther@suse.de>

	* tree-ssa-ccp.c: Include tree-dfa.h.
	(get_constant_value_for_substitution): New function returning
	default defs for UNDEFINED.
	(ccp_finalize): Use get_constant_value_for_substitution for
	substitute_and_fold.

Index: gcc/tree-ssa-ccp.c
===================================================================
*** gcc/tree-ssa-ccp.c	(revision 229734)
--- gcc/tree-ssa-ccp.c	(working copy)
*************** along with GCC; see the file COPYING3.
*** 139,144 ****
--- 139,145 ----
  #include "params.h"
  #include "builtins.h"
  #include "tree-chkp.h"
+ #include "tree-dfa.h"
  
  
  /* Possible lattice values.  */
*************** get_constant_value (tree var)
*** 365,370 ****
--- 366,411 ----
    return NULL_TREE;
  }
  
+ /* Return the constant tree value associated with VAR.  */
+ 
+ static inline tree
+ get_constant_value_for_substitution (tree var)
+ {
+   ccp_prop_value_t *val;
+   if (TREE_CODE (var) != SSA_NAME)
+     {
+       if (is_gimple_min_invariant (var))
+         return var;
+       return NULL_TREE;
+     }
+   val = get_value (var);
+   if (!val)
+     return NULL_TREE;
+   if (val->lattice_val == UNDEFINED)
+     {
+       /* At substitution time replace UNDEFINED values with a default
+          def.  We delay creating of the default-def until we actually
+ 	 require substitution.  */
+       tree def;
+       if (SSA_NAME_VAR (var)
+ 	  && TREE_CODE (SSA_NAME_VAR (var)) == VAR_DECL)
+ 	def = get_or_create_ssa_default_def (cfun, SSA_NAME_VAR (var));
+       else
+ 	def = get_or_create_ssa_default_def (cfun,
+ 					     create_tmp_reg (TREE_TYPE (var)));
+       /* Adjust the lattice.  */
+       val->lattice_val = CONSTANT;
+       val->mask = -1;
+       val->value = def;
+       return def;
+     }
+   else if (val->lattice_val == CONSTANT
+ 	   && (TREE_CODE (val->value) != INTEGER_CST
+ 	       || val->mask == 0))
+     return val->value;
+   return NULL_TREE;
+ }
+ 
  /* Sets the value associated with VAR to VARYING.  */
  
  static inline void
*************** ccp_finalize (void)
*** 942,948 ****
      }
  
    /* Perform substitutions based on the known constant values.  */
!   something_changed = substitute_and_fold (get_constant_value,
  					   ccp_fold_stmt, true);
  
    free (const_val);
--- 983,989 ----
      }
  
    /* Perform substitutions based on the known constant values.  */
!   something_changed = substitute_and_fold (get_constant_value_for_substitution,
  					   ccp_fold_stmt, true);
  
    free (const_val);
Index: gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-40.c
===================================================================
*** gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-40.c	(revision 0)
--- gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-40.c	(working copy)
***************
*** 0 ****
--- 1,14 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O -fdump-tree-ccp1" } */
+ 
+ int foo (void)
+ {
+   int b;
+   int a = b + 1;
+   return a;
+ }
+ 
+ /* b + 1 results in an undefined value and CCP should simply replace the
+    return stmt to return a default def so the addition can be DCEed.  */
+ 
+ /* { dg-final { scan-tree-dump "return \[^_\]*_\[0-9\]\+\\(D\\);" "ccp1" } } */



More information about the Gcc-patches mailing list