--- /dev/null
+/* { dg-do compile } */
+/* { dg-additional-options "-Ofast" } */
+
+typedef struct {
+ double real;
+ double imag;
+} complex;
+typedef struct {
+ complex e[3][3];
+} su3_matrix;
+su3_matrix check_su3_c;
+double check_su3_ar, check_su3_ari, check_su3_max;
+int arireturn();
+int check_su3() {
+ check_su3_ar = check_su3_c.e[0][0].real * check_su3_c.e[1][0].real +
+ check_su3_c.e[0][0].imag * check_su3_c.e[1][0].imag +
+ check_su3_c.e[0][1].real * check_su3_c.e[1][1].real +
+ check_su3_c.e[0][1].imag * check_su3_c.e[1][1].imag +
+ check_su3_c.e[0][2].real * check_su3_c.e[1][2].real +
+ check_su3_c.e[0][2].imag * check_su3_c.e[1][2].imag;
+ check_su3_max = check_su3_c.e[0][0].real * check_su3_c.e[2][0].real +
+ check_su3_c.e[0][0].imag * check_su3_c.e[2][0].imag +
+ check_su3_c.e[0][1].real * check_su3_c.e[2][1].real +
+ check_su3_c.e[0][1].imag * check_su3_c.e[2][1].imag +
+ check_su3_c.e[0][2].real * check_su3_c.e[2][2].real +
+ check_su3_c.e[0][2].imag * check_su3_c.e[2][2].imag;
+ check_su3_ari = check_su3_ar;
+ if (check_su3_ari)
+ check_su3_max = check_su3_c.e[1][0].real * check_su3_c.e[2][0].real +
+ check_su3_c.e[1][0].imag * check_su3_c.e[2][0].imag +
+ check_su3_c.e[1][1].real * check_su3_c.e[2][1].real +
+ check_su3_c.e[1][1].imag * check_su3_c.e[2][1].imag +
+ check_su3_c.e[1][2].real * check_su3_c.e[2][2].real +
+ check_su3_c.e[1][2].imag * check_su3_c.e[2][2].imag;
+ if (check_su3_max)
+ arireturn();
+ return 0;
+}
vertices.safe_push (slpg_vertex (node));
bool leaf = true;
+ bool force_leaf = false;
FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), i, child)
if (child)
{
leaf = false;
vect_slp_build_vertices (visited, child, vertices, leafs);
}
- if (leaf)
+ else
+ force_leaf = true;
+ /* Since SLP discovery works along use-def edges all cycles have an
+ entry - but there's the exception of cycles where we do not handle
+ the entry explicitely (but with a NULL SLP node), like some reductions
+ and inductions. Force those SLP PHIs to act as leafs to make them
+ backwards reachable. */
+ if (leaf || force_leaf)
leafs.safe_push (node->vertex);
}
unsigned i;
slp_instance instance;
FOR_EACH_VEC_ELT (info->slp_instances, i, instance)
- {
- unsigned n_v = vertices.length ();
- unsigned n_l = leafs.length ();
- vect_slp_build_vertices (visited, SLP_INSTANCE_TREE (instance), vertices,
- leafs);
- /* If we added vertices but no entries to the reverse graph we've
- added a cycle that is not backwards-reachable. Push the entry
- to mimic as leaf then. */
- if (vertices.length () > n_v
- && leafs.length () == n_l)
- leafs.safe_push (SLP_INSTANCE_TREE (instance)->vertex);
- }
+ vect_slp_build_vertices (visited, SLP_INSTANCE_TREE (instance), vertices,
+ leafs);
}
/* Apply (reverse) bijectite PERM to VEC. */