From bf8e3b779b1b243380234ae11f1be99b83ee1178 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Wed, 3 Feb 2010 11:13:17 +0000 Subject: [PATCH] re PR tree-optimization/42927 (type mismatch in shift expression produces ice with -O3) 2010-02-03 Richard Guenther PR middle-end/42927 * tree-cfg.c (verify_gimple_assign_binary): Fix shift verification. * gcc.c-torture/compile/pr42927.c: New testcase. From-SVN: r156464 --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr42927.c | 32 +++++++++++++++++++++++++++ gcc/tree-cfg.c | 6 ++--- 4 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr42927.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e6a4218..0119d35 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-02-03 Richard Guenther + + PR middle-end/42927 + * tree-cfg.c (verify_gimple_assign_binary): Fix shift verification. + 2010-02-03 Rainer Orth * config.gcc: Reenable check for obsolete targets. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 85dc692..ccfdb6b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-02-03 Richard Guenther + + PR middle-end/42927 + * gcc.c-torture/compile/pr42927.c: New testcase. + 2010-02-03 Tobias Burnus PR fortran/42936 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr42927.c b/gcc/testsuite/gcc.c-torture/compile/pr42927.c new file mode 100644 index 0000000..ada919f --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr42927.c @@ -0,0 +1,32 @@ +typedef unsigned int u_int8_t __attribute__ ((__mode__ (__QI__))); +typedef unsigned int u_int32_t __attribute__ ((__mode__ (__SI__))); +typedef enum { READ_SHARED = 0, WRITE_EXCLUSIVE = 1, + READ_EXCLUSIVE = 2, EXCLUSIVE_ACCESS = 3 } scsires_access_mode; +struct scsires_extent_elem { + scsires_access_mode mode; + unsigned relative_address; + u_int32_t first_block; + u_int32_t length; +}; +typedef struct scsires_extent_elem scsires_extent_elem_t; +struct scsires_extent { + u_int8_t num_elements; + scsires_extent_elem_t *elements; +}; +typedef struct scsires_extent scsires_extent_t; +unsigned char buf[512]; +void scsires_issue_reservation(scsires_extent_t * new_extent) +{ + int i; + for (i = 0; i < new_extent->num_elements; i++) + { + buf[(i * 8)] = new_extent->elements[i].mode; + buf[(i * 8) + 1] = ((new_extent->elements[i].length >> 16) & 0xff); + buf[(i * 8) + 2] = ((new_extent->elements[i].length >> 8) & 0xff); + buf[(i * 8) + 3] = (new_extent->elements[i].length & 0xff); + buf[(i * 8) + 4] = ((new_extent->elements[i].first_block >> 24) & 0xff); + buf[(i * 8) + 5] = ((new_extent->elements[i].first_block >> 16) & 0xff); + buf[(i * 8) + 6] = ((new_extent->elements[i].first_block >> 8) & 0xff); + buf[(i * 8) + 7] = (new_extent->elements[i].first_block & 0xff); + } +} diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 361b46e..e5ed9ec 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -3287,13 +3287,13 @@ verify_gimple_assign_binary (gimple stmt) if ((!INTEGRAL_TYPE_P (rhs1_type) && !FIXED_POINT_TYPE_P (rhs1_type) && !(TREE_CODE (rhs1_type) == VECTOR_TYPE - && TREE_CODE (TREE_TYPE (rhs1_type)) == INTEGER_TYPE)) + && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type)))) || (!INTEGRAL_TYPE_P (rhs2_type) /* Vector shifts of vectors are also ok. */ && !(TREE_CODE (rhs1_type) == VECTOR_TYPE - && TREE_CODE (TREE_TYPE (rhs1_type)) == INTEGER_TYPE + && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type)) && TREE_CODE (rhs2_type) == VECTOR_TYPE - && TREE_CODE (TREE_TYPE (rhs2_type)) == INTEGER_TYPE)) + && INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type)))) || !useless_type_conversion_p (lhs_type, rhs1_type)) { error ("type mismatch in shift expression"); -- 2.7.4