Browse Source

* do not generate moves unncesssarily in tcgloadparentfpnode.pass_generate_code

git-svn-id: trunk@45162 -
florian 5 years ago
parent
commit
50c221670f
1 changed files with 22 additions and 17 deletions
  1. 22 17
      compiler/ncgmem.pas

+ 22 - 17
compiler/ncgmem.pas

@@ -167,29 +167,34 @@ implementation
           end
           end
         else
         else
           begin
           begin
-            currpi:=current_procinfo;
             location_reset(location,LOC_REGISTER,def_cgsize(parentfpvoidpointertype));
             location_reset(location,LOC_REGISTER,def_cgsize(parentfpvoidpointertype));
-            location.register:=hlcg.getaddressregister(current_asmdata.CurrAsmList,parentfpvoidpointertype);
+            currpi:=current_procinfo;
             { load framepointer of current proc }
             { load framepointer of current proc }
             hsym:=tparavarsym(currpi.procdef.parast.Find('parentfp'));
             hsym:=tparavarsym(currpi.procdef.parast.Find('parentfp'));
             if not assigned(hsym) then
             if not assigned(hsym) then
               internalerror(200309281);
               internalerror(200309281);
-            hlcg.a_load_loc_reg(current_asmdata.CurrAsmList,parentfpvoidpointertype,parentfpvoidpointertype,hsym.localloc,location.register);
-            { walk parents }
-            while (currpi.procdef.owner.symtablelevel>parentpd.parast.symtablelevel) do
+            if (currpi.procdef.owner.symtablelevel=parentpd.parast.symtablelevel) and (hsym.localloc.loc in [LOC_REGISTER,LOC_CREGISTER]) then
+              location.register:=hsym.localloc.register
+            else
               begin
               begin
-                currpi:=currpi.parent;
-                if not assigned(currpi) then
-                  internalerror(200311201);
-                hsym:=tparavarsym(currpi.procdef.parast.Find('parentfp'));
-                if not assigned(hsym) then
-                  internalerror(200309282);
-
-                if hsym.localloc.loc<>LOC_REFERENCE then
-                  internalerror(200309283);
-
-                hlcg.reference_reset_base(href,parentfpvoidpointertype,location.register,hsym.localloc.reference.offset,ctempposinvalid,parentfpvoidpointertype.alignment,[]);
-                hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,parentfpvoidpointertype,parentfpvoidpointertype,href,location.register);
+                location.register:=hlcg.getaddressregister(current_asmdata.CurrAsmList,parentfpvoidpointertype);
+                hlcg.a_load_loc_reg(current_asmdata.CurrAsmList,parentfpvoidpointertype,parentfpvoidpointertype,hsym.localloc,location.register);
+                { walk parents }
+                while (currpi.procdef.owner.symtablelevel>parentpd.parast.symtablelevel) do
+                  begin
+                    currpi:=currpi.parent;
+                    if not assigned(currpi) then
+                      internalerror(200311201);
+                    hsym:=tparavarsym(currpi.procdef.parast.Find('parentfp'));
+                    if not assigned(hsym) then
+                      internalerror(200309282);
+
+                    if hsym.localloc.loc<>LOC_REFERENCE then
+                      internalerror(200309283);
+
+                    hlcg.reference_reset_base(href,parentfpvoidpointertype,location.register,hsym.localloc.reference.offset,ctempposinvalid,parentfpvoidpointertype.alignment,[]);
+                    hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,parentfpvoidpointertype,parentfpvoidpointertype,href,location.register);
+                  end;
               end;
               end;
           end;
           end;
       end;
       end;