Fix bug where a<<1 was not immediately optimized, and other minor changes.

* Add a TODO.
* Don't make two fold passes if DCR is off.
* Remove comment about parentheses that no longer applies.
This commit is contained in:
Sei Lisa 2015-03-28 14:43:11 +01:00
parent edbc240408
commit 2a617b34d0
2 changed files with 4 additions and 7 deletions

View file

@ -510,15 +510,10 @@ class foldconst(object):
# Transforming << into multiply saves some bytes.
if child[1]['value'] & 31:
# x << 3 --> x * 8
# Do we need parentheses for *? It depends on x
# e.g. x+3<<3 needs parentheses when converted to (x+3)*8
# We can have {<< {<< x y} 3} -> (x << y) * 8 but we can't
# have e.g. {<< {& x y} 3}; there will be explicit
# parentheses here always, so we don't need to worry.
# we have {<<, something, {CONST n}}
# we transform it into {*, something, {CONST n}}
node['nt'] = '*'
nt = node['nt'] = '*'
child[1]['value'] = 1 << (child[1]['value'] & 31)
# Fall through to optimize product
@ -624,6 +619,8 @@ class foldconst(object):
return
if nt in ('<', '>'):
# TODO: If function domain is -1..INT_MAX, treat <0 as !=-1
# i>2147483647 to FALSE if SEF, otherwise convert to a&0
# i<-2147483648 to FALSE if SEF, otherwise convert to a&0
a, b = 0, 1

View file

@ -89,7 +89,7 @@ class optimizer(foldconst, renamer, deadcode):
# Make another fold pass, since RemoveDeadCode can embed expressions
# into other expressions and generate unoptimized code.
if self.constfold:
if self.constfold and self.dcr:
self.FoldScript(warningpass=True)
if self.shrinknames: