Yes, indeed...

`preprocess_for_cse` with `factor_terms`  firstly transforms `2*x+2*y+2*z` into `2*(x+y+z)`, but this factorization is lost when tree is rebuilt due to `new_expr = Op(*map(_recreate, args))`...

A quick and possibly dirty fix would be putting
`optimizations=[(factor_terms, factor_terms)]` instead of `optimizations=[(factor_terms, None)]`

Nonetheless, current fast_cse branch code outputs
`([(x0, x + y + z)], [2*x0, 3*x0])`
for
`cse([2*x+2*y+2*z, 3*x+3*y+3*z], optimizations=[(factor_terms, None)])`,
so, if `factor_terms` is used just for increasing optimization opportunities, such opportunities are still taken into account.

Moreover, for master branch cse
`cse([2*sin(x) + 2*y + 2*z, sin(x)])`
outputs
`[(x0, sin(x))], [2*x0 + 2*y + 2*z, x0]`,
rather than
`[(x0, sin(x))], [2*(x0 + y + z), x0]`.