code: def test_cse_complex_lifting(self):
      x = ir.I32(5)
      sum = ir.ApplyBinaryPrimOp("+", x, x)
      prod = ir.ApplyBinaryPrimOp("*", sum, sum)
      cond = ir.If(ir.ApplyComparisonOp("EQ", prod, x), sum, x)
      expected = (
          "(Let __cse_1 (I32 5)"
          " (Let __cse_2 (ApplyBinaryPrimOp `+` (Ref __cse_1) (Ref __cse_1))"
          " (If (ApplyComparisonOp EQ (ApplyBinaryPrimOp `*` (Ref __cse_2) (Ref __cse_2)) (Ref __cse_1))"
          " (Let __cse_3 (I32 5)"
          " (ApplyBinaryPrimOp `+` (Ref __cse_3) (Ref __cse_3)))"
          " (I32 5))))"
      )
      assert expected == CSERenderer()(cond)
  
imports: import re
  import unittest
  import numpy
  from numpy.testing import assert_array_equal
  import hail
  import hail.ir
  from hail.ir.renderer import CSERenderer
  from hail.expr import construct_expr
  from hail.expr.types import tint32
  from hail.utils.java import Env
  from hail.utils import new_temp_file
  from test.hail.helpers import *
label_desc: Use image node_id 3 for calling the CSETests obj's underlying member method code with example usage: obj.test_cse_complex_lifting() without return types