aboutsummaryrefslogtreecommitdiff
path: root/ssa.c
diff options
context:
space:
mode:
authorTeddy <ted.sybil@gmail.com>2014-05-05 00:21:20 +0800
committerTeddy <ted.sybil@gmail.com>2014-05-05 00:21:20 +0800
commit7bf7dcbefc89fd67e62c0bb625089c1d53e8e878 (patch)
tree3607fd8981b33ee7518600e1f9cbb3489a8106f5 /ssa.c
parent230b90822e0e5e2598f3b40fed19a712097d5908 (diff)
...
Diffstat (limited to 'ssa.c')
-rw-r--r--ssa.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/ssa.c b/ssa.c
index 2df04be..1c43920 100644
--- a/ssa.c
+++ b/ssa.c
@@ -2229,6 +2229,36 @@ void const_propagation() {
}
}
+void strength_reduction() {
+ int i;
+ for (i = bcnt - 1; i >= 0; i--)
+ {
+ CBlock_t b = blks[vis[i]];
+ CInst_t i, ni, ih = b->insts;
+ for (i = ih->next; i != ih; i = ni)
+ {
+ ni = i->next;
+ switch (i->op)
+ {
+ case ADD:
+ if (i->src1->kind == IMM)
+ {
+ COpr_t t = i->src1;
+ i->src1 = i->src2;
+ i->src2 = t;
+ }
+ if (i->src2->kind == IMM && !i->src2->info.imm)
+ {
+ i->op = MOVE;
+ i->src2 = NULL;
+ }
+ break;
+ default: ;
+ }
+ }
+ }
+}
+
void ssa_func(CType_t func) {
#define OPRS_ADD(_opr) \
do { \
@@ -2304,6 +2334,7 @@ void ssa_func(CType_t func) {
renaming_vars(oprs);
/* optimization on SSA */
const_propagation();
+ strength_reduction();
/* out of SSA */
mark_insts();
build_intervals();