new file mode 100644
@@ -0,0 +1,49 @@
+! { dg-do run }
+
+subroutine dlartg( f, g, s, r )
+ implicit none
+ double precision :: f, g, r, s
+ double precision :: d, p
+
+ d = sqrt( f*f + g*g )
+ p = 1.d0 / d
+ if( abs( f ) > 1 ) then
+ s = g*sign( p, f )
+ r = sign( d, f )
+ else
+ s = g*sign( p, f )
+ r = sign( d, f )
+ end if
+end subroutine
+
+subroutine dhgeqz( n, h, t )
+ implicit none
+ integer n
+ double precision h( n, * ), t( n, * )
+ integer jc
+ double precision c, s, temp, temp2, tempr
+ temp2 = 10d0
+ call dlartg( 10d0, temp2, s, tempr )
+ c = 0.9d0
+ s = 1.d0
+ do jc = 1, n
+ temp = c*h( 1, jc ) + s*h( 2, jc )
+ h( 2, jc ) = -s*h( 1, jc ) + c*h( 2, jc )
+ h( 1, jc ) = temp
+ temp2 = c*t( 1, jc ) + s*t( 2, jc )
+ t( 2, jc ) = -s*t( 1, jc ) + c*t( 2, jc )
+ t( 1, jc ) = temp2
+ enddo
+end subroutine dhgeqz
+
+program test
+ implicit none
+ double precision h(2,2), t(2,2)
+ h = 0
+ t(1,1) = 1
+ t(2,1) = 0
+ t(1,2) = 0
+ t(2,2) = 0
+ call dhgeqz( 2, h, t )
+ if (t(2,2).ne.0) STOP 1
+end program test
@@ -5933,7 +5933,23 @@ vect_slp_analyze_node_operations_1 (vec_info *vinfo, slp_tree node,
/* Handle purely internal nodes. */
if (SLP_TREE_CODE (node) == VEC_PERM_EXPR)
- return vectorizable_slp_permutation (vinfo, NULL, node, cost_vec);
+ {
+ if (!vectorizable_slp_permutation (vinfo, NULL, node, cost_vec))
+ return false;
+
+ stmt_vec_info slp_stmt_info;
+ unsigned int i;
+ FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), i, slp_stmt_info)
+ {
+ if (STMT_VINFO_LIVE_P (slp_stmt_info)
+ && !vectorizable_live_operation (vinfo,
+ slp_stmt_info, NULL, node,
+ node_instance, i,
+ false, cost_vec))
+ return false;
+ }
+ return true;
+ }
gcc_assert (STMT_SLP_TYPE (stmt_info) != loop_vect);
@@ -8900,8 +8916,6 @@ vect_schedule_slp_node (vec_info *vinfo,
}
}
- bool done_p = false;
-
/* Handle purely internal nodes. */
if (SLP_TREE_CODE (node) == VEC_PERM_EXPR)
{
@@ -8912,9 +8926,18 @@ vect_schedule_slp_node (vec_info *vinfo,
but open-code it here (partly). */
bool done = vectorizable_slp_permutation (vinfo, &si, node, NULL);
gcc_assert (done);
- done_p = true;
+ stmt_vec_info slp_stmt_info;
+ unsigned int i;
+ FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), i, slp_stmt_info)
+ if (STMT_VINFO_LIVE_P (slp_stmt_info))
+ {
+ done = vectorizable_live_operation (vinfo,
+ slp_stmt_info, &si, node,
+ instance, i, true, NULL);
+ gcc_assert (done);
+ }
}
- if (!done_p)
+ else
vect_transform_stmt (vinfo, stmt_info, &si, node, instance);
}