mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-27 17:10:16 +02:00
* some fixes to loop strength reduction
git-svn-id: trunk@43911 -
This commit is contained in:
parent
2f2b378c03
commit
a9a711763f
@ -287,6 +287,7 @@ unit optloop;
|
|||||||
function findpreviousstrengthreduction : boolean;
|
function findpreviousstrengthreduction : boolean;
|
||||||
var
|
var
|
||||||
i : longint;
|
i : longint;
|
||||||
|
hp : tnode;
|
||||||
begin
|
begin
|
||||||
result:=false;
|
result:=false;
|
||||||
for i:=0 to inductionexprs.count-1 do
|
for i:=0 to inductionexprs.count-1 do
|
||||||
@ -294,16 +295,17 @@ unit optloop;
|
|||||||
{ do we already maintain one expression? }
|
{ do we already maintain one expression? }
|
||||||
if tnode(inductionexprs[i]).isequal(n) then
|
if tnode(inductionexprs[i]).isequal(n) then
|
||||||
begin
|
begin
|
||||||
n.free;
|
|
||||||
case n.nodetype of
|
case n.nodetype of
|
||||||
muln:
|
muln:
|
||||||
n:=ctemprefnode.create(ttempcreatenode(templist[i]));
|
hp:=ctemprefnode.create(ttempcreatenode(templist[i]));
|
||||||
vecn:
|
vecn:
|
||||||
n:=ctypeconvnode.create_internal(cderefnode.create(ctemprefnode.create(
|
hp:=ctypeconvnode.create_internal(cderefnode.create(ctemprefnode.create(
|
||||||
ttempcreatenode(templist[i]))),n.resultdef);
|
ttempcreatenode(templist[i]))),n.resultdef);
|
||||||
else
|
else
|
||||||
internalerror(200809211);
|
internalerror(200809211);
|
||||||
end;
|
end;
|
||||||
|
n.free;
|
||||||
|
n:=hp;
|
||||||
result:=true;
|
result:=true;
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
@ -429,14 +431,14 @@ unit optloop;
|
|||||||
|
|
||||||
if lnf_backward in tfornode(arg).loopflags then
|
if lnf_backward in tfornode(arg).loopflags then
|
||||||
addstatement(calccodestatements,
|
addstatement(calccodestatements,
|
||||||
geninlinenode(in_dec_x,false,
|
cinlinenode.createintern(in_dec_x,false,
|
||||||
ccallparanode.create(ctemprefnode.create(tempnode),ccallparanode.create(
|
ccallparanode.create(ctemprefnode.create(tempnode),ccallparanode.create(
|
||||||
cordconstnode.create(tcgvecnode(n).get_mul_size,tfornode(arg).right.resultdef,false),nil))))
|
cordconstnode.create(tcgvecnode(n).get_mul_size,sizeuinttype,false),nil))))
|
||||||
else
|
else
|
||||||
addstatement(calccodestatements,
|
addstatement(calccodestatements,
|
||||||
geninlinenode(in_inc_x,false,
|
cinlinenode.createintern(in_inc_x,false,
|
||||||
ccallparanode.create(ctemprefnode.create(tempnode),ccallparanode.create(
|
ccallparanode.create(ctemprefnode.create(tempnode),ccallparanode.create(
|
||||||
cordconstnode.create(tcgvecnode(n).get_mul_size,tfornode(arg).right.resultdef,false),nil))));
|
cordconstnode.create(tcgvecnode(n).get_mul_size,sizeuinttype,false),nil))));
|
||||||
|
|
||||||
addstatement(initcodestatements,tempnode);
|
addstatement(initcodestatements,tempnode);
|
||||||
addstatement(initcodestatements,cassignmentnode.create(ctemprefnode.create(tempnode),
|
addstatement(initcodestatements,cassignmentnode.create(ctemprefnode.create(tempnode),
|
||||||
|
Loading…
Reference in New Issue
Block a user