]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/45869 (type mismatch in shift expression produces ice with -O3 and...
authorRichard Guenther <rguenther@suse.de>
Thu, 7 Oct 2010 14:32:20 +0000 (14:32 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 7 Oct 2010 14:32:20 +0000 (14:32 +0000)
2010-10-07  Richard Guenther  <rguenther@suse.de>

PR middle-end/45869
* tree-cfg.c (verify_gimple_assign_binary): Allow vector shifts
of pointers.

* gcc.dg/torture/pr45869.c: New testcase.

From-SVN: r165113

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr45869.c [new file with mode: 0644]
gcc/tree-cfg.c

index e18f7008a5d0388932190ab215d21dc0ce8a273d..2768905ea87b323d4e1174f1fc0b968521f9aaab 100644 (file)
@@ -1,3 +1,9 @@
+2010-10-07  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/45869
+       * tree-cfg.c (verify_gimple_assign_binary): Allow vector shifts
+       of pointers.
+
 2010-10-07  Alan Modra  <amodra@gmail.com>
 
        * config/rs6000/rs6000.c (rs6000_emit_prologue): Use gen_int_mode
index f78e4962bd6c889b1c37f32d1aac647871672b4e..515582ed7fe2a27abdccb0a795fe1e0227832d7e 100644 (file)
@@ -1,3 +1,8 @@
+2010-10-07  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/45869
+       * gcc.dg/torture/pr45869.c: New testcase.
+
 2010-10-07  Iain Sandoe  <iains@gcc.gnu.org>
 
        * objc.dg/set-not-used-1.m: New
diff --git a/gcc/testsuite/gcc.dg/torture/pr45869.c b/gcc/testsuite/gcc.dg/torture/pr45869.c
new file mode 100644 (file)
index 0000000..e01977b
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+
+char *
+foo (unsigned int count, void **list)
+{
+  char *minaddr = (char *) list[0];
+  unsigned int i; /* NOTE: change of type to "int" eliminates the ICE */
+  for (i = 1; i < count; i++)
+    {
+      char *addr = (char *) list[i];
+      if (addr < minaddr)
+       minaddr = addr;
+    }
+  return minaddr;
+}
index cf67fb8613efb0bf7820beb638f30388573dbe64..d1ee63a31324203f7b57d2c2cabc45d08f2a0469 100644 (file)
@@ -3422,6 +3422,7 @@ verify_gimple_assign_binary (gimple stmt)
       {
        if (TREE_CODE (rhs1_type) != VECTOR_TYPE
            || !(INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
+                || POINTER_TYPE_P (TREE_TYPE (rhs1_type))
                 || FIXED_POINT_TYPE_P (TREE_TYPE (rhs1_type))
                 || SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type)))
            || (!INTEGRAL_TYPE_P (rhs2_type)
@@ -3435,9 +3436,9 @@ verify_gimple_assign_binary (gimple stmt)
            debug_generic_expr (rhs2_type);
            return true;
          }
-       /* For shifting a vector of floating point components we
+       /* For shifting a vector of non-integral components we
           only allow shifting by a constant multiple of the element size.  */
-       if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type))
+       if (!INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
            && (TREE_CODE (rhs2) != INTEGER_CST
                || !div_if_zero_remainder (EXACT_DIV_EXPR, rhs2,
                                           TYPE_SIZE (TREE_TYPE (rhs1_type)))))