Sfoglia il codice sorgente

* we cannot do SSA during partial writes to arrays which span multiple registers, resolves #39325

florian 3 anni fa
parent
commit
8efae66956
2 ha cambiato i file con 15 aggiunte e 1 eliminazioni
  1. 7 1
      compiler/hlcgobj.pas
  2. 8 0
      tests/webtbs/tw39325.pp

+ 7 - 1
compiler/hlcgobj.pas

@@ -688,7 +688,8 @@ implementation
        fmodule,
        fmodule,
        verbose,defutil,paramgr,
        verbose,defutil,paramgr,
        symtable,
        symtable,
-       nbas,ncon,nld,ncgrtti,pass_2,
+       nbas,ncon,nld,nmem,
+       ncgrtti,pass_2,
        cgobj,cutils,procinfo,
        cgobj,cutils,procinfo,
 {$ifdef x86}
 {$ifdef x86}
        cgx86,
        cgx86,
@@ -4652,6 +4653,11 @@ implementation
         inn,
         inn,
         asn,isn:
         asn,isn:
           result := fen_norecurse_false;
           result := fen_norecurse_false;
+        vecn:
+          { we cannot do SSA during partial writes to arrays which span multiple registers, see also tw39325 }
+          if (tvecnode(n).left.location.loc in [LOC_CREGISTER,LOC_CFPUREGISTER,LOC_CMMXREGISTER,LOC_CMMREGISTER]) and
+            (tcgsize2size[reg_cgsize(tvecnode(n).left.location.register)]<>tvecnode(n).left.resultdef.size) then
+            result := fen_norecurse_false;
         else
         else
           ;
           ;
       end;
       end;

+ 8 - 0
tests/webtbs/tw39325.pp

@@ -0,0 +1,8 @@
+{ %OPT=-Ooregvar }
+program testopt;
+var
+ar: array[0..1] of byte;
+begin
+ar[0] := 1;
+ar[1] := 2;
+end.