* some fixes to loop strength reduction

git-svn-id: trunk@43911 -
This commit is contained in:
florian 2020-01-11 16:08:46 +00:00
parent 2f2b378c03
commit a9a711763f

View File

@ -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),