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
[email protected]
https://lists.sourceforge.net/lists/listinfo/faudiostream-devel