Bläddra i källkod

* Fixed missing assignments with the strength reduction optimization.

Yuriy Sydorov 3 år sedan
förälder
incheckning
b2165570de
1 ändrade filer med 10 tillägg och 0 borttagningar
  1. 10 0
      compiler/optloop.pas

+ 10 - 0
compiler/optloop.pas

@@ -354,8 +354,10 @@ unit optloop;
         dummy : longint;
         nn : tnode;
         nt : tnodetype;
+        nflags : tnodeflags;
       begin
         result:=fen_false;
+        nflags:=n.flags;
         case n.nodetype of
           forn:
             { inform for loop search routine, that it needs to search more deeply }
@@ -508,6 +510,14 @@ unit optloop;
                       { ... and add a temp. release node }
                       addstatement(deletecodestatements,ctempdeletenode.create(tempnode));
                     end;
+                  { Copy the nf_write,nf_modify flags to the new deref node of the temp.
+                    Othewise assignments to vector elements will be removed. }
+                  if nflags*[nf_write,nf_modify]<>[] then
+                    begin
+                      if (n.nodetype<>typeconvn) or (ttypeconvnode(n).left.nodetype<>derefn) then
+                        internalerror(2021091501);
+                      ttypeconvnode(n).left.flags:=ttypeconvnode(n).left.flags+nflags*[nf_write,nf_modify];
+                    end;
                   { set types }
                   do_firstpass(n);
                   result:=fen_norecurse_false;