Răsfoiți Sursa

* some fixes to loop strength reduction

git-svn-id: trunk@43911 -
florian 5 ani în urmă
părinte
comite
a9a711763f
1 a modificat fișierele cu 9 adăugiri și 7 ștergeri
  1. 9 7
      compiler/optloop.pas

+ 9 - 7
compiler/optloop.pas

@@ -287,6 +287,7 @@ unit optloop;
       function findpreviousstrengthreduction : boolean;
       function findpreviousstrengthreduction : boolean;
         var
         var
           i : longint;
           i : longint;
+          hp : tnode;
         begin
         begin
           result:=false;
           result:=false;
           for i:=0 to inductionexprs.count-1 do
           for i:=0 to inductionexprs.count-1 do
@@ -294,16 +295,17 @@ unit optloop;
               { do we already maintain one expression? }
               { do we already maintain one expression? }
               if tnode(inductionexprs[i]).isequal(n) then
               if tnode(inductionexprs[i]).isequal(n) then
                 begin
                 begin
-                  n.free;
                   case n.nodetype of
                   case n.nodetype of
                     muln:
                     muln:
-                      n:=ctemprefnode.create(ttempcreatenode(templist[i]));
+                      hp:=ctemprefnode.create(ttempcreatenode(templist[i]));
                     vecn:
                     vecn:
-                      n:=ctypeconvnode.create_internal(cderefnode.create(ctemprefnode.create(
+                      hp:=ctypeconvnode.create_internal(cderefnode.create(ctemprefnode.create(
                         ttempcreatenode(templist[i]))),n.resultdef);
                         ttempcreatenode(templist[i]))),n.resultdef);
                     else
                     else
                       internalerror(200809211);
                       internalerror(200809211);
                   end;
                   end;
+                  n.free;
+                  n:=hp;
                   result:=true;
                   result:=true;
                   exit;
                   exit;
                 end;
                 end;
@@ -429,14 +431,14 @@ unit optloop;
 
 
                       if lnf_backward in tfornode(arg).loopflags then
                       if lnf_backward in tfornode(arg).loopflags then
                         addstatement(calccodestatements,
                         addstatement(calccodestatements,
-                          geninlinenode(in_dec_x,false,
+                          cinlinenode.createintern(in_dec_x,false,
                           ccallparanode.create(ctemprefnode.create(tempnode),ccallparanode.create(
                           ccallparanode.create(ctemprefnode.create(tempnode),ccallparanode.create(
-                          cordconstnode.create(tcgvecnode(n).get_mul_size,tfornode(arg).right.resultdef,false),nil))))
+                          cordconstnode.create(tcgvecnode(n).get_mul_size,sizeuinttype,false),nil))))
                       else
                       else
                         addstatement(calccodestatements,
                         addstatement(calccodestatements,
-                          geninlinenode(in_inc_x,false,
+                          cinlinenode.createintern(in_inc_x,false,
                           ccallparanode.create(ctemprefnode.create(tempnode),ccallparanode.create(
                           ccallparanode.create(ctemprefnode.create(tempnode),ccallparanode.create(
-                          cordconstnode.create(tcgvecnode(n).get_mul_size,tfornode(arg).right.resultdef,false),nil))));
+                          cordconstnode.create(tcgvecnode(n).get_mul_size,sizeuinttype,false),nil))));
 
 
                       addstatement(initcodestatements,tempnode);
                       addstatement(initcodestatements,tempnode);
                       addstatement(initcodestatements,cassignmentnode.create(ctemprefnode.create(tempnode),
                       addstatement(initcodestatements,cassignmentnode.create(ctemprefnode.create(tempnode),