diff options
author | Teddy <ted.sybil@gmail.com> | 2014-05-05 00:21:20 +0800 |
---|---|---|
committer | Teddy <ted.sybil@gmail.com> | 2014-05-05 00:21:20 +0800 |
commit | 7bf7dcbefc89fd67e62c0bb625089c1d53e8e878 (patch) | |
tree | 3607fd8981b33ee7518600e1f9cbb3489a8106f5 /ssa.c | |
parent | 230b90822e0e5e2598f3b40fed19a712097d5908 (diff) |
...
Diffstat (limited to 'ssa.c')
-rw-r--r-- | ssa.c | 31 |
1 files changed, 31 insertions, 0 deletions
@@ -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(); |