OSDN Git Service

* tree-ssa-dom.c (simplify_switch_and_lookup_avail_expr): Look
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 Jul 2004 00:03:08 +0000 (00:03 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 Jul 2004 00:03:08 +0000 (00:03 +0000)
        through any value-preserving cast.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@84244 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree-ssa-dom.c

index 33be083..11e1eb0 100644 (file)
@@ -1,3 +1,8 @@
+2004-07-07  Richard Henderson  <rth@redhat.com>
+
+       * tree-ssa-dom.c (simplify_switch_and_lookup_avail_expr): Look
+       through any value-preserving cast.
+
 2004-07-07  Alexandre Oliva  <aoliva@redhat.com>
 
        * function.c (assign_parm_find_data_types): Call
index c03e2bb..740fe9b 100644 (file)
@@ -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;