Browse Source

Always set p to the next instruction after removing p from asml.

Some time ago we introduced GetNextInstructionUsingReg, which might
return an instruction a couple of instructions away from our current
location. Most of the code then just returned the new instruction (hp1)
instead of the instruction following p. This could prevent the peephole
optimizer from finding possible optimizations.

git-svn-id: trunk@26605 -
masta 11 years ago
parent
commit
57ff589ec7
1 changed files with 10 additions and 1 deletions
  1. 10 1
      compiler/arm/aoptcpu.pas

+ 10 - 1
compiler/arm/aoptcpu.pas

@@ -1194,6 +1194,7 @@ Implementation
                         if taicpu(hp1).oper[1]^.ref^.index = taicpu(p).oper[0]^.reg then
                         if taicpu(hp1).oper[1]^.ref^.index = taicpu(p).oper[0]^.reg then
                           taicpu(hp1).oper[1]^.ref^.index := taicpu(p).oper[1]^.reg;
                           taicpu(hp1).oper[1]^.ref^.index := taicpu(p).oper[1]^.reg;
 
 
+                        GetNextInstruction(p, hp1);
                         asml.remove(p);
                         asml.remove(p);
                         p.free;
                         p.free;
                         p:=hp1;
                         p:=hp1;
@@ -1293,12 +1294,12 @@ Implementation
                                        taicpu(hp1).oper[0]^.reg, taicpu(p).oper[1]^.reg,
                                        taicpu(hp1).oper[0]^.reg, taicpu(p).oper[1]^.reg,
                                        taicpu(p).oper[2]^.shifterop^);
                                        taicpu(p).oper[2]^.shifterop^);
                               asml.insertbefore(hp2, hp1);
                               asml.insertbefore(hp2, hp1);
+                              GetNextInstruction(p, hp2);
                               asml.remove(p);
                               asml.remove(p);
                               asml.remove(hp1);
                               asml.remove(hp1);
                               p.free;
                               p.free;
                               hp1.free;
                               hp1.free;
                               p:=hp2;
                               p:=hp2;
-                              GetNextInstruction(p,hp1);
                               DebugMsg('Peephole FoldShiftProcess done', p);
                               DebugMsg('Peephole FoldShiftProcess done', p);
                               break;
                               break;
                             end;
                             end;
@@ -1367,6 +1368,7 @@ Implementation
                          taicpu(hp1).oper[1]^.ref^.shiftmode := taicpu(p).oper[2]^.shifterop^.shiftmode;
                          taicpu(hp1).oper[1]^.ref^.shiftmode := taicpu(p).oper[2]^.shifterop^.shiftmode;
                          taicpu(hp1).oper[1]^.ref^.shiftimm := taicpu(p).oper[2]^.shifterop^.shiftimm;
                          taicpu(hp1).oper[1]^.ref^.shiftimm := taicpu(p).oper[2]^.shifterop^.shiftimm;
                          DebugMsg('Peephole FoldShiftLdrStr done', hp1);
                          DebugMsg('Peephole FoldShiftLdrStr done', hp1);
+                         GetNextInstruction(p, hp1);
                          asml.remove(p);
                          asml.remove(p);
                          p.free;
                          p.free;
                          p:=hp1;
                          p:=hp1;
@@ -1432,6 +1434,7 @@ Implementation
                                 taicpu(hp1).loadConst(2,taicpu(p).oper[2]^.val and taicpu(hp1).oper[2]^.val);
                                 taicpu(hp1).loadConst(2,taicpu(p).oper[2]^.val and taicpu(hp1).oper[2]^.val);
                                 taicpu(hp1).oppostfix:=taicpu(p).oppostfix;
                                 taicpu(hp1).oppostfix:=taicpu(p).oppostfix;
                                 taicpu(hp1).loadReg(1,taicpu(p).oper[1]^.reg);
                                 taicpu(hp1).loadReg(1,taicpu(p).oper[1]^.reg);
+                                GetNextInstruction(p, hp1);
                                 asml.remove(p);
                                 asml.remove(p);
                                 p.free;
                                 p.free;
                                 p:=hp1;
                                 p:=hp1;
@@ -1458,6 +1461,7 @@ Implementation
                           begin
                           begin
                             DebugMsg('Peephole AndStrb2Strb done', p);
                             DebugMsg('Peephole AndStrb2Strb done', p);
                             taicpu(hp1).loadReg(0,taicpu(p).oper[1]^.reg);
                             taicpu(hp1).loadReg(0,taicpu(p).oper[1]^.reg);
+                            GetNextInstruction(p, hp1);
                             asml.remove(p);
                             asml.remove(p);
                             p.free;
                             p.free;
                             p:=hp1;
                             p:=hp1;
@@ -1550,6 +1554,7 @@ Implementation
                               begin
                               begin
                                 DebugMsg('Peephole AndLsl2Lsl done', p);
                                 DebugMsg('Peephole AndLsl2Lsl done', p);
                                 taicpu(hp1).oper[1]^.reg:=taicpu(p).oper[0]^.reg;
                                 taicpu(hp1).oper[1]^.reg:=taicpu(p).oper[0]^.reg;
+                                GetNextInstruction(p, hp1);
                                 asml.Remove(p);
                                 asml.Remove(p);
                                 p.free;
                                 p.free;
                                 p:=hp1;
                                 p:=hp1;
@@ -1680,6 +1685,7 @@ Implementation
                           end
                           end
                         else
                         else
                           taicpu(hp1).loadReg(1,taicpu(p).oper[1]^.reg);
                           taicpu(hp1).loadReg(1,taicpu(p).oper[1]^.reg);
+                        GetNextInstruction(p, hp1);
                         asml.remove(p);
                         asml.remove(p);
                         p.free;
                         p.free;
                         p:=hp1;
                         p:=hp1;
@@ -1816,6 +1822,7 @@ Implementation
                       begin
                       begin
                         DebugMsg('Peephole UXTHStrh2Strh done', p);
                         DebugMsg('Peephole UXTHStrh2Strh done', p);
                         taicpu(hp1).loadReg(0,taicpu(p).oper[1]^.reg);
                         taicpu(hp1).loadReg(0,taicpu(p).oper[1]^.reg);
+                        GetNextInstruction(p, hp1);
                         asml.remove(p);
                         asml.remove(p);
                         p.free;
                         p.free;
                         p:=hp1;
                         p:=hp1;
@@ -1841,6 +1848,7 @@ Implementation
                         DebugMsg('Peephole UxthUxth2Uxth done', p);
                         DebugMsg('Peephole UxthUxth2Uxth done', p);
                         taicpu(hp1).opcode:=A_UXTH;
                         taicpu(hp1).opcode:=A_UXTH;
                         taicpu(hp1).loadReg(1,taicpu(p).oper[1]^.reg);
                         taicpu(hp1).loadReg(1,taicpu(p).oper[1]^.reg);
+                        GetNextInstruction(p, hp1);
                         asml.remove(p);
                         asml.remove(p);
                         p.free;
                         p.free;
                         p:=hp1;
                         p:=hp1;
@@ -1869,6 +1877,7 @@ Implementation
                         taicpu(hp1).opcode:=A_UXTH;
                         taicpu(hp1).opcode:=A_UXTH;
                         taicpu(hp1).ops:=2;
                         taicpu(hp1).ops:=2;
                         taicpu(hp1).loadReg(1,taicpu(p).oper[1]^.reg);
                         taicpu(hp1).loadReg(1,taicpu(p).oper[1]^.reg);
+                        GetNextInstruction(p, hp1);
                         asml.remove(p);
                         asml.remove(p);
                         p.free;
                         p.free;
                         p:=hp1;
                         p:=hp1;