[Beignet] [PATCH 1/2] Backend: Add optimization for negtive modifier
rander.wang
rander.wang at intel.com
Wed May 17 08:20:39 UTC 2017
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 at intel.com>
---
.../src/backend/gen_insn_selection_optimize.cpp | 35 +++++++++++++++++++---
1 file changed, 31 insertions(+), 4 deletions(-)
diff --git a/backend/src/backend/gen_insn_selection_optimize.cpp b/backend/src/backend/gen_insn_selection_optimize.cpp
index 512a5bd..d1c302d 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,14 @@ 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 || src.hstride != dst.hstride)
return;
@@ -246,10 +252,31 @@ 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) {
--
2.7.4
More information about the Beignet
mailing list