+2005-04-15 Kazu Hirata <kazu@cs.umass.edu>
+
+ PR tree-optimization/21031
+ * tree-ssa-forwprop.c (ssa_name_defined_by_comparison_p): New.
+ (forward_propagate_into_cond_1): Call it. Forward propagate
+ integer-integer casts into COND_EXPRs.
+
2005-04-15 Dave Korn <dave.korn@artimi.com>
* gcc.c (default_compilers): Clarify obscure error message when
+2005-04-15 Kazu Hirata <kazu@cs.umass.edu>
+
+ PR tree-optimization/21031
+ * gcc.dg/tree-ssa/pr21031.c: New.
+
2005-04-15 Uros Bizjak <uros@kss-loka.si>
PR tree-optimization/21004
--- /dev/null
+/* PR tree-optimization/21031
+
+ Make sure that a != 0 is propagated into the "if" statement. */
+
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-forwprop1-details" } */
+
+int
+foo (int a)
+{
+ int b = a != 0;
+ unsigned char c = b;
+ if (c)
+ return 1;
+ else
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "Replaced" 2 "forwprop1"} } */
+/* { dg-final { cleanup-tree-dump "forwprop1" } } */
This will (of course) be extended as other needs arise. */
+/* Given an SSA_NAME VAR, return true if and only if VAR is defined by
+ a comparison. */
+
+static bool
+ssa_name_defined_by_comparison_p (tree var)
+{
+ tree def = SSA_NAME_DEF_STMT (var);
+
+ if (TREE_CODE (def) == MODIFY_EXPR)
+ {
+ tree rhs = TREE_OPERAND (def, 1);
+ return COMPARISON_CLASS_P (rhs);
+ }
+
+ return 0;
+}
+
/* Forward propagate a single-use variable into COND once. Return a
new condition if successful. Return NULL_TREE otherwise. */
|| (TREE_CODE (inner_type) == BOOLEAN_TYPE
&& INTEGRAL_TYPE_P (outer_type)))
;
+ else if (INTEGRAL_TYPE_P (outer_type)
+ && INTEGRAL_TYPE_P (inner_type)
+ && TREE_CODE (TREE_OPERAND (def_rhs, 0)) == SSA_NAME
+ && ssa_name_defined_by_comparison_p (TREE_OPERAND (def_rhs,
+ 0)))
+ ;
else
return NULL_TREE;