From abb79553d293bbf36d93cb3f3349860deaae0560 Mon Sep 17 00:00:00 2001 From: florian Date: Mon, 23 Dec 2019 22:42:53 +0000 Subject: [PATCH] * optimize case statements with a single branch into if statements (ord const only) git-svn-id: trunk@43766 - --- compiler/nset.pas | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/compiler/nset.pas b/compiler/nset.pas index 79f0dd26fb..1f37f283e1 100644 --- a/compiler/nset.pas +++ b/compiler/nset.pas @@ -919,8 +919,31 @@ implementation end; result:=cifnode.create(left,node_thenblock,node_elseblock); left:=nil; + exit; end; - end; + { convert single case branch into if-statement } + if (flabels^.greater=nil) and (flabels^.less=nil) then + if flabels^.label_type=ltOrdinal then + begin + if flabels^._low=flabels^._high then + begin + result:=cifnode.create_internal( + caddnode.create_internal(equaln,left.getcopy,cordconstnode.create(flabels^._low,left.resultdef,false)), + pcaseblock(blocks[flabels^.blockid])^.statement.getcopy,elseblock); + end + else + begin + result:=cifnode.create_internal( + caddnode.create_internal(andn, + caddnode.create_internal(gten,left.getcopy,cordconstnode.create(flabels^._low,left.resultdef,false)), + caddnode.create_internal(lten,left.getcopy,cordconstnode.create(flabels^._high,left.resultdef,false)) + ), + pcaseblock(blocks[flabels^.blockid])^.statement.getcopy,elseblock); + end; + elseblock:=nil; + exit; + end; + end; function tcasenode.simplify(forinline:boolean):tnode;