diff options
author | rander <rander.wang@intel.com> | 2017-05-17 16:20:39 +0800 |
---|---|---|
committer | Yang Rong <rong.r.yang@intel.com> | 2017-06-09 20:02:38 +0800 |
commit | f8053378a254e0eac9b5b2188e81a0308e290647 (patch) | |
tree | 757ef1667debe7c1e778b12976e2964b6bcdfaed | |
parent | 8ed276000efe129481ba0f83643bf5a8a2389309 (diff) |
Backend: Add optimization for negative modifier
LLVM transform Mad(a, -b, c) to
Add b, -b, 0
Mad val, a, b, c
pow(a,-b) and other buildin math function to the same instruction sequence like above
for Gen support negtive modifier, mad(a, -b, c) is native suppoted.
Do it just like a: mov b, -b, so it is a Mov operation like LocalCopyPropagation
Signed-off-by: rander.wang <rander.wang@intel.com>
Reviewed-by: Pan Xiuli <xiuli.pan@intel.com>
-rw-r--r-- | backend/src/backend/gen_insn_selection_optimize.cpp | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/backend/src/backend/gen_insn_selection_optimize.cpp b/backend/src/backend/gen_insn_selection_optimize.cpp index d2e0fb9b..07547ec4 100644 --- a/backend/src/backend/gen_insn_selection_optimize.cpp +++ b/backend/src/backend/gen_insn_selection_optimize.cpp @@ -74,8 +74,7 @@ namespace gbe const GenRegister& replacement) : insn(insn), intermedia(intermedia), replacement(replacement) { - assert(insn.opcode == SEL_OP_MOV); - assert(&(insn.src(0)) == &replacement); + assert(insn.opcode == SEL_OP_MOV || insn.opcode == SEL_OP_ADD); assert(&(insn.dst(0)) == &intermedia); this->elements = CalculateElements(intermedia, insn.state.execWidth); replacementOverwritten = false; @@ -102,6 +101,7 @@ namespace gbe void doReplacement(ReplaceInfo* info); bool CanBeReplaced(const ReplaceInfo* info, const SelectionInstruction& insn, const GenRegister& var); void cleanReplaceInfoMap(); + void doNegAddOptimization(SelectionInstruction &insn); SelectionBlock &bb; const ir::Liveness::LiveOut& liveout; @@ -159,8 +159,13 @@ namespace gbe void SelBasicBlockOptimizer::addToReplaceInfoMap(SelectionInstruction& insn) { - assert(insn.opcode == SEL_OP_MOV); - const GenRegister& src = insn.src(0); + assert(insn.opcode == SEL_OP_MOV || insn.opcode == SEL_OP_ADD); + GenRegister &src = insn.src(0); + if (insn.opcode == SEL_OP_ADD) { + if (src.file == GEN_IMMEDIATE_VALUE) + src = insn.src(1); + } + const GenRegister& dst = insn.dst(0); if (src.type != dst.type || src.file != dst.file) return; @@ -249,10 +254,29 @@ namespace gbe if (insn.opcode == SEL_OP_MOV) addToReplaceInfoMap(insn); + + doNegAddOptimization(insn); } cleanReplaceInfoMap(); } + /* LLVM transform Mad(a, -b, c) to + Add b, -b, 0 + Mad val, a, b, c + for Gen support negtive modifier, mad(a, -b, c) is native suppoted. + Also it can be used for the same like instruction sequence. + Do it just like a: mov b, -b, so it is a Mov operation like LocalCopyPropagation + */ + void SelBasicBlockOptimizer::doNegAddOptimization(SelectionInstruction &insn) { + if (insn.opcode == SEL_OP_ADD) { + GenRegister src0 = insn.src(0); + GenRegister src1 = insn.src(1); + if ((src0.negation && src1.file == GEN_IMMEDIATE_VALUE && src1.value.f == 0.0f) || + (src1.negation && src0.file == GEN_IMMEDIATE_VALUE && src0.value.f == 0.0f)) + addToReplaceInfoMap(insn); + } + } + void SelBasicBlockOptimizer::run() { for (size_t i = 0; i < MaxTries; ++i) { |