[M3devel] yet another proposed fix.. careful insertion of one instance of CG.Force() in CastExpr.m3

Jay K jay.krell at cornell.edu
Tue Jul 6 14:28:34 CEST 2010


Ok, this is interesting. I think. Finally.
I need to test more, but it is looking very promising. I think you'll like it (Tony).
I still don't understand all the flow around the front end. I had to try out some guesses.
It certainly appears that m3front/src/misc/CG.m3 is in the business of optimizations.
This change might actually be too conservative.
It defeats optimization in CG.m3. It limits it to D_to_S when one type is float and the other isn't. 
 I guess S (struct) can't really be float.


The assertion failure in gcc btw, was gcc_assert( something_is_float == other_is_float).
So the conservativeness is somewhat sensible.
Limiting it to D_to_S, though, unclear.


The change is just inserting CG.Force().


OK? (Let me test a bit more -- build the entire tree.)

This appears to let me leave "ter" on.
I can try leaving other optimizations on.


Index: exprs/CastExpr.m3
===================================================================
RCS file: /usr/cvs/cm3/m3-sys/m3front/src/exprs/CastExpr.m3,v
retrieving revision 1.9
diff -u -r1.9 CastExpr.m3
--- exprs/CastExpr.m3    5 Jul 2010 11:28:32 -0000    1.9
+++ exprs/CastExpr.m3    6 Jul 2010 12:23:14 -0000
@@ -10,6 +10,7 @@
 
 IMPORT M3Buf, CG, Expr, ExprRep, Type, Error, OpenArrayType;
 IMPORT M3, M3ID, M3RT, Target, TInt;
+FROM Target IMPORT FloatType;
 
 TYPE
   Kind = {
@@ -394,7 +395,7 @@
     u  := Expr.TypeOf (e);
     t  := p.tipe;
     sz, t_align, u_align, z_align: INTEGER;
-    u_cg: CG.Type;
+    u_cg, t_cg: CG.Type;
     u_info, t_info: Type.Info;
   BEGIN
     u := Type.CheckInfo (u, u_info);
@@ -403,6 +404,7 @@
     u_align := u_info.alignment;
     z_align := MAX (t_align, u_align);
     u_cg := u_info.stk_type;
+    t_cg := t_info.stk_type;
     sz := u_info.size;
     Type.Compile (t);
     Type.Compile (u);
@@ -416,6 +418,15 @@
       Kind.V_to_V =>
         Expr.CompileLValue (p.expr, traced);
         CG.Boost_alignment (t_align);
+(* Inhibit some optimization that causes compilation to fail. e.g. m3core:
+../src/float/IEEE/RealFloat.m3: In function 'RealFloat__CopySign':
+../src/float/IEEE/RealFloat.m3:96: internal compiler error: in convert_move, at expr.c:371
+../src/float/IEEE/LongFloat.m3: In function 'LongFloat__CopySign':
+../src/float/IEEE/LongFloat.m3:116: internal compiler error: in convert_move, at expr.c:371
+*)
+        IF p.kind = Kind.D_to_S AND FloatType[u_cg] # FloatType[t_cg] THEN
+          CG.Force ();
+        END;
 
     | Kind.D_to_A,
       Kind.S_to_A,



(577) begin_procedure
  procedure LongFloat__CopySign
 LongFloat__CopySign(578) set_source_line
  source line  117
(579) load
  type:lreal
  type:lreal
  m3cg_load (M3_CtKayy_x): offset 0x0, convert lreal -> lreal
(580) store
  type:lreal
  type:lreal
  store (M3_CtKayy_res) offset:0x0 src_t:lreal dst_t:lreal
(581) set_source_line
  source line  119


now notice we have use of load_address and load_indirect here, where before we had no address and load (direct) 


(582) load_address
  load address (M3_CtKayy_res) offset 0x0
(583) load_address
  load address (M3_CtKayy_y) offset 0x0
(584) load_indirect
  type:word8
  type:int64
  load address offset:0x38 src_t:word8 dst_t:int64
(585) extract_mn
  type:int64
 extract_mn offset:7 count:1 sign_extend:0
(586) swap
  type:addr
  type:int64
(587) declare_temp
  type:addr
  temp var type:addr size:0x40 alignment:0x40
(588) store
  type:addr
  type:addr
  store (noname) offset:0x0 src_t:addr dst_t:addr
(589) load
  type:addr
  type:addr
  m3cg_load (noname): offset 0x0, convert addr -> addr
(590) load_indirect
  type:word8
  type:int64
  load address offset:0x38 src_t:word8 dst_t:int64
(591) swap
  type:int64
  type:word8
(592) insert_mn
  type:int64
 insert_mn offset:7 count:1
(593) load
  type:addr
  type:addr
  m3cg_load (noname): offset 0x0, convert addr -> addr
(594) swap
  type:word8
  type:addr
(595) store_indirect
  type:int64
  type:word8
  store indirect offset:0x38 src_t:int64 dst_t:word8
(596) set_source_line
  source line  120
(597) load
  type:lreal
  type:lreal
  m3cg_load (M3_CtKayy_res): offset 0x0, convert lreal -> lreal
(598) exit_proc
  type:lreal
(599) free_temp
(600) end_procedure
  procedure LongFloat__CopySign



 - Jay

 		 	   		  


More information about the M3devel mailing list