[M3devel] gcc tree checking

Jay K jay.krell at cornell.edu
Tue Jun 29 11:25:37 CEST 2010


One of the (series of) tree type mismatches is like:


m3cgc1: warning: verify_gimple failed
 TextUtils__TextExtras_FindCharSet
../src/cm3/TextUtils.m3: In function 'TextUtils__TextExtras_FindCharSet':
m3cgc1: warning: invalid conversion in gimple call
word_8
word_64
D.3538 = Text__GetChar (M3_Bd56fi_t, M3_Cwb5VA_i.322);

GetChar returns word_8 but the call is asserted to return word_64.

I believe this comes from:

PROCEDURE EmitCall (t: T) =
  VAR result := ProcType.CGResult (t.signature);
  BEGIN
    IF (t.impl_peer # NIL) THEN t := t.impl_peer; END;
    CG.Call_direct (t.cg_proc, result);
    EVAL Marker.EmitExceptionTest (t.signature, need_value := FALSE);
  END EmitCall;

PROCEDURE CGResult (t: Type.T): CG.Type =
  VAR p := Reduce (t);
  BEGIN
    IF (p = NIL) OR (p.result = NIL) THEN
      RETURN CG.Type.Void;
    ELSIF NOT LargeResult (p.result) THEN
      RETURN Type.CGType (p.result, in_memory := TRUE);
      (*** 2/27/96 WKK:  in_memory = TRUE => so that Win32 code generator
           can convert register return values to their full 32-bit width! ***)
    ELSIF p.callConv.standard_structs THEN
      RETURN CG.Type.Void;
    ELSE
      RETURN CG.Type.Struct;
    END;
  END CGResult;

PROCEDURE CGType (t: T;  in_memory: BOOLEAN): CG.Type =
  BEGIN
    t := Check (t);
    IF (in_memory)
      THEN RETURN t.info.mem_type;
      ELSE RETURN t.info.stk_type;
    END;
  END CGType;


I think in_memory needs to be FALSE, and the Win32 codegen should
I believe act the same, but I can check/fix that either way.

I'm thinking maybe I should make a test case that thoroughly exercise
each m3cg opcode and verifies that the output assembly is unchanged,
for a few architectures.

I believe this area really should be fixed, but almost must be very careful.. (like in everything..).

 - Jay

 		 	   		  


More information about the M3devel mailing list