-
Notifications
You must be signed in to change notification settings - Fork 333
[Language] Add missing while statement #1254
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
+141
−1
Merged
Changes from all commits
Commits
Show all changes
6 commits
Select commit
Hold shift + click to select a range
8a823d9
add typing stub for tir.ir
kurisu6912 724f8f0
remove idents
kurisu6912 6e32e69
Merge branch 'main' of https://github.com/tile-ai/tilelang
kurisu6912 fb63cf5
minor update
kurisu6912 3fc146d
[Language] Add missing while statement
kurisu6912 1114cf2
add test
kurisu6912 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,106 @@ | ||
| from typing import TypeVar, Literal | ||
| from tvm.tir.expr import Span, PrimExpr, BufferLoad, Var, IntImm | ||
|
|
||
| _T = TypeVar('_T') | ||
|
|
||
| def abs(x: _T, span: Span | None=None) -> _T: ... | ||
| def acos(x: _T) -> _T: ... | ||
| def acosh(x: _T) -> _T: ... | ||
| def address_of(buffer_load: BufferLoad, span: Span | None=None) -> PrimExpr: ... | ||
| def asin(x: _T) -> _T: ... | ||
| def asinh(x: _T) -> _T: ... | ||
| def atan(x: _T) -> _T: ... | ||
| def atan2(x1: _T, x2: _T) -> _T: ... | ||
| def atanh(x: _T) -> _T: ... | ||
| def bitwise_and(x: _T, y: _T, span: Span | None=None) -> _T: ... | ||
| def bitwise_not(x: _T, span: Span | None=None) -> _T: ... | ||
| def bitwise_or(x: _T, y: _T, span: Span | None=None) -> _T: ... | ||
| def bitwise_xor(x: _T, y: _T, span: Span | None=None) -> _T: ... | ||
| def ceil(x: _T, span: Span | None=None) -> _T: ... | ||
| def clz(x: _T) -> _T: ... | ||
| def copysign(x1: _T, x2: _T) -> _T: ... | ||
| def cos(x: _T) -> _T: ... | ||
| def cosh(x: _T) -> _T: ... | ||
| def erf(x: _T) -> _T: ... | ||
| def exp(x: _T) -> _T: ... | ||
| def exp2(x: _T) -> _T: ... | ||
| def exp10(x: _T) -> _T: ... | ||
| def floor(x: _T, span: Span | None=None) -> _T: ... | ||
| def ceildiv(lhs: _T, rhs: _T, span: Span | None=None) -> _T: ... | ||
| def floordiv(a: _T, b: _T, span: Span | None=None) -> _T: ... | ||
| def floormod(a: _T, b: _T, span: Span | None=None) -> _T: ... | ||
| def fmod(x: _T, y: _T) -> _T: ... | ||
| def hypot(x1: _T, x2: _T) -> _T: ... | ||
| def if_then_else(cond: PrimExpr, t: _T, f: _T, span: Span | None=None) -> _T: ... | ||
| def infinity(dtype: _T, span: Span | None=None) -> _T: ... | ||
| def isfinite(x: _T, span: Span | None=None) -> _T: ... | ||
| def isinf(x: _T, span: Span | None=None) -> _T: ... | ||
| def isnan(x: _T, span: Span | None=None) -> _T: ... | ||
| def isnullptr(x: _T, span: Span | None=None) -> _T: ... | ||
| def ldexp(x1: _T, x2: _T) -> _T: ... | ||
| def likely(cond: _T, span: Span | None=None) -> _T: ... | ||
| def log(x: _T) -> _T: ... | ||
| def log1p(x: _T) -> _T: ... | ||
| def log2(x: _T) -> _T: ... | ||
| def log10(x: _T) -> _T: ... | ||
| def lookup_param(param_name: str, span: Span | None=None) -> PrimExpr: ... | ||
| def max_value(dtype: str, span: Span | None=None) -> PrimExpr: ... | ||
| def min_value(dtype: str, span: Span | None=None) -> PrimExpr: ... | ||
| def nearbyint(x: _T, span: Span | None=None) -> _T: ... | ||
| def nextafter(x1: _T, x2: _T) -> _T: ... | ||
| def popcount(x: _T) -> _T: ... | ||
| def pow(x: _T, y: _T, span: Span | None=None) -> _T: ... | ||
| def q_multiply_shift(x: _T, y: _T, q: _T, s: _T) -> _T: ... | ||
| def q_multiply_shift_per_axis(x: _T, y: _T, ls: _T, rs: _T, q: IntImm, is_lshift_required: IntImm, is_rshift_required: IntImm) -> PrimExpr: ... | ||
| def ret(val: _T) -> _T: ... | ||
| def round(x: _T, span: Span | None=None) -> _T: ... | ||
| def rsqrt(x: _T) -> _T: ... | ||
| def shift_left(x: _T, y: _T, span=None) -> _T: ... | ||
| def shift_right(x: _T, y: _T, span=None) -> _T: ... | ||
| def sigmoid(x: _T) -> _T: ... | ||
| def sin(x: _T) -> _T: ... | ||
| def sinh(x: _T) -> _T: ... | ||
| def sqrt(x: _T) -> _T: ... | ||
| def tan(x: _T) -> _T: ... | ||
| def tanh(x: _T) -> _T: ... | ||
| def trunc(x: _T, span: Span | None=None) -> _T: ... | ||
| def truncdiv(a: _T, b: _T, span: Span | None=None) -> _T: ... | ||
| def truncmod(a: _T, b: _T, span: Span | None=None) -> _T: ... | ||
| def tvm_access_ptr(ptype: PrimExpr, data, offset: int, extent: int, rw_mask: int) -> PrimExpr: ... | ||
| def tvm_throw_last_error() -> _T: ... | ||
| def tvm_stack_alloca(dtype_str: str, num: int) -> PrimExpr: ... | ||
| def tvm_stack_make_shape(*args) -> _T: ... | ||
| def tvm_stack_make_array(data: PrimExpr, shape: PrimExpr, strides: PrimExpr, ndim: PrimExpr, arr_dtype: PrimExpr, elem_offset) -> PrimExpr: ... | ||
| def tvm_check_return(expected: int, return_unexpected: int, nested_call: PrimExpr) -> PrimExpr: ... | ||
| def call_packed(*args, span=None) -> _T: ... | ||
| def call_cpacked(*args, span=None) -> _T: ... | ||
| def call_packed_lowered(*args, span=None) -> _T: ... | ||
| def call_cpacked_lowered(*args, span=None) -> _T: ... | ||
| def tvm_tuple(*value) -> _T: ... | ||
| def tvm_struct_set(arr, index: int, field: int, value: PrimExpr) -> PrimExpr: ... | ||
| def tvm_thread_invariant(cond: _T) -> _T: ... | ||
| def tvm_thread_allreduce(*freduce_args) -> _T: ... | ||
| def tvm_load_matrix_sync(fragment: Var, m: IntImm, n: IntImm, k: IntImm, index: PrimExpr, buffer_ptr: PrimExpr, stride: PrimExpr, layout: Literal['row_major', 'column_major']) -> PrimExpr: ... | ||
| def tvm_mma_sync(fragment_d: Var, index_d: PrimExpr, fragment_a: Var, index_a: PrimExpr, fragment_b: Var, index_b: PrimExpr, fragment_c: Var, index_c: PrimExpr) -> PrimExpr: ... | ||
| def tvm_bmma_sync(fragment_d: Var, index_d: PrimExpr, fragment_a: Var, index_a: PrimExpr, fragment_b: Var, index_b: PrimExpr, fragment_c: Var, index_c: PrimExpr) -> PrimExpr: ... | ||
| def tvm_fill_fragment(fragment: Var, m: IntImm, n: IntImm, k: IntImm, index: PrimExpr, value: PrimExpr) -> PrimExpr: ... | ||
| def tvm_store_matrix_sync(fragment: Var, m: IntImm, n: IntImm, k: IntImm, index: PrimExpr, buffer_ptr: PrimExpr, stride: PrimExpr, layout: Literal['row_major', 'column_major']) -> PrimExpr: ... | ||
| def ptx_wait_group(num: int) -> PrimExpr: ... | ||
| def ptx_commit_group() -> _T: ... | ||
| def ptx_cp_async_barrier(barrier_id: int) -> PrimExpr: ... | ||
| def ptx_init_barrier_thread_count(barrier_id: int, thread_count: int) -> PrimExpr: ... | ||
| def ptx_arrive_barrier(barrier_id: int) -> PrimExpr: ... | ||
| def ptx_arrive_barrier_expect_tx(barrier_id: int, byte_count: int) -> PrimExpr: ... | ||
| def ptx_wait_barrier(barrier_id: int) -> PrimExpr: ... | ||
| def create_barriers(barrier_count: int) -> PrimExpr: ... | ||
| def assume(cond: _T=None) -> _T: ... | ||
| def undef() -> _T: ... | ||
| def TVMBackendAllocWorkspace(device_type: int, device_id: int, nbytes: int, dtype_code_hint: int, dtype_bits_hint: int) -> PrimExpr: ... | ||
| def TVMBackendFreeWorkspace(device_type: int, device_id: int, ptr: Var) -> PrimExpr: ... | ||
| def start_profile_intrinsic(id: int) -> PrimExpr: ... | ||
| def end_profile_intrinsic(id: int) -> PrimExpr: ... | ||
| def anylist_getitem(list_handle, index) -> PrimExpr: ... | ||
| def anylist_resetitem(list_handle, index) -> PrimExpr: ... | ||
| def anylist_setitem_call_packed(list_handle, index, func_name, *args) -> PrimExpr: ... | ||
| def anylist_setitem_call_cpacked(list_handle, index, func_name, *args) -> PrimExpr: ... | ||
| def vscale() -> _T: ... |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
Fix logging call in
ctx_whileto avoid runtime errorsThe new
ctx_whilelogic overall makes sense (evaluatecond()once to obtain aPrimExpr, detect obviously infinite loops, and then build atir.Whileframe), but the warning branch for constant‑false conditions has a subtle bug:loggingtreats the second positional argument as*argsformsg % argsformatting. Since the format string contains no%placeholders, this will raiseTypeError: not all arguments converted during string formattingwhen this branch is hit.You can fix this by folding the condition detail into the message string and passing only keyword arguments:
Everything else in
ctx_whilelooks consistent with the existing builder design (use ofunwrap_cond,check_continue_break, andtir.While).I'll verify the review comment by examining the actual code and confirming the logging bug.
🏁 Script executed:
Length of output: 870
🏁 Script executed:
Length of output: 34
🏁 Script executed:
Length of output: 1129
I need to verify the Python logging behavior. Let me run the test:
Fix logging call in
ctx_whileto avoid runtime errorsThe code has been verified and the issue is confirmed. The
logger.warning()call passes two positional string arguments:Python's logging module treats extra positional arguments as formatting arguments (via
msg % args). Since the first message string contains no%placeholders, this will raiseTypeError: not all arguments converted during string formattingwhen the constant-false condition branch is executed.The suggested fix combines the messages into a single string and uses only keyword arguments:
🧰 Tools
🪛 Ruff (0.14.4)
299-302: Avoid specifying long messages outside the exception class
(TRY003)
🤖 Prompt for AI Agents