code: def test_bound_nest_thread():
      m = te.var("m")
      A = te.placeholder((m), name="A")
      A1 = te.compute((m,), lambda i: A[i], name="A1")
      A2 = te.compute((m,), lambda i: A1[i] + 2, name="A2")
      A3 = te.compute((m,), lambda i: A2[i] + 3, name="A3")
  
      s = te.create_schedule(A3.op)
      s[A2].set_scope("shared")
      s[A1].set_scope("local")
  
      block_x = te.thread_axis("blockIdx.x")
      thread_x = te.thread_axis("threadIdx.x")
      bx, tx = s[A3].split(A3.op.axis[0], factor=32)
      s[A3].bind(bx, block_x)
      s[A3].bind(tx, thread_x)
      s[A2].compute_at(s[A3], tx)
      _, xi = s[A2].split(A2.op.axis[0], nparts=1)
      s[A2].bind(xi, thread_x)
      s[A1].compute_at(s[A3], tx)
      s = s.normalize()
      bounds = tvm.te.schedule.InferBound(s)
      assert bounds[A1.op.axis[0]].extent.value == 1
      assert bounds[A2.op.axis[0]].extent.value == 32
      assert bounds[A3.op.axis[0]].extent == m
  
imports: import tvm
  import tvm.testing
  from tvm import te
label_desc: Use image node_id 17 for calling a global function with example usage: test_bound_nest_thread() without return types