Commit dab12601 by Dorit Nuzman Committed by Dorit Nuzman

re PR tree-optimization/33301 (wrong vectorization factor due to an invariant…

re PR tree-optimization/33301 (wrong vectorization factor due to an invariant type-promotion in the loop)

        PR tree-optimization/33301
        * tree-vect-analyze (analyze_operations): Look at the type of the rhs
        when relevant.

From-SVN: r128265
parent f1979d7e
2007-09-08 Dorit Nuzman <dorit@il.ibm.com>
PR tree-optimization/33301
* tree-vect-analyze (analyze_operations): Look at the type of the rhs
when relevant.
2007-09-07 Zdenek Dvorak <ook@ucw.cz> 2007-09-07 Zdenek Dvorak <ook@ucw.cz>
PR tree-optimization/32183 PR tree-optimization/32183
2007-09-08 Dorit Nuzman <dorit@il.ibm.com>
PR tree-optimization/33301
* gfortran.dg/vect/pr33301.f: New test.
2007-09-07 Jerry DeLisle <jvdelisle@gcc.gnu.org> 2007-09-07 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libfortran/33307 PR libfortran/33307
c { dg-do compile }
C Derived from lapack
SUBROUTINE ZGELSX( M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND, RANK,
$ WORK, RWORK, INFO )
COMPLEX(kind=8) WORK( * )
c Following declaration added on transfer to gfortran testsuite.
c It is present in original lapack source
integer rank
DO 20 I = 1, RANK
WORK( ISMAX+I-1 ) = S2*WORK( ISMAX+I-1 )
20 CONTINUE
END
c { dg-final { cleanup-tree-dump "vect" } }
...@@ -216,21 +216,38 @@ vect_determine_vectorization_factor (loop_vec_info loop_vinfo) ...@@ -216,21 +216,38 @@ vect_determine_vectorization_factor (loop_vec_info loop_vinfo)
} }
else else
{ {
tree operation;
gcc_assert (! STMT_VINFO_DATA_REF (stmt_info) gcc_assert (! STMT_VINFO_DATA_REF (stmt_info)
&& !is_pattern_stmt_p (stmt_info)); && !is_pattern_stmt_p (stmt_info));
/* We set the vectype according to the type of the result (lhs). /* We generally set the vectype according to the type of the
result (lhs).
For stmts whose result-type is different than the type of the For stmts whose result-type is different than the type of the
arguments (e.g. demotion, promotion), vectype will be reset arguments (e.g. demotion, promotion), vectype will be reset
appropriately (later). Note that we have to visit the smallest appropriately (later). Note that we have to visit the smallest
datatype in this function, because that determines the VF. datatype in this function, because that determines the VF.
If the smallest datatype in the loop is present only as the If the smallest datatype in the loop is present only as the
rhs of a promotion operation - we'd miss it here. rhs of a promotion operation - we'd miss it here.
However, in such a case, that a variable of this datatype Such a case, where a variable of this datatype does not appear
does not appear in the lhs anywhere in the loop, it shouldn't in the lhs anywhere in the loop, can only occur if it's an
affect the vectorization factor. */ invariant: e.g.: 'int_x = (int) short_inv', which we'd expect
to have been optimized away by invariant motion. However, we
cannot rely on invariant motion to always take invariants out
of the loop, and so in the case of promotion we also have to
check the rhs. */
scalar_type = TREE_TYPE (GIMPLE_STMT_OPERAND (stmt, 0)); scalar_type = TREE_TYPE (GIMPLE_STMT_OPERAND (stmt, 0));
operation = GIMPLE_STMT_OPERAND (stmt, 1);
if (TREE_CODE (operation) == NOP_EXPR
|| TREE_CODE (operation) == CONVERT_EXPR
|| TREE_CODE (operation) == WIDEN_MULT_EXPR)
{
tree rhs_type = TREE_TYPE (TREE_OPERAND (operation, 0));
if (TYPE_SIZE_UNIT (rhs_type) < TYPE_SIZE_UNIT (scalar_type))
scalar_type = TREE_TYPE (TREE_OPERAND (operation, 0));
}
if (vect_print_dump_info (REPORT_DETAILS)) if (vect_print_dump_info (REPORT_DETAILS))
{ {
fprintf (vect_dump, "get vectype for scalar type: "); fprintf (vect_dump, "get vectype for scalar type: ");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment