diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 077b6e6b9dc..5cff766695d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-03-22 Richard Guenther + + PR tree-optimization/43390 + * tree-vect-stmts.c (get_vectype_for_scalar_type): Make + sure vector extracts are type correct. + 2010-03-22 Richard Guenther PR middle-end/40106 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 73e978a046b..a036f250806 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-03-22 Richard Guenther + + PR tree-optimization/43390 + * gfortran.fortran-torture/execute/pr43390.f90: New testcase. + 2010-03-21 Kaveh R. Ghazi * gcc.target/powerpc/ppc-sdata-1.c: Require nonpic. diff --git a/gcc/testsuite/gfortran.fortran-torture/execute/pr43390.f90 b/gcc/testsuite/gfortran.fortran-torture/execute/pr43390.f90 new file mode 100644 index 00000000000..b54eef99f24 --- /dev/null +++ b/gcc/testsuite/gfortran.fortran-torture/execute/pr43390.f90 @@ -0,0 +1,9 @@ + logical :: l1(4) + logical :: l2(4) + l1 = (/.TRUE.,.FALSE.,.TRUE.,.FALSE./) + l2 = (/.FALSE.,.TRUE.,.FALSE.,.TRUE./) + if (dot_product (l1, l2)) call abort () + l2 = .TRUE. + if (.not.dot_product (l1, l2)) call abort () +end + diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index ce604b3dea6..4bce61afd97 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -4417,6 +4417,14 @@ get_vectype_for_scalar_type (tree scalar_type) if (nbytes < TYPE_ALIGN_UNIT (scalar_type)) return NULL_TREE; + /* If we'd build a vector type of elements whose mode precision doesn't + match their types precision we'll get mismatched types on vector + extracts via BIT_FIELD_REFs. This effectively means we disable + vectorization of bool and/or enum types in some languages. */ + if (INTEGRAL_TYPE_P (scalar_type) + && GET_MODE_BITSIZE (inner_mode) != TYPE_PRECISION (scalar_type)) + return NULL_TREE; + /* FORNOW: Only a single vector size per mode (UNITS_PER_SIMD_WORD) is expected. */ nunits = UNITS_PER_SIMD_WORD (inner_mode) / nbytes;