mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-25 01:01:20 +08:00
re PR tree-optimization/41428 (CCP doesn't fold all comparisons it could)
2009-09-22 Richard Guenther <rguenther@suse.de> PR tree-optimization/41428 * tree-ssa-ccp.c (ccp_fold_stmt): New function. (ccp_finalize): Pass it to substitute_and_fold. * g++.dg/tree-ssa/pr41428.C: New testcase. From-SVN: r151969
This commit is contained in:
parent
ff7ffb8f2a
commit
f61e18ec67
gcc
@ -1,3 +1,9 @@
|
||||
2009-09-22 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/41428
|
||||
* tree-ssa-ccp.c (ccp_fold_stmt): New function.
|
||||
(ccp_finalize): Pass it to substitute_and_fold.
|
||||
|
||||
2009-09-22 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
* tree-ssa-propagate.h (ssa_prop_fold_stmt_fn): Declare.
|
||||
|
@ -1,3 +1,8 @@
|
||||
2009-09-22 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/41428
|
||||
* g++.dg/tree-ssa/pr41428.C: New testcase.
|
||||
|
||||
2009-09-22 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR middle-end/41429
|
||||
|
15
gcc/testsuite/g++.dg/tree-ssa/pr41428.C
Normal file
15
gcc/testsuite/g++.dg/tree-ssa/pr41428.C
Normal file
@ -0,0 +1,15 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O -fdump-tree-ccp1-details" } */
|
||||
|
||||
extern "C" void abort (void);
|
||||
inline void *operator new (__SIZE_TYPE__, void *__p) throw () { return __p; }
|
||||
|
||||
int foo(void)
|
||||
{
|
||||
float f = 0;
|
||||
int *i = new (&f) int (1);
|
||||
return *(int *)&f;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump "Folded into: if \\\(1 != 0\\\)" "ccp1" } } */
|
||||
/* { dg-final { cleanup-tree-dump "ccp1" } } */
|
@ -229,6 +229,7 @@ typedef enum
|
||||
static prop_value_t *const_val;
|
||||
|
||||
static void canonicalize_float_value (prop_value_t *);
|
||||
static bool ccp_fold_stmt (gimple_stmt_iterator *);
|
||||
|
||||
/* Dump constant propagation value VAL to file OUTF prefixed by PREFIX. */
|
||||
|
||||
@ -724,7 +725,7 @@ ccp_finalize (void)
|
||||
|
||||
do_dbg_cnt ();
|
||||
/* Perform substitutions based on the known constant values. */
|
||||
something_changed = substitute_and_fold (const_val, NULL);
|
||||
something_changed = substitute_and_fold (const_val, ccp_fold_stmt);
|
||||
|
||||
free (const_val);
|
||||
const_val = NULL;
|
||||
@ -1472,6 +1473,34 @@ evaluate_stmt (gimple stmt)
|
||||
return val;
|
||||
}
|
||||
|
||||
/* Fold the stmt at *GSI with CCP specific information that propagating
|
||||
and regular folding does not catch. */
|
||||
|
||||
static bool
|
||||
ccp_fold_stmt (gimple_stmt_iterator *gsi)
|
||||
{
|
||||
gimple stmt = gsi_stmt (*gsi);
|
||||
prop_value_t val;
|
||||
|
||||
if (gimple_code (stmt) != GIMPLE_COND)
|
||||
return false;
|
||||
|
||||
/* Statement evaluation will handle type mismatches in constants
|
||||
more gracefully than the final propagation. This allows us to
|
||||
fold more conditionals here. */
|
||||
val = evaluate_stmt (stmt);
|
||||
if (val.lattice_val != CONSTANT
|
||||
|| TREE_CODE (val.value) != INTEGER_CST)
|
||||
return false;
|
||||
|
||||
if (integer_zerop (val.value))
|
||||
gimple_cond_make_false (stmt);
|
||||
else
|
||||
gimple_cond_make_true (stmt);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Visit the assignment statement STMT. Set the value of its LHS to the
|
||||
value computed by the RHS and store LHS in *OUTPUT_P. If STMT
|
||||
creates virtual definitions, set the value of each new name to that
|
||||
|
Loading…
x
Reference in New Issue
Block a user