From d969ee71f438becde51c7ddb267b30f51329a7f1 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Wed, 7 Jul 2004 17:03:08 -0700 Subject: [PATCH] tree-ssa-dom.c (simplify_switch_and_lookup_avail_expr): Look through any value-preserving cast. * tree-ssa-dom.c (simplify_switch_and_lookup_avail_expr): Look through any value-preserving cast. From-SVN: r84244 --- gcc/ChangeLog | 5 +++++ gcc/tree-ssa-dom.c | 26 ++++++++++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 33be083356c..11e1eb01bf1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-07-07 Richard Henderson + + * tree-ssa-dom.c (simplify_switch_and_lookup_avail_expr): Look + through any value-preserving cast. + 2004-07-07 Alexandre Oliva * function.c (assign_parm_find_data_types): Call diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index c03e2bb0675..740fe9bc9b2 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -2460,15 +2460,33 @@ simplify_switch_and_lookup_avail_expr (tree stmt, def = TREE_OPERAND (def, 1); if (TREE_CODE (def) == NOP_EXPR) { + int need_precision; + bool fail; + def = TREE_OPERAND (def, 0); + +#ifdef ENABLE_CHECKING + /* ??? Why was Jeff testing this? We are gimple... */ + if (!is_gimple_val (def)) + abort (); +#endif + to = TREE_TYPE (cond); ti = TREE_TYPE (def); - /* If we have an extension that preserves sign, then we + /* If we have an extension that preserves value, then we can copy the source value into the switch. */ - if (TYPE_UNSIGNED (to) == TYPE_UNSIGNED (ti) - && TYPE_PRECISION (to) >= TYPE_PRECISION (ti) - && is_gimple_val (def)) + + need_precision = TYPE_PRECISION (ti); + fail = false; + if (TYPE_UNSIGNED (to) && !TYPE_UNSIGNED (ti)) + fail = true; + else if (!TYPE_UNSIGNED (to) && TYPE_UNSIGNED (ti)) + need_precision += 1; + if (TYPE_PRECISION (to) < need_precision) + fail = true; + + if (!fail) { SWITCH_COND (stmt) = def; ann->modified = 1; -- 2.30.2