From 01ffdaa58324ed77c5c2c87db81bc86e1e4e2bf0 Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Thu, 20 Sep 2018 16:03:34 +0200
Subject: [PATCH] Evaluate boundary predicates to discard silly conditions like
 1 == 0

---
 python/dune/perftool/pdelab/localoperator.py | 17 ++++++++++++++---
 python/dune/perftool/sumfact/accumulation.py |  2 ++
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py
index 3fb213c8..4fb63710 100644
--- a/python/dune/perftool/pdelab/localoperator.py
+++ b/python/dune/perftool/pdelab/localoperator.py
@@ -281,7 +281,7 @@ def determine_accumulation_space(info, number):
 
 
 def boundary_predicates(expr, measure, subdomain_id):
-    predicates = frozenset([])
+    predicates = []
 
     if subdomain_id not in ['everywhere', 'otherwise']:
         # Get the original form and inspect the present measures
@@ -301,9 +301,18 @@ def boundary_predicates(expr, measure, subdomain_id):
             visitor = get_visitor(measure, subdomain_id)
             subdomain_data = visitor(subdomain_data, do_predicates=True)
 
-        predicates = predicates.union([prim.Comparison(subdomain_data, '==', subdomain_id)])
+        p = prim.Comparison(subdomain_data, '==', subdomain_id)
 
-    return predicates
+        # Try to find conditions that are always 0 or always 1
+        from pymbolic.mapper.evaluator import evaluate
+        try:
+            eval = evaluate(p)
+            if not eval:
+                predicates.append(False)
+        except:
+            predicates.append(p)
+
+    return frozenset(predicates)
 
 
 class PDELabAccumulationInfo(ImmutableRecord):
@@ -392,6 +401,8 @@ def generate_accumulation_instruction(expr, visitor):
     accumvar = name_accumulation_variable(test_lfs.get_restriction() + ansatz_lfs.get_restriction())
 
     predicates = boundary_predicates(expr, visitor.measure, visitor.subdomain_id)
+    if False in predicates:
+        return
 
     rank = 1 if ansatz_lfs.lfs is None else 2
 
diff --git a/python/dune/perftool/sumfact/accumulation.py b/python/dune/perftool/sumfact/accumulation.py
index dff7cfcc..61e39ffa 100644
--- a/python/dune/perftool/sumfact/accumulation.py
+++ b/python/dune/perftool/sumfact/accumulation.py
@@ -402,6 +402,8 @@ def generate_accumulation_instruction(expr, visitor):
                                      visitor.measure,
                                      visitor.subdomain_id,
                                      )
+    if False in predicates:
+        return
 
     insn_dep = None
 
-- 
GitLab