cvsuser 03/06/06 04:14:43
Modified: languages/imcc imc.c optimizer.c
languages/imcc/t/imcpasm opt2.t
Log:
repeat optimizer step after constant propagation
Revision Changes Path
1.47 +2 -0 parrot/languages/imcc/imc.c
Index: imc.c
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imc.c,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -w -r1.46 -r1.47
--- imc.c 27 Apr 2003 07:42:23 -0000 1.46
+++ imc.c 6 Jun 2003 11:14:41 -0000 1.47
@@ -94,6 +94,8 @@
todo = 0;
else {
todo = optimize(interpreter);
+ if (todo)
+ pre_optimize(interpreter);
}
}
todo = 1;
1.29 +8 -4 parrot/languages/imcc/optimizer.c
Index: optimizer.c
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/optimizer.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -w -r1.28 -r1.29
--- optimizer.c 4 Jun 2003 12:34:55 -0000 1.28
+++ optimizer.c 6 Jun 2003 11:14:41 -0000 1.29
@@ -57,7 +57,7 @@
static void subst_constants_c(struct Parrot_Interp *interp);
static void subst_constants_if(struct Parrot_Interp *interp);
-static void constant_propagation(struct Parrot_Interp *interp);
+static int constant_propagation(struct Parrot_Interp *interp);
static int used_once(void);
static int loop_optimization(struct Parrot_Interp *);
static int clone_remove(void);
@@ -95,9 +95,10 @@
int optimize(struct Parrot_Interp *interp) {
+ int any = 0;
if (optimizer_level & OPT_CFG) {
info(2, "optimize\n");
- constant_propagation(interp);
+ any = constant_propagation(interp);
if (clone_remove())
return 1;
if (used_once())
@@ -105,7 +106,7 @@
if (loop_optimization(interp))
return 1;
}
- return 0;
+ return any;
}
/* get negated opterator for op */
@@ -299,7 +300,7 @@
* even though sometimes it may be safe
*/
-static void
+static int
constant_propagation(struct Parrot_Interp *interp)
{
Instruction *ins, *ins2;
@@ -307,6 +308,7 @@
int i;
char fullname[128];
SymReg *c, *old, *o;
+ int any = 0;
info(2, "\tconstant_propagation\n");
for (ins = instructions; ins; ins = ins->next) {
@@ -344,6 +346,7 @@
else {
--old->use_count;
ins2->opnum = op;
+ any = 1;
debug(DEBUG_OPT2," -> %s\n", ins_string(ins2));
}
}
@@ -355,6 +358,7 @@
next_constant:;
}/*for(ins ... )*/
+ return any;
}
1.5 +17 -2 parrot/languages/imcc/t/imcpasm/opt2.t
Index: opt2.t
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/t/imcpasm/opt2.t,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -w -r1.4 -r1.5
--- opt2.t 4 Jun 2003 12:34:57 -0000 1.4
+++ opt2.t 6 Jun 2003 11:14:43 -0000 1.5
@@ -1,6 +1,6 @@
#!perl
use strict;
-use TestCompiler tests => 4;
+use TestCompiler tests => 5;
# these tests are run with -O2 by TestCompiler and show
# generated PASM code for various optimizations at level 2
@@ -57,7 +57,7 @@
_main:
set I1, 10
set I0, 5
- lt 10, 20, nxt
+ branch nxt
add:
add I0, I1, I1
print I0
@@ -94,5 +94,20 @@
print I0
lt I1, 4, next
end
+OUT
+
+##############################
+output_is(<<'CODE', <<'OUT', "constant prop repeated");
+ .local int a
+ .local int b
+ .local int sum
+ a = 10
+ b = 5
+ sum = a + b
+ print sum
+ end
+CODE
+ print 15
+ end
OUT