Skip to content

[Bug][阻塞] PTODSL's AST rewrite incorrectly reports an inner loop variable as used outside the loop #1096

Description

@liggest

Component

PTODSL

Description

PTODSL 在编译嵌套顺序为 for => with => for 的代码片段时可能失败,错误提示内层循环的变量被用在循环体之外,但实则只被用在了循环体内部

Reproduction (minimal)

例 1:

from ptodsl import pto
@pto.jit(kernel_kind="vector", target="a5", mode="explicit")
def kernel(n: pto.i32):
    for outer in range(0, n):
        with pto.vecscope():
            for row in range(0, 2):
                value = outer + row


kernel.compile()

例 2:

from ptodsl import pto


@pto.jit(kernel_kind="vector", target="a5",mode="explicit")
def kernel(n: pto.i32):
    for outer in range(0, n):
        with pto.for_(0, 2, step=1) as group:
            for row in range(0, 2):
                value = group + row


kernel.compile()

Expected behavior

编译成功通过

Actual behavior / error logs

File "inner_loop_outer_loop.py", line 12, in <module>
    kernel.compile()
  File "ptodsl/ptodsl/_jit.py", line 290, in compile
    return self._compiler.compile(**constexpr_bindings)
  File "ptodsl/ptodsl/_kernel_compilation.py", line 123, in compile
    callback = self.tracing_callback(normalized_bindings)
  File "ptodsl/ptodsl/_kernel_compilation.py", line 98, in tracing_callback
    cached = rewrite_jit_function(self._callback, static_bindings=constexpr_bindings)
  File "ptodsl/ptodsl/_ast_rewrite.py", line 50, in rewrite_jit_function
    function_def.body = rewriter.rewrite_block(function_def.body, live_after=set())
  File "ptodsl/ptodsl/_ast_rewrite.py", line 812, in rewrite_block
    rewritten = self.rewrite_stmt(
  File "ptodsl/ptodsl/_ast_rewrite.py", line 836, in rewrite_stmt
    return self._rewrite_for(
  File "ptodsl/ptodsl/_ast_rewrite.py", line 1145, in _rewrite_for
    body = self.rewrite_block(
  File "ptodsl/ptodsl/_ast_rewrite.py", line 812, in rewrite_block
    rewritten = self.rewrite_stmt(
  File "ptodsl/ptodsl/_ast_rewrite.py", line 848, in rewrite_stmt
    self._rewrite_nested(
  File "ptodsl/ptodsl/_ast_rewrite.py", line 876, in _rewrite_nested
    self.rewrite_block(
  File "ptodsl/ptodsl/_ast_rewrite.py", line 812, in rewrite_block
    rewritten = self.rewrite_stmt(
  File "ptodsl/ptodsl/_ast_rewrite.py", line 836, in rewrite_stmt
    return self._rewrite_for(
  File "ptodsl/ptodsl/_ast_rewrite.py", line 1112, in _rewrite_for
    raise PTODSLAstRewriteError(
ptodsl._ast_rewrite.PTODSLAstRewriteError: ast_rewrite=True runtime for-loops cannot expose the loop induction variable outside the loop yet; use explicit pto.for_(...) for 'row'

Git commit

370e626

Host platform

None

Target Ascend arch (if relevant)

None

PTOAS build level (if relevant)

None

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions