diff options
author | Richard Guenther <rguenther@suse.de> | 2010-02-03 11:13:17 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-02-03 11:13:17 +0000 |
commit | bf8e3b779b1b243380234ae11f1be99b83ee1178 (patch) | |
tree | b08b53403968aea320bed98029aab502cbe235c3 /gcc | |
parent | bde17fdc4d567a35701b35f26ac511ae42b8ec91 (diff) | |
download | gcc-bf8e3b779b1b243380234ae11f1be99b83ee1178.zip gcc-bf8e3b779b1b243380234ae11f1be99b83ee1178.tar.gz gcc-bf8e3b779b1b243380234ae11f1be99b83ee1178.tar.bz2 |
re PR tree-optimization/42927 (type mismatch in shift expression produces ice with -O3)
2010-02-03 Richard Guenther <rguenther@suse.de>
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr42927.c | 32 | ||||
-rw-r--r-- | gcc/tree-cfg.c | 6 |
4 files changed, 45 insertions, 3 deletions
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 <rguenther@suse.de> + + PR middle-end/42927 + * tree-cfg.c (verify_gimple_assign_binary): Fix shift verification. + 2010-02-03 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> * 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 <rguenther@suse.de> + + PR middle-end/42927 + * gcc.c-torture/compile/pr42927.c: New testcase. + 2010-02-03 Tobias Burnus <burnus@net-b.de> 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"); |