* do constant folding on div <const. int> div <const. int>, resolves #39301

This commit is contained in:
florian 2021-09-02 22:03:54 +02:00
parent 261c0ff708
commit 2ce34f7bd3

View File

@ -111,6 +111,7 @@ implementation
function tmoddivnode.simplify(forinline : boolean):tnode;
var
rv,lv : tconstexprint;
hp: tnode;
begin
result:=nil;
@ -162,8 +163,22 @@ implementation
left:=nil;
exit;
end;
if (nodetype=divn) and (left.nodetype=divn) and is_constintnode(tmoddivnode(left).right) and
{ we need a type and the types must be consistent }
assigned(resultdef) and
(compare_defs(resultdef,left.resultdef,nothingn)=te_exact) then
begin
{ re-use the current node so we get the result type right }
right:=caddnode.create_internal(muln,right,tmoddivnode(left).right.getcopy);
hp:=tmoddivnode(left).left.getcopy;
left.Free;
left:=hp;
Result:=getcopy;
Result.resultdef:=nil;
Result:=ctypeconvnode.create_internal(Result,resultdef);
exit;
end;
end;
if is_constintnode(right) and is_constintnode(left) then
begin
rv:=tordconstnode(right).value;
@ -380,6 +395,10 @@ implementation
resultdef:=right.resultdef;
end;
result:=simplify(false);
if assigned(result) then
exit;
{ when the result is currency we need some extra code for
division. this should not be done when the divn node is
created internally }