diff options
author | Richard Henderson <rth@redhat.com> | 2004-07-07 17:03:08 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2004-07-07 17:03:08 -0700 |
commit | d969ee71f438becde51c7ddb267b30f51329a7f1 (patch) | |
tree | c7e51d564515ad836ba64ff4909f61006732ab2a /gcc/tree-ssa-dom.c | |
parent | b49fcebddd697b67f7b2645fd1a40202d89410de (diff) | |
download | gcc-d969ee71f438becde51c7ddb267b30f51329a7f1.zip gcc-d969ee71f438becde51c7ddb267b30f51329a7f1.tar.gz gcc-d969ee71f438becde51c7ddb267b30f51329a7f1.tar.bz2 |
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
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r-- | gcc/tree-ssa-dom.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index c03e2bb..740fe9b 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; |