mirror of
https://github.com/Sei-Lisa/LSL-PyOptimizer
synced 2025-07-01 23:58:20 +00:00
Add missing operators & returns, remove typecast bogus optimization.
This commit is contained in:
parent
33440f5dd4
commit
d98e145090
1 changed files with 20 additions and 15 deletions
|
@ -1,7 +1,6 @@
|
||||||
|
|
||||||
import lslfuncs
|
import lslfuncs
|
||||||
from lslparse import S
|
from lslparse import S
|
||||||
import math
|
|
||||||
|
|
||||||
CONSTANT = S['CONSTANT']
|
CONSTANT = S['CONSTANT']
|
||||||
|
|
||||||
|
@ -10,6 +9,7 @@ class optimizer(object):
|
||||||
# explicitly exclude assignments
|
# explicitly exclude assignments
|
||||||
binary_ops = frozenset(('+','-','*','/','%','<<','>>','<','<=','>','>=',
|
binary_ops = frozenset(('+','-','*','/','%','<<','>>','<','<=','>','>=',
|
||||||
'==','!=','|','^','&','||','&&'))
|
'==','!=','|','^','&','||','&&'))
|
||||||
|
assign_ops = frozenset(('=','+=','-=','*=','/=','%=','&=','|=','^=','<<=','>>='))
|
||||||
|
|
||||||
def FoldAndRemoveEmptyStmts(self, lst):
|
def FoldAndRemoveEmptyStmts(self, lst):
|
||||||
"""Utility function for elimination of useless expressions in FOR"""
|
"""Utility function for elimination of useless expressions in FOR"""
|
||||||
|
@ -43,6 +43,10 @@ class optimizer(object):
|
||||||
|
|
||||||
code0 = code[0]
|
code0 = code[0]
|
||||||
|
|
||||||
|
if code0 == CONSTANT:
|
||||||
|
# Job already done
|
||||||
|
return
|
||||||
|
|
||||||
if code0 == 'CAST':
|
if code0 == 'CAST':
|
||||||
self.FoldTree(code[2])
|
self.FoldTree(code[2])
|
||||||
if code[2][0] == CONSTANT:
|
if code[2][0] == CONSTANT:
|
||||||
|
@ -74,6 +78,7 @@ class optimizer(object):
|
||||||
self.FoldTree(code[2])
|
self.FoldTree(code[2])
|
||||||
if code[2][0] == CONSTANT:
|
if code[2][0] == CONSTANT:
|
||||||
code[:] = code[2]
|
code[:] = code[2]
|
||||||
|
return
|
||||||
|
|
||||||
if code0 in self.binary_ops:
|
if code0 in self.binary_ops:
|
||||||
# RTL evaluation
|
# RTL evaluation
|
||||||
|
@ -132,11 +137,11 @@ class optimizer(object):
|
||||||
code[:] = [S['*'], code[1], code[2], 1<<(code[3][2] & 31)]
|
code[:] = [S['*'], code[1], code[2], 1<<(code[3][2] & 31)]
|
||||||
return
|
return
|
||||||
|
|
||||||
if self.globalmode:
|
if code0 == 'IDENT':
|
||||||
if code0 == 'IDENT':
|
if self.globalmode:
|
||||||
if code[1] != 'key' and self.symtab[code[3]][code[2]][2] is not None:
|
if code[1] != 'key' and self.symtab[code[3]][code[2]][2] is not None:
|
||||||
code[:] = [CONSTANT, code[1], self.symtab[code[2]][2]]
|
code[:] = [CONSTANT, code[1], self.symtab[code[2]][2]]
|
||||||
return
|
return
|
||||||
|
|
||||||
if code0 == 'FUNCTION':
|
if code0 == 'FUNCTION':
|
||||||
for x in code[3][::-1]:
|
for x in code[3][::-1]:
|
||||||
|
@ -273,12 +278,23 @@ class optimizer(object):
|
||||||
if code0 == 'RETURN':
|
if code0 == 'RETURN':
|
||||||
if code[2] is not None:
|
if code[2] is not None:
|
||||||
self.FoldTree(code[2])
|
self.FoldTree(code[2])
|
||||||
|
return
|
||||||
|
|
||||||
if code0 == 'DECL':
|
if code0 == 'DECL':
|
||||||
# The expression code is elsewhere.
|
# The expression code is elsewhere.
|
||||||
expr = self.symtab[code[3]][code[2]][2]
|
expr = self.symtab[code[3]][code[2]][2]
|
||||||
if expr is not None:
|
if expr is not None:
|
||||||
self.FoldTree(expr)
|
self.FoldTree(expr)
|
||||||
|
return
|
||||||
|
|
||||||
|
if code0 in self.assign_ops:
|
||||||
|
self.FoldTree(code[3])
|
||||||
|
return
|
||||||
|
|
||||||
|
if code0 in ('V++','V--','--V','++V'):
|
||||||
|
return
|
||||||
|
|
||||||
|
raise Exception('Internal error: This should not happen, node = ' + code0)
|
||||||
|
|
||||||
def Fold(self, code, IsGlobal = True):
|
def Fold(self, code, IsGlobal = True):
|
||||||
assert type(code[2]) == tuple
|
assert type(code[2]) == tuple
|
||||||
|
@ -288,17 +304,6 @@ class optimizer(object):
|
||||||
# As a special case, we fold the constants that are keys,
|
# As a special case, we fold the constants that are keys,
|
||||||
# because the folder
|
# because the folder
|
||||||
|
|
||||||
# TODO: Move this to a post-folding optimization.
|
|
||||||
# Reasons: (1) it doesn't optimize deep constants and
|
|
||||||
# (2) it disturbs normal folding if done on the fly.
|
|
||||||
# Mono optimization: (integer)-5 and (float)-3.0 is cheaper.
|
|
||||||
if not IsGlobal and tree[0] == 'CONSTANT':
|
|
||||||
# Disabled because we print integer constants in hex anyway.
|
|
||||||
#if tree[1] == 'integer' and tree[2] < 0:
|
|
||||||
# tree[:] = [S['CAST'], 'integer', tree]
|
|
||||||
if tree[1] == 'float' and tree[2] < 0.0 and not math.isinf(tree[2]):
|
|
||||||
tree[:] = [S['CAST'], 'float', tree]
|
|
||||||
|
|
||||||
if type(code) == tuple:
|
if type(code) == tuple:
|
||||||
code = list(code)
|
code = list(code)
|
||||||
code[2] = tuple(tree)
|
code[2] = tuple(tree)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue