diff --git a/.gitattributes b/.gitattributes index 6708544758..31f0eecbc7 100644 --- a/.gitattributes +++ b/.gitattributes @@ -18720,6 +18720,7 @@ tests/webtbs/tw38074.pp svneol=native#text/pascal tests/webtbs/tw38083.pp svneol=native#text/pascal tests/webtbs/tw38122.pp svneol=native#text/pascal tests/webtbs/tw38122b.pp svneol=native#text/pascal +tests/webtbs/tw38129.pp svneol=native#text/pascal tests/webtbs/tw3814.pp svneol=native#text/plain tests/webtbs/tw38145a.pp svneol=native#text/pascal tests/webtbs/tw38145b.pp svneol=native#text/pascal diff --git a/compiler/ncgld.pas b/compiler/ncgld.pas index 86fbaed98b..78224ccc6e 100644 --- a/compiler/ncgld.pas +++ b/compiler/ncgld.pas @@ -718,10 +718,13 @@ implementation empty value is assigned But not when the result is in the flags, then - loading the left node afterwards can destroy the flags. + loading the left node afterwards can destroy the flags. + + Neither if right contains conditional nodes: this might cause problems with + temp. nodes with init code used by CSE, see e.g. #38129 } if not(right.expectloc in [LOC_FLAGS,LOC_JUMP]) and - (node_complexity(right)>node_complexity(left)) then + (node_complexity(right)>node_complexity(left)) and not(has_conditional_nodes(right)) then begin secondpass(right); if codegenerror then diff --git a/tests/webtbs/tw38129.pp b/tests/webtbs/tw38129.pp new file mode 100644 index 0000000000..f97fee93cb --- /dev/null +++ b/tests/webtbs/tw38129.pp @@ -0,0 +1,21 @@ +{ %opt=-O3 } +{$mode objfpc} +{$H+} +function Bar(const progress: single; divs: uint32): string; +const + BarSym: array[boolean] of char = ('.', '#'); +var + i: int32; +begin + SetLength(result, divs); + for i := 0 to int32(divs) - 1 do + pChar(result)[i] := BarSym[(progress >= (0.75 + i) / divs) or (i = int32(divs) - 1) and (progress >= 1)]; +end; + +var + s: string; + +begin + if Bar(0.7, 10)<>'#######...' then + halt(1); +end.