]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR middle-end/35163 (folding comparison loses cast)
authorRichard Guenther <rguenther@suse.de>
Tue, 25 Mar 2008 10:17:54 +0000 (10:17 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 25 Mar 2008 10:17:54 +0000 (10:17 +0000)
2008-03-25  Richard Guenther  <rguenther@suse.de>

        Backport from mainline:
        2008-02-12  Richard Guenther  <rguenther@suse.de>

        PR middle-end/35163
        * fold-const.c (fold_widened_comparison): Use get_unwidened in
        value-preserving mode.  Disallow final truncation.

        * gcc.c-torture/execute/pr35163.c: New testcase.

From-SVN: r133509

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr35163.c [new file with mode: 0644]

index 46b345352768802e9650c9e9b9dd41c77231b6c0..9c9783256b06665c7dd2636ed4c19e48ea044639 100644 (file)
@@ -1,3 +1,12 @@
+2008-03-25  Richard Guenther  <rguenther@suse.de>
+
+       Backport from mainline:
+       2008-02-12  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/35163
+       * fold-const.c (fold_widened_comparison): Use get_unwidened in
+       value-preserving mode.  Disallow final truncation.
+
 2008-03-05  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        Backport:
index f9e58d27591061608ca96afd400696c9cb481061..bac759ec053be9f780b6887a29711871c496e3ab 100644 (file)
@@ -6301,12 +6301,14 @@ fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1)
   if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
     return NULL_TREE;
 
-  arg1_unw = get_unwidened (arg1, shorter_type);
+  arg1_unw = get_unwidened (arg1, NULL_TREE);
 
   /* If possible, express the comparison in the shorter mode.  */
   if ((code == EQ_EXPR || code == NE_EXPR
        || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
       && (TREE_TYPE (arg1_unw) == shorter_type
+         || (TYPE_PRECISION (shorter_type)
+             >= TYPE_PRECISION (TREE_TYPE (arg1_unw)))
          || (TREE_CODE (arg1_unw) == INTEGER_CST
              && (TREE_CODE (shorter_type) == INTEGER_TYPE
                  || TREE_CODE (shorter_type) == BOOLEAN_TYPE)
index 2e831e83f7913b7f5b1ea1ecfbe3a21b61087396..4a6e9eb921880d066b4121ab794b4908744e8746 100644 (file)
@@ -1,3 +1,11 @@
+2008-03-25  Richard Guenther  <rguenther@suse.de>
+
+       Backport from mainline:
+       2008-02-12  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/35163
+       * gcc.c-torture/execute/pr35163.c: New testcase.
+
 2008-02-13  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        Backport:
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr35163.c b/gcc/testsuite/gcc.c-torture/execute/pr35163.c
new file mode 100644 (file)
index 0000000..4950d6d
--- /dev/null
@@ -0,0 +1,11 @@
+extern void abort(void);
+
+int main()
+{
+  signed char a = -30;
+  signed char b = -31;
+  if (a > (unsigned short)b)
+    abort ();
+  return 0;
+}
+