]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/21858 (ICE in compare_values, at tree-vrp.c:301)
authorRichard Guenther <rguenth@gcc.gnu.org>
Fri, 3 Jun 2005 15:15:46 +0000 (15:15 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 3 Jun 2005 15:15:46 +0000 (15:15 +0000)
2005-06-03  Richard Guenther  <rguenth@gcc.gnu.org>

PR middle-end/21858
* fold-const.c (fold_binary): Fix type mismatches in folding
of comparisons.

* gcc.dg/pr21858.c: New testcase.

From-SVN: r100539

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr21858.c [new file with mode: 0644]

index 465f49af0c1f5968b1bc605d5b761b9b6d21c99a..97461baff5a74e4afd2cb79742164e6243005143 100644 (file)
@@ -1,3 +1,9 @@
+2005-06-03  Richard Guenther  <rguenth@gcc.gnu.org>
+
+       PR middle-end/21858
+       * fold-const.c (fold_binary): Fix type mismatches in folding
+       of comparisons.
+
 2005-06-03  Kazu Hirata  <kazu@codesourcery.com>
 
        * cgraph.c, cgraphunit.c, config/mips/mips.c: Fix comment
index 721701b6732f7238a50072cbf25a1751ac42b31a..21a5b1a66987654b691b2fe66f7c521af60d024c 100644 (file)
@@ -9303,12 +9303,16 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
          switch (code)
            {
            case GE_EXPR:
-             arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
-             return fold_build2 (GT_EXPR, type, arg0, arg1);
+             arg1 = const_binop (MINUS_EXPR, arg1,
+                                 build_int_cst (TREE_TYPE (arg1), 1), 0);
+             return fold_build2 (GT_EXPR, type, arg0,
+                                 fold_convert (TREE_TYPE (arg0), arg1));
 
            case LT_EXPR:
-             arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
-             return fold_build2 (LE_EXPR, type, arg0, arg1);
+             arg1 = const_binop (MINUS_EXPR, arg1,
+                                 build_int_cst (TREE_TYPE (arg1), 1), 0);
+             return fold_build2 (LE_EXPR, type, arg0,
+                                 fold_convert (TREE_TYPE (arg0), arg1));
 
            default:
              break;
index 705985f70001aa7a946d3b4ea6f10a52a634542c..4129b3f672cbf7fe14845d27cfc8c6550238a2a0 100644 (file)
@@ -1,3 +1,8 @@
+2005-06-03  Richard Guenther  <rguenth@gcc.gnu.org>
+
+       PR middle-end/21858
+       * gcc.dg/pr21858.c: New testcase.
+
 2005-06-03  Paolo Bonzini  <bonzini@gnu.org>
 
        PR tree-optimization/21292
diff --git a/gcc/testsuite/gcc.dg/pr21858.c b/gcc/testsuite/gcc.dg/pr21858.c
new file mode 100644 (file)
index 0000000..41cd240
--- /dev/null
@@ -0,0 +1,15 @@
+/* Fold used to create a GT_EXPR of pointer vs. integer types,
+   which caused us to ICE in VRP.  */
+
+/* { dg-do compile } */
+/* { dg-options "-Os -w" } */
+
+unsigned int dsdblm_GetBlockAddress();
+void error_LocalAssert(void);
+int dsdblm_CreateBlock(unsigned int address)
+{
+   address = dsdblm_GetBlockAddress();
+   if (address >= (void*)0x00020000)
+     error_LocalAssert();
+   return address;
+}