tree-vect-data-refs.c (dr_group_sort_cmp): Do not use hash function in compare functi...
authorCong Hou <congh@google.com>
Tue, 16 Jul 2013 00:03:07 +0000 (20:03 -0400)
committerCong Hou <congh@gcc.gnu.org>
Tue, 16 Jul 2013 00:03:07 +0000 (20:03 -0400)
2013-07-15  Cong Hou  <congh@google.com>

gcc/
        * tree-vect-data-refs.c (dr_group_sort_cmp): Do not use hash function in compare function for sorting.

gcc/testsuite/

        * gcc.target/i386/l_fma_float_1.c: Update the instruction to be counted.
        * gcc.target/i386/l_fma_float_3.c: Likewise.
        * gcc.target/i386/l_fma_double_1.c: Likewise.
        * gcc.target/i386/l_fma_double_3.c: Likewise

From-SVN: r200968

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/l_fma_double_1.c
gcc/testsuite/gcc.target/i386/l_fma_double_3.c
gcc/testsuite/gcc.target/i386/l_fma_float_1.c
gcc/testsuite/gcc.target/i386/l_fma_float_3.c
gcc/tree-vect-data-refs.c

index d9c58e9e0cf9f849101e5537706aa42418e93c63..8248001bd6db27998353a95801e767f30ff018af 100644 (file)
@@ -1,3 +1,8 @@
+2013-07-15  Cong Hou  <congh@google.com>
+
+       * tree-vect-data-refs.c (dr_group_sort_cmp): Do not use hash function
+       in compare function for sorting.
+
 2013-07-15  Peter Bergner <bergner@vnet.ibm.com>
 
        * config.gcc (powerpc*-*-*): Install htmintrin.h and htmxlintrin.h.
index 817d2dcc4d0cef5ec469491f36aac83c6c3ded23..2388ed9ee9192225c46403e1f7ca8a439e09a17b 100644 (file)
@@ -1,3 +1,11 @@
+2013-07-15  Cong Hou  <congh@google.com>
+
+       * gcc.target/i386/l_fma_float_1.c: Update the instruction to be
+       counted.
+       * gcc.target/i386/l_fma_float_3.c: Likewise.
+       * gcc.target/i386/l_fma_double_1.c: Likewise.
+       * gcc.target/i386/l_fma_double_3.c: Likewise.
+
 2013-07-15  Peter Bergner  <bergner@vnet.ibm.com>
 
        * lib/target-supports.exp (check_effective_target_powerpc_htm_ok): New
index b3ffcf2c00fa5587410aa5b7ca09475115458cc4..3ceababec10022d676ab3899bb0b3f19c3a4f9a5 100644 (file)
@@ -10,9 +10,9 @@ typedef double adouble __attribute__((aligned(sizeof (double))));
 #include "l_fma_1.h"
 
 /* { dg-final { scan-assembler-times "vfmadd132pd" 4  } } */
-/* { dg-final { scan-assembler-times "vfmadd213pd" 4  } } */
+/* { dg-final { scan-assembler-times "vfmadd231pd" 4  } } */
 /* { dg-final { scan-assembler-times "vfmsub132pd" 4  } } */
-/* { dg-final { scan-assembler-times "vfmsub213pd" 4  } } */
+/* { dg-final { scan-assembler-times "vfmsub231pd" 4  } } */
 /* { dg-final { scan-assembler-times "vfnmadd132pd" 4  } } */
 /* { dg-final { scan-assembler-times "vfnmadd231pd" 4  } } */
 /* { dg-final { scan-assembler-times "vfnmsub132pd" 4  } } */
index cbc6ef832aa53fb230e066fcf72fe743d692472b..74e3e1c55dffb29ccdc4699bf0e6756843f3c338 100644 (file)
@@ -10,9 +10,9 @@ typedef double adouble __attribute__((aligned(sizeof (double))));
 #include "l_fma_3.h"
 
 /* { dg-final { scan-assembler-times "vfmadd132pd" 4  } } */
-/* { dg-final { scan-assembler-times "vfmadd213pd" 4  } } */
+/* { dg-final { scan-assembler-times "vfmadd231pd" 4  } } */
 /* { dg-final { scan-assembler-times "vfmsub132pd" 4  } } */
-/* { dg-final { scan-assembler-times "vfmsub213pd" 4  } } */
+/* { dg-final { scan-assembler-times "vfmsub231pd" 4  } } */
 /* { dg-final { scan-assembler-times "vfnmadd132pd" 4  } } */
 /* { dg-final { scan-assembler-times "vfnmadd231pd" 4  } } */
 /* { dg-final { scan-assembler-times "vfnmsub132pd" 4  } } */
index b2f58ac2f95e713288456fca4d283826495be50f..4a7ca95930e010d7a7629f67a1c48607f4c5f7f0 100644 (file)
@@ -9,9 +9,9 @@
 #include "l_fma_1.h"
 
 /* { dg-final { scan-assembler-times "vfmadd132ps" 4  } } */
-/* { dg-final { scan-assembler-times "vfmadd213ps" 4  } } */
+/* { dg-final { scan-assembler-times "vfmadd231ps" 4  } } */
 /* { dg-final { scan-assembler-times "vfmsub132ps" 4  } } */
-/* { dg-final { scan-assembler-times "vfmsub213ps" 4  } } */
+/* { dg-final { scan-assembler-times "vfmsub231ps" 4  } } */
 /* { dg-final { scan-assembler-times "vfnmadd132ps" 4  } } */
 /* { dg-final { scan-assembler-times "vfnmadd231ps" 4  } } */
 /* { dg-final { scan-assembler-times "vfnmsub132ps" 4  } } */
index 878babb31c51df67f6fd218f7518d8915e946a77..f3fa74f98bdae57fd4f3b68e4479918ef609f5ea 100644 (file)
@@ -9,9 +9,9 @@
 #include "l_fma_3.h"
 
 /* { dg-final { scan-assembler-times "vfmadd132ps" 4  } } */
-/* { dg-final { scan-assembler-times "vfmadd213ps" 4  } } */
+/* { dg-final { scan-assembler-times "vfmadd231ps" 4  } } */
 /* { dg-final { scan-assembler-times "vfmsub132ps" 4  } } */
-/* { dg-final { scan-assembler-times "vfmsub213ps" 4  } } */
+/* { dg-final { scan-assembler-times "vfmsub231ps" 4  } } */
 /* { dg-final { scan-assembler-times "vfnmadd132ps" 4  } } */
 /* { dg-final { scan-assembler-times "vfnmadd231ps" 4  } } */
 /* { dg-final { scan-assembler-times "vfnmsub132ps" 4  } } */
index 47ecad3528dc1cbff2becd0e4dd079e513590836..4e99747b73c062edffc1635a6a206542d6f63e42 100644 (file)
@@ -2311,6 +2311,81 @@ vect_analyze_data_ref_access (struct data_reference *dr)
   return vect_analyze_group_access (dr);
 }
 
+
+
+/*  A helper function used in the comparator function to sort data
+    references.  T1 and T2 are two data references to be compared.
+    The function returns -1, 0, or 1.  */
+
+static int
+compare_tree (tree t1, tree t2)
+{
+  int i, cmp;
+  enum tree_code code;
+  char tclass;
+
+  if (t1 == t2)
+    return 0;
+  if (t1 == NULL)
+    return -1;
+  if (t2 == NULL)
+    return 1;
+
+
+  if (TREE_CODE (t1) != TREE_CODE (t2))
+    return TREE_CODE (t1) < TREE_CODE (t2) ? -1 : 1;
+
+  code = TREE_CODE (t1);
+  switch (code)
+    {
+    /* For const values, we can just use hash values for comparisons.  */
+    case INTEGER_CST:
+    case REAL_CST:
+    case FIXED_CST:
+    case STRING_CST:
+    case COMPLEX_CST:
+    case VECTOR_CST:
+      {
+       hashval_t h1 = iterative_hash_expr (t1, 0);
+       hashval_t h2 = iterative_hash_expr (t2, 0);
+       if (h1 != h2)
+         return h1 < h2 ? -1 : 1;
+       break;
+      }
+
+    case SSA_NAME:
+      cmp = compare_tree (SSA_NAME_VAR (t1), SSA_NAME_VAR (t2));
+      if (cmp != 0)
+       return cmp;
+
+      if (SSA_NAME_VERSION (t1) != SSA_NAME_VERSION (t2))
+       return SSA_NAME_VERSION (t1) < SSA_NAME_VERSION (t2) ? -1 : 1;
+      break;
+
+    default:
+      tclass = TREE_CODE_CLASS (code);
+
+      /* For var-decl, we could compare their UIDs.  */
+      if (tclass == tcc_declaration)
+       {
+         if (DECL_UID (t1) != DECL_UID (t2))
+           return DECL_UID (t1) < DECL_UID (t2) ? -1 : 1;
+         break;
+       }
+
+      /* For expressions with operands, compare their operands recursively.  */
+      for (i = TREE_OPERAND_LENGTH (t1) - 1; i >= 0; --i)
+       {
+         cmp = compare_tree (TREE_OPERAND (t1, i), TREE_OPERAND (t2, i));
+         if (cmp != 0)
+           return cmp;
+       }
+    }
+
+  return 0;
+}
+
+
 /* Compare two data-references DRA and DRB to group them into chunks
    suitable for grouping.  */
 
@@ -2319,7 +2394,6 @@ dr_group_sort_cmp (const void *dra_, const void *drb_)
 {
   data_reference_p dra = *(data_reference_p *)const_cast<void *>(dra_);
   data_reference_p drb = *(data_reference_p *)const_cast<void *>(drb_);
-  hashval_t h1, h2;
   int cmp;
 
   /* Stabilize sort.  */
@@ -2329,19 +2403,17 @@ dr_group_sort_cmp (const void *dra_, const void *drb_)
   /* Ordering of DRs according to base.  */
   if (!operand_equal_p (DR_BASE_ADDRESS (dra), DR_BASE_ADDRESS (drb), 0))
     {
-      h1 = iterative_hash_expr (DR_BASE_ADDRESS (dra), 0);
-      h2 = iterative_hash_expr (DR_BASE_ADDRESS (drb), 0);
-      if (h1 != h2)
-       return h1 < h2 ? -1 : 1;
+      cmp = compare_tree (DR_BASE_ADDRESS (dra), DR_BASE_ADDRESS (drb));
+      if (cmp != 0)
+        return cmp;
     }
 
   /* And according to DR_OFFSET.  */
   if (!dr_equal_offsets_p (dra, drb))
     {
-      h1 = iterative_hash_expr (DR_OFFSET (dra), 0);
-      h2 = iterative_hash_expr (DR_OFFSET (drb), 0);
-      if (h1 != h2)
-       return h1 < h2 ? -1 : 1;
+      cmp = compare_tree (DR_OFFSET (dra), DR_OFFSET (drb));
+      if (cmp != 0)
+        return cmp;
     }
 
   /* Put reads before writes.  */
@@ -2352,19 +2424,18 @@ dr_group_sort_cmp (const void *dra_, const void *drb_)
   if (!operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (DR_REF (dra))),
                        TYPE_SIZE_UNIT (TREE_TYPE (DR_REF (drb))), 0))
     {
-      h1 = iterative_hash_expr (TYPE_SIZE_UNIT (TREE_TYPE (DR_REF (dra))), 0);
-      h2 = iterative_hash_expr (TYPE_SIZE_UNIT (TREE_TYPE (DR_REF (drb))), 0);
-      if (h1 != h2)
-       return h1 < h2 ? -1 : 1;
+      cmp = compare_tree (TYPE_SIZE_UNIT (TREE_TYPE (DR_REF (dra))),
+                          TYPE_SIZE_UNIT (TREE_TYPE (DR_REF (drb))));
+      if (cmp != 0)
+        return cmp;
     }
 
   /* And after step.  */
   if (!operand_equal_p (DR_STEP (dra), DR_STEP (drb), 0))
     {
-      h1 = iterative_hash_expr (DR_STEP (dra), 0);
-      h2 = iterative_hash_expr (DR_STEP (drb), 0);
-      if (h1 != h2)
-       return h1 < h2 ? -1 : 1;
+      cmp = compare_tree (DR_STEP (dra), DR_STEP (drb));
+      if (cmp != 0)
+        return cmp;
     }
 
   /* Then sort after DR_INIT.  In case of identical DRs sort after stmt UID.  */