|
@@ -2464,13 +2464,28 @@ Unit AoptObj;
|
|
|
|
|
|
|
|
|
procedure TAOptObj.PeepHoleOptPass1;
|
|
|
+ const
|
|
|
+ MaxPasses: array[1..4] of Cardinal = (1, 2, 8, 8);
|
|
|
var
|
|
|
p : tai;
|
|
|
stoploop, FirstInstruction, JumpOptsAvailable: boolean;
|
|
|
+ PassCount, MaxCount: Cardinal;
|
|
|
begin
|
|
|
JumpOptsAvailable := CanDoJumpOpts();
|
|
|
|
|
|
StartPoint := BlockStart;
|
|
|
+ PassCount := 0;
|
|
|
+
|
|
|
+ { Determine the maximum number of passes allowed based on the compiler switches }
|
|
|
+ if (cs_opt_level4 in current_settings.optimizerswitches) then
|
|
|
+ { it should never take more than 8 passes, but the limit is finite to protect against faulty optimisations }
|
|
|
+ MaxCount := MaxPasses[4]
|
|
|
+ else if (cs_opt_level3 in current_settings.optimizerswitches) then
|
|
|
+ MaxCount := MaxPasses[3]
|
|
|
+ else if (cs_opt_level2 in current_settings.optimizerswitches) then
|
|
|
+ MaxCount := MaxPasses[2] { The original double run of Pass 1 }
|
|
|
+ else
|
|
|
+ MaxCount := MaxPasses[1];
|
|
|
|
|
|
repeat
|
|
|
stoploop:=true;
|
|
@@ -2523,7 +2538,10 @@ Unit AoptObj;
|
|
|
p := tai(UpdateUsedRegsAndOptimize(p).Next);
|
|
|
|
|
|
end;
|
|
|
- until stoploop or not(cs_opt_level3 in current_settings.optimizerswitches);
|
|
|
+
|
|
|
+ Inc(PassCount);
|
|
|
+
|
|
|
+ until stoploop or (PassCount >= MaxCount);
|
|
|
end;
|
|
|
|
|
|
|