Browse Source

- disabled "string_var := string_var + ... " and "string_var + char_var"
optimizations (were only active with -dnewoptimizations) because of
several internal issues

Jonas Maebe 25 years ago
parent
commit
e96d0a3d6e
4 changed files with 52 additions and 25 deletions
  1. 24 12
      compiler/cg386add.pas
  2. 8 3
      compiler/tcadd.pas
  3. 10 5
      compiler/tcld.pas
  4. 10 5
      compiler/tree.pas

+ 24 - 12
compiler/cg386add.pas

@@ -141,11 +141,12 @@ implementation
 
     procedure addstring(var p : ptree);
       var
-{$ifdef newoptimizations}
+{$ifdef newoptimizations2}
         l: pasmlabel;
         hreg: tregister;
         href2: preference;
-{$endif newoptimizations}
+        oldregisterdef: boolean;
+{$endif newoptimizations2}
         pushedregs : tpushed;
         href       : treference;
         pushed,
@@ -298,14 +299,20 @@ implementation
                              p^.left^.location.loc:=LOC_MEM;
                              p^.left^.location.reference:=href;
 
+{$ifdef newoptimizations2}
                              { length of temp string = 255 (JM) }
+                             { *** redefining a type is not allowed!! (thanks, Pierre) }
+                             { also problem with constant string!                      }
                              pstringdef(p^.left^.resulttype)^.len := 255;
+                             
+{$endif newoptimizations2}
                           end;
 
                         secondpass(p^.right);
 
-{$ifdef newoptimizations}
+{$ifdef newoptimizations2}
                         { special case for string := string + char (JM) }
+                        { needs string length stuff from above!         }
                         hreg := R_NO;
                         if is_shortstring(p^.left^.resulttype) and
                            is_char(p^.right^.resulttype) then
@@ -378,7 +385,7 @@ implementation
                           end
                         else
                           begin
-{$endif  newoptimizations}
+{$endif  newoptimizations2}
                         { on the right we do not need the register anymore too }
                         { Instead of releasing them already, simply do not }
                         { push them (so the release is in the right place, }
@@ -389,11 +396,11 @@ implementation
                               regstopush);
                            pushusedregisters(pushedregs,regstopush);
                            { push the maximum possible length of the result }
-{$ifdef newoptimizations}
+{$ifdef newoptimizations2}
                            { string (could be < 255 chars now) (JM)         }
                             emit_const(A_PUSH,S_L,
                               pstringdef(p^.left^.resulttype)^.len);
-{$endif newoptimizations}
+{$endif newoptimizations2}
                             emitpushreferenceaddr(p^.left^.location.reference);
                            { the optimizer can more easily put the          }
                            { deallocations in the right place if it happens }
@@ -401,17 +408,17 @@ implementation
                            { the pushref needs a "lea (..),edi; push edi")  }
                             del_reference(p^.right^.location.reference);
                             emitpushreferenceaddr(p^.right^.location.reference);
-{$ifdef newoptimizations}
+{$ifdef newoptimizations2}
                             emitcall('FPC_SHORTSTR_CONCAT_LEN');
-{$else newoptimizations}
+{$else newoptimizations2}
                             emitcall('FPC_SHORTSTR_CONCAT');
-{$endif newoptimizations}
+{$endif newoptimizations2}
                             ungetiftemp(p^.right^.location.reference);
                             maybe_loadesi;
                             popusedregisters(pushedregs);
-{$ifdef newoptimizations}
+{$ifdef newoptimizations2}
                         end;
-{$endif newoptimizations}
+{$endif newoptimizations2}
                         set_location(p^.location,p^.left^.location);
                      end;
                    ltn,lten,gtn,gten,
@@ -2369,7 +2376,12 @@ implementation
 end.
 {
   $Log$
-  Revision 1.100  2000-04-23 09:28:19  jonas
+  Revision 1.101  2000-04-25 14:43:36  jonas
+    - disabled "string_var := string_var + ... " and "string_var + char_var"
+      optimizations (were only active with -dnewoptimizations) because of
+      several internal issues
+
+  Revision 1.100  2000/04/23 09:28:19  jonas
     * use FPC_SHPRTSTR_CONCAT_LEN for -dnewoptimizations (temp)
     * more precise reg deallocation when calling the above)
 

+ 8 - 3
compiler/tcadd.pas

@@ -842,13 +842,13 @@ implementation
               else
                 begin
                    if not(is_shortstring(rd))
-{$ifdef newoptimizations}
+{$ifdef newoptimizations2}
 {$ifdef i386}
                       { shortstring + char handled seperately  (JM) }
                       and (not(cs_optimize in aktglobalswitches) or
                            (p^.treetype <> addn) or not(is_char(rd)))
 {$endif i386}
-{$endif newoptimizations}
+{$endif newoptimizations2}
                     then
                       p^.right:=gentypeconvnode(p^.right,cshortstringdef);
                    if not(is_shortstring(ld)) then
@@ -1301,7 +1301,12 @@ implementation
 end.
 {
   $Log$
-  Revision 1.74  2000-04-21 12:35:05  jonas
+  Revision 1.75  2000-04-25 14:43:36  jonas
+    - disabled "string_var := string_var + ... " and "string_var + char_var"
+      optimizations (were only active with -dnewoptimizations) because of
+      several internal issues
+
+  Revision 1.74  2000/04/21 12:35:05  jonas
     + special code for string + char, between -dnewoptimizations
 
   Revision 1.73  2000/03/28 21:14:18  pierre

+ 10 - 5
compiler/tcld.pas

@@ -201,10 +201,10 @@ implementation
 *****************************************************************************}
 
     procedure firstassignment(var p : ptree);
-{$ifdef newoptimizations}
+{$ifdef newoptimizations2}
       var
         hp : ptree;
-{$endif newoptimizations}
+{$endif newoptimizations2}
       begin
          { must be made unique }
          set_unique(p^.left);
@@ -273,7 +273,7 @@ implementation
             { the problem is for
               s:=s+s+s;
               this is broken here !! }
-{$ifdef newoptimizations}
+{$ifdef newoptimizations2}
             { the above is fixed now, but still problem with s := s + f(); if }
             { f modifies s (bad programming, so only enable if uncertain      }
             { optimizations are on) (JM)                                      }
@@ -293,7 +293,7 @@ implementation
                       end;
                   end;
               end;
-{$endif newoptimizations}
+{$endif newoptimizations2}
           end
          else
           begin
@@ -496,7 +496,12 @@ implementation
 end.
 {
   $Log$
-  Revision 1.63  2000-04-23 21:04:09  jonas
+  Revision 1.64  2000-04-25 14:43:36  jonas
+    - disabled "string_var := string_var + ... " and "string_var + char_var"
+      optimizations (were only active with -dnewoptimizations) because of
+      several internal issues
+
+  Revision 1.63  2000/04/23 21:04:09  jonas
     * only enable string_concat optimization with uncertain optimizations,
       because it gives wrong results with "s := s + f()" where s is a
       string and f() is a call to a function that modifies s

+ 10 - 5
compiler/tree.pas

@@ -309,10 +309,10 @@ unit tree;
     function getcopy(p : ptree) : ptree;
 
     function equal_trees(t1,t2 : ptree) : boolean;
-{$ifdef newoptimizations}
+{$ifdef newoptimizations2}
     { checks if t1 is loaded more than once in t2 and its sub-trees }
     function multiple_uses(t1,t2: ptree): boolean;
-{$endif newoptimizations}
+{$endif newoptimizations2}
 
     procedure swaptree(p:Ptree);
     procedure disposetree(p : ptree);
@@ -1755,7 +1755,7 @@ unit tree;
           equal_trees:=false;
      end;
 
-{$ifdef newoptimizations}
+{$ifdef newoptimizations2}
     function multiple_uses(t1,t2: ptree): boolean;
     var nr: longint;
 
@@ -1773,7 +1773,7 @@ unit tree;
        check_tree(t2);
        multiple_uses := nr > 1;
     end;
-{$endif newoptimizations}
+{$endif newoptimizations2}
 
     procedure set_unique(p : ptree);
 
@@ -2110,7 +2110,12 @@ unit tree;
 end.
 {
   $Log$
-  Revision 1.118  2000-04-24 11:11:50  peter
+  Revision 1.119  2000-04-25 14:43:37  jonas
+    - disabled "string_var := string_var + ... " and "string_var + char_var"
+      optimizations (were only active with -dnewoptimizations) because of
+      several internal issues
+
+  Revision 1.118  2000/04/24 11:11:50  peter
     * backtraces for exceptions are now only generated from the place of the
       exception
     * frame is also pushed for exceptions