Here follows a listing of the optimizing techniques used in the compiler:
Although you can enable uncertain optimizations in most cases, for people who do not understand the following technical explanation, it might be the safest to leave them off.
Remark:If uncertain optimizations are enabled, the CSE algortihm assumes that
The following example will produce bad code when you switch on uncertain optimizations:
| 
      Var temp: Longint;
      
      Procedure Foo(Var Bar: Longint);
      Begin
        If (Bar = temp)
          Then
            Begin
              Inc(Bar);
              If (Bar <> temp) then Writeln('bug!')
            End
      End;
      
      Begin
        Foo(Temp);
      End.
 | 
On the other hand, you can use the uncertain optimizations if you access global/local variables or parameters through pointers, and only access them through this pointer1.
For example:
| 
      Type TMyRec = Record
                      a, b: Longint;
                    End;
           PMyRec = ^TMyRec;
      
      
           TMyRecArray = Array [1..100000] of TMyRec;
           PMyRecArray = ^TMyRecArray;
      
      Var MyRecArrayPtr: PMyRecArray;
          MyRecPtr: PMyRec;
          Counter: Longint;
      
      Begin
        New(MyRecArrayPtr);
        For Counter := 1 to 100000 Do
          Begin
             MyRecPtr := @MyRecArrayPtr^[Counter];
             MyRecPtr^.a := Counter;
             MyRecPtr^.b := Counter div 2;
          End;
      End.
 | 
In conclusion, one could say that you can use uncertain optimizations only when you know what you’re doing.