Преглед изворни кода

Fix internalerror generated with riscv32 compiler.

  Fix
  Compiling ./fcl-passrc/src/pscanner.pp
  pscanner.pp(2512,40) Fatal: Internal error 2006010801
  error generated for riscv32-linux target after commit #c83e6c34
  by correcting expectloc for riscv32 for 64-bit comparisons.
  Add a small test.
Pierre Muller пре 2 година
родитељ
комит
49ddf159b2
2 измењених фајлова са 74 додато и 1 уклоњено
  1. 6 1
      compiler/riscv/nrvadd.pas
  2. 68 0
      tests/test/cg/tvec64cmp.pp

+ 6 - 1
compiler/riscv/nrvadd.pas

@@ -305,7 +305,12 @@ implementation
 
         if expectloc=LOC_FLAGS then
           expectloc:=LOC_REGISTER;
-        if (expectloc=LOC_JUMP) and (nodetype in [equaln, unequaln, ltn, lten, gtn, gten]) then
+        if (expectloc=LOC_JUMP)
+{$ifdef cpu32bitalu}
+           and (not (is_64bit(left.resultdef) or
+                     is_64bit(right.resultdef)))
+{$endif cpu32bitalu}
+	  and (nodetype in [equaln, unequaln, ltn, lten, gtn, gten]) then
           expectloc:=LOC_REGISTER;
       end;
 

+ 68 - 0
tests/test/cg/tvec64cmp.pp

@@ -0,0 +1,68 @@
+{ Small test to check correct handling of 
+  comparison of 64-bit values as boolean
+  index of a vector, which lead
+  to internal error for riscv32 cpu
+  after commit #c83e6c34 }
+
+const
+  error_count : longint = 0;
+
+procedure error(v : integer);
+begin
+  writeln('Error ',v);
+  inc(error_count);
+end;
+
+const
+  test_counter : longint = 0;
+
+procedure check(b1,b2 : boolean);
+begin
+  inc(test_counter);
+  if (b1<>b2) then
+    error(test_counter);
+end;
+
+const
+  Res : array[boolean] of boolean = (False,True);
+
+var
+  A,B : Int64;
+  UA,UB : Qword;
+
+
+begin
+  A:=1;
+  B:=-1;
+  check(Res[A<B],false);
+  check(Res[A>B],true);
+  check(Res[A<=B],false);
+  check(Res[A>=B],true);
+  check(Res[A=B],false);
+  check(Res[A<>B],true);
+  A:=$123456789;
+  B:=-$ABCDEF12345;
+  check(Res[A<B],false);
+  check(Res[A>B],true);
+  check(Res[A<=B],false);
+  check(Res[A>=B],true);
+  check(Res[A=B],false);
+  check(Res[A<>B],true);
+
+  UA:=qword(1 shl 63) + qword(1 shl 36) + qword(1 shl 9);
+  UB:=1;
+  check(Res[UA<UB],false);
+  check(Res[UA>UB],true);
+  check(Res[UA<=UB],false);
+  check(Res[UA>=UB],true);
+  check(Res[UA=UB],false);
+  check(Res[UA<>UB],true);
+
+  if (error_count>0) then
+    begin
+      writeln('The test generated ',error_count,' failures');
+      halt(1);
+    end
+  else
+    writeln('Test completed without error');
+end.