From 44e0db96d26aebea46484417e2a0c4219f5f889a Mon Sep 17 00:00:00 2001 From: Sei Lisa Date: Wed, 2 Aug 2017 01:40:48 +0200 Subject: [PATCH] Optimize bool|1, bool&1 when possible. a & 1 is always a, if a is boolean. a | 1 is always 1, if a is boolean, but it can only be optimized out if a is side effect-free. --- lslopt/lslfoldconst.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lslopt/lslfoldconst.py b/lslopt/lslfoldconst.py index c108450..b60d39a 100644 --- a/lslopt/lslfoldconst.py +++ b/lslopt/lslfoldconst.py @@ -824,13 +824,15 @@ class foldconst(object): if child[b]['nt'] == 'CONST': val = child[b]['value'] - if val == 0 and nt == '|' or val == -1 and nt == '&': + if nt == '|' and val == 0 or nt == '&' and (val == -1 or val == 1 and self.IsBool(child[a])): # a|0 -> a # a&-1 -> a + # a&1 -> a if a is boolean parent[index] = child[a] return - if val == -1 and nt == '|' or val == 0 and nt == '&': + if nt == '|' and (val == -1 or val == 1 and self.IsBool(child[a])) or nt == '&' and val == 0: # a|-1 -> -1 if a is SEF + # a|1 -> 1 if a is bool and SEF # a&0 -> 0 if a is SEF if 'SEF' in child[a]: parent[index] = child[b]