aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-10-07 14:32:20 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-10-07 14:32:20 +0000
commit65dcb9012117bf260ab72b9703e659685e9877e4 (patch)
treee9b5f1aa96b4525117c2725ade79dac2761fefd4 /gcc
parent7427ba36d54d467d0a9ed24dfcf536d29ecd9859 (diff)
downloadgcc-65dcb9012117bf260ab72b9703e659685e9877e4.zip
gcc-65dcb9012117bf260ab72b9703e659685e9877e4.tar.gz
gcc-65dcb9012117bf260ab72b9703e659685e9877e4.tar.bz2
re PR middle-end/45869 (type mismatch in shift expression produces ice with -O3 and -m32)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr45869.c15
-rw-r--r--gcc/tree-cfg.c5
4 files changed, 29 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e18f700..2768905 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f78e496..515582e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..e01977b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr45869.c
@@ -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;
+}
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index cf67fb8..d1ee63a3 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -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)))))