code: def test_schedule_record_gemm():
      with tvm.transform.PassContext(
          config={"te.keep_schedule_record": True}
      ):
          M, K, N = 1024, 1024, 1024
          k = te.reduce_axis((0, K), "k")
          A = te.placeholder((M, K), name="A")
          B = te.placeholder((K, N), name="B")
          C = te.compute(
              (M, N),
              lambda m, n: te.sum(A[m, k] * B[k, n], axis=k),
              name="C",
          )
          s = te.create_schedule(C.op)
          # currently there are no other applied primitives
          # size of schedule record is expected to be 1 (vanilla schedule)
          assert len(s.schedule_record) == 1
          # apply sequential optimizatoin primitives
          block_size, factor = 32, 8
          # tile -> split + split + reorder
          mo, no, mi, ni = s[C].tile(
              C.op.axis[0], C.op.axis[1], block_size, block_size
          )
          ko, ki = s[C].split(k, factor=factor)
          s[C].reorder(mo, ko, no, mi, ki, ni)
          s[C].vectorize(ni)
          s[C].parallel(mo)
          assert len(s.schedule_record) == 8
          # compare primitive names
          expected_names = [
              "vanilla",
              "split",
              "split",
              "reorder",
              "split",
              "reorder",
              "vectorize",
              "parallel",
          ]
          for i in range(len(s.schedule_record)):
              assert s.primitive_record[i] == expected_names[i]
  
imports: import numpy
  import tvm
  from tvm import te
  from tvm.driver.build_module import schedule_to_module
label_desc: Use image node_id 29 for calling a global function with example usage: test_schedule_record_gemm() without return types