As the title says, TIR.expr.ExprOp has eq and ne magics that are defined differently (EqualOp, and NotEqualOp classes) than the other methods (defined through the ffi api). This means, that the generated Nodes behave differently, most importantly the dtype attribute is missing from the node, causing ir_builder’s BufferVar.setitem to throw an error. (And maybe in other use cases, this is what I found.) As this attribute is present in any other Node, I think it should be included in these nodes as well, either in place, of by inheritance. Or the setitem method should be changed, to handle these cases.
The objects only match the other operations, if the .asobject is called on the created Eq Node, calling this by default might also resolve this difference.