Hello, simplification() does
... else if (isSigBinOp(sig, &opnum, t1, t2)) { BinOp* op = gBinOpTable[opnum]; Node n1 = t1->node(); Node n2 = t2->node(); ... else if (opnum == kSub && isZero(n1)) return sigBinOp(kMul, sigInt(-1), t2); and this turns 0-x into -1*x . To be honest, I don't understand the point, but at least this transformation is correct. and perhaps C++ compiler will generates the same code with -ffast-math. However, this is inconsistent wrt normalizeAddTerm() which turns -1*x into 0-x ! Example: process(x) = 0-x, -1*x; C++ code: for (int i0 = 0; i0 < count; i0 = i0 + 1) { float fTemp0 = float(input0[i0]); output0[i0] = FAUSTFLOAT(-1.0f * fTemp0); // 0 - x output1[i0] = FAUSTFLOAT(0.0f - fTemp0); // -1 * x } looks obviously suboptimal (even if, again, -ffast-math can help). If I remove the kSub && isZero(n1) "optimization" above I get for (int i0 = 0; i0 < count; i0 = i0 + 1) { float fTemp0 = 0.0f - float(input0[i0]); output0[i0] = FAUSTFLOAT(fTemp0); output1[i0] = FAUSTFLOAT(fTemp0); } which looks obviously better to me. ------------------------------------------------------------------------------- And this is one of the reasons (there are more) why the reverted commit 428eee11896556707b78f9044d66d2397c9884fa which changed realPropagate() --- a/compiler/propagate/propagate.cpp +++ b/compiler/propagate/propagate.cpp @@ -537,7 +537,7 @@ static siglist realPropagate(Tree slotenv, Tree path, Tree box, const siglist& l Tree exp = outsigs[dst - 1]; if ((src > 0) & (src <= ins)) { // we have a source - outsigs[dst - 1] = sigAdd(exp, lsig[src - 1]); + outsigs[dst - 1] = simplify(sigAdd(exp, lsig[src - 1])); } } } can make a difference. Example: process(x) = -x : route(1,1,1,1); diff: - output0[i0] = FAUSTFLOAT(-1.0f * float(input0[i0])); + output0[i0] = FAUSTFLOAT(0.0f - float(input0[i0])); But: process(x) = -x : route(1,1,1,1) : route(1,1,1,1); generates the same code again, with or without the commit above. And of course, process(x) = -x : route(1,1,1,1) : route(1,1,1,1) : route(1,1,1,1); leads to the same diff: - output0[i0] = FAUSTFLOAT(-1.0f * float(input0[i0])); + output0[i0] = FAUSTFLOAT(0.0f - float(input0[i0])); Oleg. _______________________________________________ Faudiostream-devel mailing list Faudiostream-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/faudiostream-devel