瀏覽代碼

* check addr_taken when propagating constants
* do constant propagation on static var syms as well

git-svn-id: trunk@26297 -

florian 11 年之前
父節點
當前提交
e9777503d1
共有 1 個文件被更改,包括 14 次插入8 次删除
  1. 14 8
      compiler/optconstprop.pas

+ 14 - 8
compiler/optconstprop.pas

@@ -249,14 +249,20 @@ unit optconstprop;
 
                     l:=a.left;
 
-                    if (((l.nodetype=loadn) and
-                         (tloadnode(l).symtableentry.typ=localvarsym) and
-                         (tloadnode(l).symtable=current_procinfo.procdef.localst)
-                        ) or
-                        ((l.nodetype=loadn) and
-                         (tloadnode(l).symtableentry.typ=paravarsym) and
-                         (tloadnode(l).symtable=current_procinfo.procdef.parast)
-                        ) or
+                    if ((((l.nodetype=loadn) and
+                         { its address cannot have escaped the current routine }
+                         not(tabstractvarsym(tloadnode(l).symtableentry).addr_taken)) and
+                         ((
+                           (tloadnode(l).symtableentry.typ=localvarsym) and
+                           (tloadnode(l).symtable=current_procinfo.procdef.localst)
+                          ) or
+                          ((tloadnode(l).symtableentry.typ=paravarsym) and
+                           (tloadnode(l).symtable=current_procinfo.procdef.parast)
+                          ) or
+                          ((tloadnode(l).symtableentry.typ=staticvarsym) and
+                           (tloadnode(l).symtable.symtabletype=staticsymtable)
+                          )
+                         )) or
                         (l.nodetype = temprefn)) and
                        (is_constintnode(a.right) or
                         is_constboolnode(a.right) or