[CPU] Handle constant multiply in fmadd/fmsub in constant propagation pass
This commit is contained in:
@@ -499,11 +499,20 @@ bool ConstantPropagationPass::Run(HIRBuilder* builder) {
|
||||
break;
|
||||
case OPCODE_MUL_ADD:
|
||||
if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {
|
||||
// Multiply part is constant.
|
||||
if (i->src3.value->IsConstant()) {
|
||||
v->set_from(i->src1.value);
|
||||
Value::MulAdd(v, i->src1.value, i->src2.value, i->src3.value);
|
||||
i->Remove();
|
||||
} else {
|
||||
// Multiply part is constant.
|
||||
Value* mul = builder->AllocValue();
|
||||
mul->set_from(i->src1.value);
|
||||
mul->Mul(i->src2.value);
|
||||
|
||||
Value* add = i->src3.value;
|
||||
i->Replace(&OPCODE_ADD_info, 0);
|
||||
i->set_src1(mul);
|
||||
i->set_src2(add);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -514,6 +523,16 @@ bool ConstantPropagationPass::Run(HIRBuilder* builder) {
|
||||
v->set_from(i->src1.value);
|
||||
Value::MulSub(v, i->src1.value, i->src2.value, i->src3.value);
|
||||
i->Remove();
|
||||
} else {
|
||||
// Multiply part is constant.
|
||||
Value* mul = builder->AllocValue();
|
||||
mul->set_from(i->src1.value);
|
||||
mul->Mul(i->src2.value);
|
||||
|
||||
Value* add = i->src3.value;
|
||||
i->Replace(&OPCODE_SUB_info, 0);
|
||||
i->set_src1(mul);
|
||||
i->set_src2(add);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user