int foo(int a) { unsigned int b = a > 0; char c = b; return c; } is not optimized to int foo(int a) { return a > 0; } at the tree level. Forwprop has code to do this if the final propagation result is in a COND_EXPR. I have a patch.
Patch posted.
Subject: Bug 30978 Author: rguenth Date: Fri Apr 27 14:43:42 2007 New Revision: 124217 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=124217 Log: 2007-04-27 Richard Guenther <rguenther@suse.de> PR tree-optimization/30965 PR tree-optimization/30978 * Makefile.in (tree-ssa-forwprop.o): Depend on $(FLAGS_H). * tree-ssa-forwprop.c (forward_propagate_into_cond_1): Remove. (find_equivalent_equality_comparison): Likewise. (simplify_cond): Likewise. (get_prop_source_stmt): New helper. (get_prop_dest_stmt): Likewise. (can_propagate_from): Likewise. (remove_prop_source_from_use): Likewise. (combine_cond_expr_cond): Likewise. (forward_propagate_comparison): New function. (forward_propagate_into_cond): Rewrite to use fold for tree combining. (tree_ssa_forward_propagate_single_use_vars): Call forward_propagate_comparison to propagate comparisons. * gcc.dg/tree-ssa/pr30978.c: New testcase. * gcc.dg/tree-ssa/bool-3.c: Remove XFAIL, explain why. * gcc.dg/tree-ssa/ssa-fre-4.c: Use char instead of bool * gcc.dg/strict-overflow-5.c: Adjust tree dump scanning. Added: trunk/gcc/testsuite/gcc.dg/tree-ssa/pr30978.c Modified: trunk/gcc/ChangeLog trunk/gcc/Makefile.in trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/gcc.dg/strict-overflow-5.c trunk/gcc/testsuite/gcc.dg/tree-ssa/bool-3.c trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-4.c trunk/gcc/tree-ssa-forwprop.c
Fixed.