[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