From ae40aa627eb51355fad1585be4e8d722f5a0825a Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Sun, 18 Oct 2015 13:51:27 -0500
Subject: [PATCH] Apply sorting in various spots to make code generation
 deterministic

---
 loopy/schedule.py          | 8 ++++----
 loopy/target/c/__init__.py | 6 ++++--
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/loopy/schedule.py b/loopy/schedule.py
index f22b95d45..f276e2f12 100644
--- a/loopy/schedule.py
+++ b/loopy/schedule.py
@@ -1039,7 +1039,7 @@ def get_barrier_needing_dependency(kernel, target, source, reverse, var_kind):
     raw = tgt_read & src_write
     war = tgt_write & src_read
 
-    for var_name in raw | war:
+    for var_name in sorted(raw | war):
         return DependencyRecord(
                 source=source,
                 target=target,
@@ -1050,7 +1050,7 @@ def get_barrier_needing_dependency(kernel, target, source, reverse, var_kind):
     if source is target:
         return None
 
-    for var_name in waw:
+    for var_name in sorted(waw):
         return DependencyRecord(
                 source=source,
                 target=target,
@@ -1213,7 +1213,7 @@ def insert_barriers(kernel, schedule, reverse, kind, level=0):
 
             # (for leading (before-first-barrier) bit of loop body)
             for insn_id in insn_ids_from_schedule(subresult[:first_barrier_index]):
-                search_set = candidates
+                search_set = sorted(candidates)
 
                 for dep_src_insn_id in search_set:
                     dep = get_barrier_needing_dependency(
@@ -1252,7 +1252,7 @@ def insert_barriers(kernel, schedule, reverse, kind, level=0):
         elif isinstance(sched_item, RunInstruction):
             i += 1
 
-            search_set = candidates
+            search_set = sorted(candidates)
 
             for dep_src_insn_id in search_set:
                 dep = get_barrier_needing_dependency(
diff --git a/loopy/target/c/__init__.py b/loopy/target/c/__init__.py
index ca71c2126..628e5d9ac 100644
--- a/loopy/target/c/__init__.py
+++ b/loopy/target/c/__init__.py
@@ -102,7 +102,9 @@ class CTarget(TargetBase):
                 sub_tp, sub_decl = self.subdecl.get_decl_pair()
                 return sub_tp, ("*const restrict %s" % sub_decl)
 
-        for tv in six.itervalues(kernel.temporary_variables):
+        for tv in sorted(
+                six.itervalues(kernel.temporary_variables),
+                key=lambda tv: tv.name):
             decl_info = tv.decl_info(self, index_dtype=kernel.index_dtype)
 
             if not tv.base_storage:
@@ -166,7 +168,7 @@ class CTarget(TargetBase):
                             idi.dtype.itemsize
                             * product(si for si in idi.shape))
 
-        for bs_name, bs_sizes in six.iteritems(base_storage_sizes):
+        for bs_name, bs_sizes in sorted(six.iteritems(base_storage_sizes)):
             bs_var_decl = POD(self, np.int8, bs_name)
             if base_storage_to_is_local[bs_name]:
                 bs_var_decl = CLLocal(bs_var_decl)
-- 
GitLab