[Arith] Restrict floormod coefficient reduction to keep DetectIterMapstable - #19832

Merged
tlopex merged 2 commits into
apache:mainfrom
tlopex:fix-arith-floormod-itermap-19825
Jun 18, 2026
Merged

[Arith] Restrict floormod coefficient reduction to keep DetectIterMapstable#19832
tlopex merged 2 commits into
apache:mainfrom
tlopex:fix-arith-floormod-itermap-19825

Conversation

@tlopex

@tlopextlopex commented Jun 18, 2026

Copy link
Copy Markdown
Member

This PR fixes#19825, which restricts the rewrites

floormod(x * c1 + y, c2) -> floormod(x * floormod(c1, c2) + y, c2)

and

floormod(x + y * c1, c2) -> floormod(x + y * floormod(c1, c2), c2).

While algebraically valid in isolation, these transformations rewrite only the floormod side of a matching floordiv/floormod pair. As a result, the two expressions no longer share a visible fused index expression, causing DetectIterMap to reject otherwise bijective splits such as:

lane = flat % 128
reg = flat // 128

where both expressions originate from the same fused index.

Context

Per the suggestion in #19825, the two rewrites are guarded with c1 % c2 == 0 rather than dropped outright. The multiplied term is still eliminated when it is a multiple of the divisor (e.g. (x*10 + y) % 2 -> y % 2), which is safe for DetectIterMap; only the coefficient-shrinking case (c1 not a multiple of c2) is disabled. Both operand orderings are covered, and the PR adds a rewrite-simplify regression plus an end-to-end DetectIterMap regression test.

@gemini-code-assistgemini-code-assistBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request restricts certain floormod rewrite rules in RewriteSimplifier to only apply when c1 % c2 == 0, and updates the corresponding tests. The reviewer suggests further simplifying the target expressions in both modified rules directly to floormod(y, c2) and floormod(x, c2) respectively, as floormod(c1, c2) always evaluates to 0 under the new conditions, which avoids unnecessary recursive simplification overhead.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines 1251 to +1252
TVM_TRY_REWRITE_IF(floormod(x * c1 + y, c2), floormod(x * floormod(c1, c2) + y, c2),
c2.Eval()->value > 0);
c2.Eval()->value > 0 && c1.Eval()->value % c2.Eval()->value == 0);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Since the rewrite is now restricted to cases where c1 % c2 == 0, floormod(c1, c2) will always evaluate to 0. Therefore, floormod(x * floormod(c1, c2) + y, c2) simplifies directly to floormod(y, c2). We can simplify the target expression directly to floormod(y, c2) to avoid unnecessary recursive simplification steps (such as multiplying by zero and adding zero).

TVM_TRY_REWRITE_IF(floormod(x*c1+y, c2), floormod(y, c2),
c2.Eval()->value>0&&c1.Eval()->value % c2.Eval()->value==0);

Comment on lines 1259 to +1260
TVM_TRY_REWRITE_IF(floormod(x + y * c1, c2), floormod(x + y * floormod(c1, c2), c2),
c2.Eval()->value > 0);
c2.Eval()->value > 0 && c1.Eval()->value % c2.Eval()->value == 0);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Similarly, since c1 % c2 == 0 implies floormod(c1, c2) == 0, the expression floormod(x + y * floormod(c1, c2), c2) simplifies directly to floormod(x, c2). Rewriting directly to floormod(x, c2) avoids intermediate simplification overhead.

TVM_TRY_REWRITE_IF(floormod(x+y*c1, c2), floormod(x, c2),
c2.Eval()->value>0&&c1.Eval()->value % c2.Eval()->value==0);

@tlopex

Copy link
Copy Markdown
MemberAuthor

cc @LeiWang1999

@tqchen

Copy link
Copy Markdown
Member

would be good to add short comment about context

@tlopex
tlopexforce-pushed the fix-arith-floormod-itermap-19825 branch from 6e19711 to c926502CompareJune 18, 2026 19:47
tlopex added 2 commits June 18, 2026 15:52
… stable
The rewrites floormod(x * c1 + y, c2) -> floormod(x * floormod(c1, c2) + y, c2)
and its mirror floormod(x + y * c1, c2) reduce the multiplier modulo the
divisor. This is algebraically valid in isolation, but when the modulo is
paired with the matching floordiv of the same fused index it rewrites only the
modulo's source, so the two halves no longer share a visible fused expression
and DetectIterMap rejects an otherwise bijective split (e.g. a layout that
splits a flat index into lane = flat % 128 and reg = flat // 128).
Guard both rewrites with c1 % c2 == 0 so the multiplied term is only dropped
when it is a multiple of the divisor, which is iter-map-safe, as suggested in
issue apache#19825. Add a rewrite-simplify regression for both operand orderings and
an end-to-end DetectIterMap regression.
The 5D GridSample change (apache#19816) landed with a clang-format violation on
the structured binding for CheckTensorLayout, which fails the repo-wide
pre-commit lint (clang-format v20.1.8). Reformat to satisfy the hook.
@tlopex
tlopexforce-pushed the fix-arith-floormod-itermap-19825 branch from c926502 to b14a680CompareJune 18, 2026 19:52
@tlopex
tlopex merged commit 7bd73e5 into apache:mainJun 18, 2026
9 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Arith] floormod(x * c1 + y, c2) rewrite breaks DetectIterMap on fused div/mod maps

2 participants

@tlopex@tqchen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[Arith] Restrict floormod coefficient reduction to keep DetectIterMapstable - #19832

Merged
tlopex merged 2 commits into
apache:mainfrom
tlopex:fix-arith-floormod-itermap-19825
Jun 18, 2026
Merged

[Arith] Restrict floormod coefficient reduction to keep DetectIterMapstable#19832
tlopex merged 2 commits into
apache:mainfrom
tlopex:fix-arith-floormod-itermap-19825

Conversation

@tlopex

@tlopextlopex commented Jun 18, 2026

Copy link
Copy Markdown
Member

This PR fixes#19825, which restricts the rewrites

floormod(x * c1 + y, c2) -> floormod(x * floormod(c1, c2) + y, c2)

and

floormod(x + y * c1, c2) -> floormod(x + y * floormod(c1, c2), c2).

While algebraically valid in isolation, these transformations rewrite only the floormod side of a matching floordiv/floormod pair. As a result, the two expressions no longer share a visible fused index expression, causing DetectIterMap to reject otherwise bijective splits such as:

lane = flat % 128
reg = flat // 128

where both expressions originate from the same fused index.

Context

Per the suggestion in #19825, the two rewrites are guarded with c1 % c2 == 0 rather than dropped outright. The multiplied term is still eliminated when it is a multiple of the divisor (e.g. (x*10 + y) % 2 -> y % 2), which is safe for DetectIterMap; only the coefficient-shrinking case (c1 not a multiple of c2) is disabled. Both operand orderings are covered, and the PR adds a rewrite-simplify regression plus an end-to-end DetectIterMap regression test.

@gemini-code-assistgemini-code-assistBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request restricts certain floormod rewrite rules in RewriteSimplifier to only apply when c1 % c2 == 0, and updates the corresponding tests. The reviewer suggests further simplifying the target expressions in both modified rules directly to floormod(y, c2) and floormod(x, c2) respectively, as floormod(c1, c2) always evaluates to 0 under the new conditions, which avoids unnecessary recursive simplification overhead.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines 1251 to +1252
TVM_TRY_REWRITE_IF(floormod(x * c1 + y, c2), floormod(x * floormod(c1, c2) + y, c2),
c2.Eval()->value > 0);
c2.Eval()->value > 0 && c1.Eval()->value % c2.Eval()->value == 0);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Since the rewrite is now restricted to cases where c1 % c2 == 0, floormod(c1, c2) will always evaluate to 0. Therefore, floormod(x * floormod(c1, c2) + y, c2) simplifies directly to floormod(y, c2). We can simplify the target expression directly to floormod(y, c2) to avoid unnecessary recursive simplification steps (such as multiplying by zero and adding zero).

TVM_TRY_REWRITE_IF(floormod(x*c1+y, c2), floormod(y, c2),
c2.Eval()->value>0&&c1.Eval()->value % c2.Eval()->value==0);

Comment on lines 1259 to +1260
TVM_TRY_REWRITE_IF(floormod(x + y * c1, c2), floormod(x + y * floormod(c1, c2), c2),
c2.Eval()->value > 0);
c2.Eval()->value > 0 && c1.Eval()->value % c2.Eval()->value == 0);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Similarly, since c1 % c2 == 0 implies floormod(c1, c2) == 0, the expression floormod(x + y * floormod(c1, c2), c2) simplifies directly to floormod(x, c2). Rewriting directly to floormod(x, c2) avoids intermediate simplification overhead.

TVM_TRY_REWRITE_IF(floormod(x+y*c1, c2), floormod(x, c2),
c2.Eval()->value>0&&c1.Eval()->value % c2.Eval()->value==0);

@tlopex

Copy link
Copy Markdown
MemberAuthor

cc @LeiWang1999

@tqchen

Copy link
Copy Markdown
Member

would be good to add short comment about context

@tlopex
tlopexforce-pushed the fix-arith-floormod-itermap-19825 branch from 6e19711 to c926502CompareJune 18, 2026 19:47
tlopex added 2 commits June 18, 2026 15:52
… stable
The rewrites floormod(x * c1 + y, c2) -> floormod(x * floormod(c1, c2) + y, c2)
and its mirror floormod(x + y * c1, c2) reduce the multiplier modulo the
divisor. This is algebraically valid in isolation, but when the modulo is
paired with the matching floordiv of the same fused index it rewrites only the
modulo's source, so the two halves no longer share a visible fused expression
and DetectIterMap rejects an otherwise bijective split (e.g. a layout that
splits a flat index into lane = flat % 128 and reg = flat // 128).
Guard both rewrites with c1 % c2 == 0 so the multiplied term is only dropped
when it is a multiple of the divisor, which is iter-map-safe, as suggested in
issue apache#19825. Add a rewrite-simplify regression for both operand orderings and
an end-to-end DetectIterMap regression.
The 5D GridSample change (apache#19816) landed with a clang-format violation on
the structured binding for CheckTensorLayout, which fails the repo-wide
pre-commit lint (clang-format v20.1.8). Reformat to satisfy the hook.
@tlopex
tlopexforce-pushed the fix-arith-floormod-itermap-19825 branch from c926502 to b14a680CompareJune 18, 2026 19:52
@tlopex
tlopex merged commit 7bd73e5 into apache:mainJun 18, 2026
9 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Arith] floormod(x * c1 + y, c2) rewrite breaks DetectIterMap on fused div/mod maps

2 participants

@tlopex@tqchen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Arith] Restrict floormod coefficient reduction to keep DetectIterMapstable - #19832

Merged
tlopex merged 2 commits into
apache:mainfrom
tlopex:fix-arith-floormod-itermap-19825
Jun 18, 2026
Merged

[Arith] Restrict floormod coefficient reduction to keep DetectIterMapstable#19832
tlopex merged 2 commits into
apache:mainfrom
tlopex:fix-arith-floormod-itermap-19825

Conversation

@tlopex

@tlopextlopex commented Jun 18, 2026

Copy link
Copy Markdown
Member

This PR fixes#19825, which restricts the rewrites

floormod(x * c1 + y, c2) -> floormod(x * floormod(c1, c2) + y, c2)

and

floormod(x + y * c1, c2) -> floormod(x + y * floormod(c1, c2), c2).

While algebraically valid in isolation, these transformations rewrite only the floormod side of a matching floordiv/floormod pair. As a result, the two expressions no longer share a visible fused index expression, causing DetectIterMap to reject otherwise bijective splits such as:

lane = flat % 128
reg = flat // 128

where both expressions originate from the same fused index.

Context

Per the suggestion in #19825, the two rewrites are guarded with c1 % c2 == 0 rather than dropped outright. The multiplied term is still eliminated when it is a multiple of the divisor (e.g. (x*10 + y) % 2 -> y % 2), which is safe for DetectIterMap; only the coefficient-shrinking case (c1 not a multiple of c2) is disabled. Both operand orderings are covered, and the PR adds a rewrite-simplify regression plus an end-to-end DetectIterMap regression test.

@gemini-code-assistgemini-code-assistBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request restricts certain floormod rewrite rules in RewriteSimplifier to only apply when c1 % c2 == 0, and updates the corresponding tests. The reviewer suggests further simplifying the target expressions in both modified rules directly to floormod(y, c2) and floormod(x, c2) respectively, as floormod(c1, c2) always evaluates to 0 under the new conditions, which avoids unnecessary recursive simplification overhead.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines 1251 to +1252
TVM_TRY_REWRITE_IF(floormod(x * c1 + y, c2), floormod(x * floormod(c1, c2) + y, c2),
c2.Eval()->value > 0);
c2.Eval()->value > 0 && c1.Eval()->value % c2.Eval()->value == 0);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Since the rewrite is now restricted to cases where c1 % c2 == 0, floormod(c1, c2) will always evaluate to 0. Therefore, floormod(x * floormod(c1, c2) + y, c2) simplifies directly to floormod(y, c2). We can simplify the target expression directly to floormod(y, c2) to avoid unnecessary recursive simplification steps (such as multiplying by zero and adding zero).

TVM_TRY_REWRITE_IF(floormod(x*c1+y, c2), floormod(y, c2),
c2.Eval()->value>0&&c1.Eval()->value % c2.Eval()->value==0);

Comment on lines 1259 to +1260
TVM_TRY_REWRITE_IF(floormod(x + y * c1, c2), floormod(x + y * floormod(c1, c2), c2),
c2.Eval()->value > 0);
c2.Eval()->value > 0 && c1.Eval()->value % c2.Eval()->value == 0);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Similarly, since c1 % c2 == 0 implies floormod(c1, c2) == 0, the expression floormod(x + y * floormod(c1, c2), c2) simplifies directly to floormod(x, c2). Rewriting directly to floormod(x, c2) avoids intermediate simplification overhead.

TVM_TRY_REWRITE_IF(floormod(x+y*c1, c2), floormod(x, c2),
c2.Eval()->value>0&&c1.Eval()->value % c2.Eval()->value==0);

@tlopex

Copy link
Copy Markdown
MemberAuthor

cc @LeiWang1999

@tqchen

Copy link
Copy Markdown
Member

would be good to add short comment about context

@tlopex
tlopexforce-pushed the fix-arith-floormod-itermap-19825 branch from 6e19711 to c926502CompareJune 18, 2026 19:47
tlopex added 2 commits June 18, 2026 15:52
… stable
The rewrites floormod(x * c1 + y, c2) -> floormod(x * floormod(c1, c2) + y, c2)
and its mirror floormod(x + y * c1, c2) reduce the multiplier modulo the
divisor. This is algebraically valid in isolation, but when the modulo is
paired with the matching floordiv of the same fused index it rewrites only the
modulo's source, so the two halves no longer share a visible fused expression
and DetectIterMap rejects an otherwise bijective split (e.g. a layout that
splits a flat index into lane = flat % 128 and reg = flat // 128).
Guard both rewrites with c1 % c2 == 0 so the multiplied term is only dropped
when it is a multiple of the divisor, which is iter-map-safe, as suggested in
issue apache#19825. Add a rewrite-simplify regression for both operand orderings and
an end-to-end DetectIterMap regression.
The 5D GridSample change (apache#19816) landed with a clang-format violation on
the structured binding for CheckTensorLayout, which fails the repo-wide
pre-commit lint (clang-format v20.1.8). Reformat to satisfy the hook.
@tlopex
tlopexforce-pushed the fix-arith-floormod-itermap-19825 branch from c926502 to b14a680CompareJune 18, 2026 19:52
@tlopex
tlopex merged commit 7bd73e5 into apache:mainJun 18, 2026
9 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Arith] floormod(x * c1 + y, c2) rewrite breaks DetectIterMap on fused div/mod maps

2 participants

@tlopex@tqchen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Arith] Restrict floormod coefficient reduction to keep DetectIterMapstable - #19832

Merged
tlopex merged 2 commits into
apache:mainfrom
tlopex:fix-arith-floormod-itermap-19825
Jun 18, 2026
Merged

[Arith] Restrict floormod coefficient reduction to keep DetectIterMapstable#19832
tlopex merged 2 commits into
apache:mainfrom
tlopex:fix-arith-floormod-itermap-19825

Conversation

@tlopex

@tlopextlopex commented Jun 18, 2026

Copy link
Copy Markdown
Member

This PR fixes#19825, which restricts the rewrites

floormod(x * c1 + y, c2) -> floormod(x * floormod(c1, c2) + y, c2)

and

floormod(x + y * c1, c2) -> floormod(x + y * floormod(c1, c2), c2).

While algebraically valid in isolation, these transformations rewrite only the floormod side of a matching floordiv/floormod pair. As a result, the two expressions no longer share a visible fused index expression, causing DetectIterMap to reject otherwise bijective splits such as:

lane = flat % 128
reg = flat // 128

where both expressions originate from the same fused index.

Context

Per the suggestion in #19825, the two rewrites are guarded with c1 % c2 == 0 rather than dropped outright. The multiplied term is still eliminated when it is a multiple of the divisor (e.g. (x*10 + y) % 2 -> y % 2), which is safe for DetectIterMap; only the coefficient-shrinking case (c1 not a multiple of c2) is disabled. Both operand orderings are covered, and the PR adds a rewrite-simplify regression plus an end-to-end DetectIterMap regression test.

@gemini-code-assistgemini-code-assistBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request restricts certain floormod rewrite rules in RewriteSimplifier to only apply when c1 % c2 == 0, and updates the corresponding tests. The reviewer suggests further simplifying the target expressions in both modified rules directly to floormod(y, c2) and floormod(x, c2) respectively, as floormod(c1, c2) always evaluates to 0 under the new conditions, which avoids unnecessary recursive simplification overhead.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines 1251 to +1252
TVM_TRY_REWRITE_IF(floormod(x * c1 + y, c2), floormod(x * floormod(c1, c2) + y, c2),
c2.Eval()->value > 0);
c2.Eval()->value > 0 && c1.Eval()->value % c2.Eval()->value == 0);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Since the rewrite is now restricted to cases where c1 % c2 == 0, floormod(c1, c2) will always evaluate to 0. Therefore, floormod(x * floormod(c1, c2) + y, c2) simplifies directly to floormod(y, c2). We can simplify the target expression directly to floormod(y, c2) to avoid unnecessary recursive simplification steps (such as multiplying by zero and adding zero).

TVM_TRY_REWRITE_IF(floormod(x*c1+y, c2), floormod(y, c2),
c2.Eval()->value>0&&c1.Eval()->value % c2.Eval()->value==0);

Comment on lines 1259 to +1260
TVM_TRY_REWRITE_IF(floormod(x + y * c1, c2), floormod(x + y * floormod(c1, c2), c2),
c2.Eval()->value > 0);
c2.Eval()->value > 0 && c1.Eval()->value % c2.Eval()->value == 0);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Similarly, since c1 % c2 == 0 implies floormod(c1, c2) == 0, the expression floormod(x + y * floormod(c1, c2), c2) simplifies directly to floormod(x, c2). Rewriting directly to floormod(x, c2) avoids intermediate simplification overhead.

TVM_TRY_REWRITE_IF(floormod(x+y*c1, c2), floormod(x, c2),
c2.Eval()->value>0&&c1.Eval()->value % c2.Eval()->value==0);

@tlopex

Copy link
Copy Markdown
MemberAuthor

cc @LeiWang1999

@tqchen

Copy link
Copy Markdown
Member

would be good to add short comment about context

@tlopex
tlopexforce-pushed the fix-arith-floormod-itermap-19825 branch from 6e19711 to c926502CompareJune 18, 2026 19:47
tlopex added 2 commits June 18, 2026 15:52
… stable
The rewrites floormod(x * c1 + y, c2) -> floormod(x * floormod(c1, c2) + y, c2)
and its mirror floormod(x + y * c1, c2) reduce the multiplier modulo the
divisor. This is algebraically valid in isolation, but when the modulo is
paired with the matching floordiv of the same fused index it rewrites only the
modulo's source, so the two halves no longer share a visible fused expression
and DetectIterMap rejects an otherwise bijective split (e.g. a layout that
splits a flat index into lane = flat % 128 and reg = flat // 128).
Guard both rewrites with c1 % c2 == 0 so the multiplied term is only dropped
when it is a multiple of the divisor, which is iter-map-safe, as suggested in
issue apache#19825. Add a rewrite-simplify regression for both operand orderings and
an end-to-end DetectIterMap regression.
The 5D GridSample change (apache#19816) landed with a clang-format violation on
the structured binding for CheckTensorLayout, which fails the repo-wide
pre-commit lint (clang-format v20.1.8). Reformat to satisfy the hook.
@tlopex
tlopexforce-pushed the fix-arith-floormod-itermap-19825 branch from c926502 to b14a680CompareJune 18, 2026 19:52
@tlopex
tlopex merged commit 7bd73e5 into apache:mainJun 18, 2026
9 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Arith] floormod(x * c1 + y, c2) rewrite breaks DetectIterMap on fused div/mod maps

2 participants

@tlopex@tqchen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[Arith] Restrict floormod coefficient reduction to keep DetectIterMapstable - #19832

Merged
tlopex merged 2 commits into
apache:mainfrom
tlopex:fix-arith-floormod-itermap-19825
Jun 18, 2026
Merged

[Arith] Restrict floormod coefficient reduction to keep DetectIterMapstable#19832
tlopex merged 2 commits into
apache:mainfrom
tlopex:fix-arith-floormod-itermap-19825

Conversation

@tlopex

@tlopextlopex commented Jun 18, 2026

Copy link
Copy Markdown
Member

This PR fixes#19825, which restricts the rewrites

floormod(x * c1 + y, c2) -> floormod(x * floormod(c1, c2) + y, c2)

and

floormod(x + y * c1, c2) -> floormod(x + y * floormod(c1, c2), c2).

While algebraically valid in isolation, these transformations rewrite only the floormod side of a matching floordiv/floormod pair. As a result, the two expressions no longer share a visible fused index expression, causing DetectIterMap to reject otherwise bijective splits such as:

lane = flat % 128
reg = flat // 128

where both expressions originate from the same fused index.

Context

Per the suggestion in #19825, the two rewrites are guarded with c1 % c2 == 0 rather than dropped outright. The multiplied term is still eliminated when it is a multiple of the divisor (e.g. (x*10 + y) % 2 -> y % 2), which is safe for DetectIterMap; only the coefficient-shrinking case (c1 not a multiple of c2) is disabled. Both operand orderings are covered, and the PR adds a rewrite-simplify regression plus an end-to-end DetectIterMap regression test.

@gemini-code-assistgemini-code-assistBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request restricts certain floormod rewrite rules in RewriteSimplifier to only apply when c1 % c2 == 0, and updates the corresponding tests. The reviewer suggests further simplifying the target expressions in both modified rules directly to floormod(y, c2) and floormod(x, c2) respectively, as floormod(c1, c2) always evaluates to 0 under the new conditions, which avoids unnecessary recursive simplification overhead.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines 1251 to +1252
TVM_TRY_REWRITE_IF(floormod(x * c1 + y, c2), floormod(x * floormod(c1, c2) + y, c2),
c2.Eval()->value > 0);
c2.Eval()->value > 0 && c1.Eval()->value % c2.Eval()->value == 0);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Since the rewrite is now restricted to cases where c1 % c2 == 0, floormod(c1, c2) will always evaluate to 0. Therefore, floormod(x * floormod(c1, c2) + y, c2) simplifies directly to floormod(y, c2). We can simplify the target expression directly to floormod(y, c2) to avoid unnecessary recursive simplification steps (such as multiplying by zero and adding zero).

TVM_TRY_REWRITE_IF(floormod(x*c1+y, c2), floormod(y, c2),
c2.Eval()->value>0&&c1.Eval()->value % c2.Eval()->value==0);

Comment on lines 1259 to +1260
TVM_TRY_REWRITE_IF(floormod(x + y * c1, c2), floormod(x + y * floormod(c1, c2), c2),
c2.Eval()->value > 0);
c2.Eval()->value > 0 && c1.Eval()->value % c2.Eval()->value == 0);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Similarly, since c1 % c2 == 0 implies floormod(c1, c2) == 0, the expression floormod(x + y * floormod(c1, c2), c2) simplifies directly to floormod(x, c2). Rewriting directly to floormod(x, c2) avoids intermediate simplification overhead.

TVM_TRY_REWRITE_IF(floormod(x+y*c1, c2), floormod(x, c2),
c2.Eval()->value>0&&c1.Eval()->value % c2.Eval()->value==0);

@tlopex

Copy link
Copy Markdown
MemberAuthor

cc @LeiWang1999

@tqchen

Copy link
Copy Markdown
Member

would be good to add short comment about context

@tlopex
tlopexforce-pushed the fix-arith-floormod-itermap-19825 branch from 6e19711 to c926502CompareJune 18, 2026 19:47
tlopex added 2 commits June 18, 2026 15:52
… stable
The rewrites floormod(x * c1 + y, c2) -> floormod(x * floormod(c1, c2) + y, c2)
and its mirror floormod(x + y * c1, c2) reduce the multiplier modulo the
divisor. This is algebraically valid in isolation, but when the modulo is
paired with the matching floordiv of the same fused index it rewrites only the
modulo's source, so the two halves no longer share a visible fused expression
and DetectIterMap rejects an otherwise bijective split (e.g. a layout that
splits a flat index into lane = flat % 128 and reg = flat // 128).
Guard both rewrites with c1 % c2 == 0 so the multiplied term is only dropped
when it is a multiple of the divisor, which is iter-map-safe, as suggested in
issue apache#19825. Add a rewrite-simplify regression for both operand orderings and
an end-to-end DetectIterMap regression.
The 5D GridSample change (apache#19816) landed with a clang-format violation on
the structured binding for CheckTensorLayout, which fails the repo-wide
pre-commit lint (clang-format v20.1.8). Reformat to satisfy the hook.
@tlopex
tlopexforce-pushed the fix-arith-floormod-itermap-19825 branch from c926502 to b14a680CompareJune 18, 2026 19:52
@tlopex
tlopex merged commit 7bd73e5 into apache:mainJun 18, 2026
9 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Arith] floormod(x * c1 + y, c2) rewrite breaks DetectIterMap on fused div/mod maps

2 participants

@tlopex@tqchen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Arith] Restrict floormod coefficient reduction to keep DetectIterMapstable - #19832

Merged
tlopex merged 2 commits into
apache:mainfrom
tlopex:fix-arith-floormod-itermap-19825
Jun 18, 2026
Merged

[Arith] Restrict floormod coefficient reduction to keep DetectIterMapstable#19832
tlopex merged 2 commits into
apache:mainfrom
tlopex:fix-arith-floormod-itermap-19825

Conversation

@tlopex

@tlopextlopex commented Jun 18, 2026

Copy link
Copy Markdown
Member

This PR fixes#19825, which restricts the rewrites

floormod(x * c1 + y, c2) -> floormod(x * floormod(c1, c2) + y, c2)

and

floormod(x + y * c1, c2) -> floormod(x + y * floormod(c1, c2), c2).

While algebraically valid in isolation, these transformations rewrite only the floormod side of a matching floordiv/floormod pair. As a result, the two expressions no longer share a visible fused index expression, causing DetectIterMap to reject otherwise bijective splits such as:

lane = flat % 128
reg = flat // 128

where both expressions originate from the same fused index.

Context

Per the suggestion in #19825, the two rewrites are guarded with c1 % c2 == 0 rather than dropped outright. The multiplied term is still eliminated when it is a multiple of the divisor (e.g. (x*10 + y) % 2 -> y % 2), which is safe for DetectIterMap; only the coefficient-shrinking case (c1 not a multiple of c2) is disabled. Both operand orderings are covered, and the PR adds a rewrite-simplify regression plus an end-to-end DetectIterMap regression test.

@gemini-code-assistgemini-code-assistBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request restricts certain floormod rewrite rules in RewriteSimplifier to only apply when c1 % c2 == 0, and updates the corresponding tests. The reviewer suggests further simplifying the target expressions in both modified rules directly to floormod(y, c2) and floormod(x, c2) respectively, as floormod(c1, c2) always evaluates to 0 under the new conditions, which avoids unnecessary recursive simplification overhead.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines 1251 to +1252
TVM_TRY_REWRITE_IF(floormod(x * c1 + y, c2), floormod(x * floormod(c1, c2) + y, c2),
c2.Eval()->value > 0);
c2.Eval()->value > 0 && c1.Eval()->value % c2.Eval()->value == 0);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Since the rewrite is now restricted to cases where c1 % c2 == 0, floormod(c1, c2) will always evaluate to 0. Therefore, floormod(x * floormod(c1, c2) + y, c2) simplifies directly to floormod(y, c2). We can simplify the target expression directly to floormod(y, c2) to avoid unnecessary recursive simplification steps (such as multiplying by zero and adding zero).

TVM_TRY_REWRITE_IF(floormod(x*c1+y, c2), floormod(y, c2),
c2.Eval()->value>0&&c1.Eval()->value % c2.Eval()->value==0);

Comment on lines 1259 to +1260
TVM_TRY_REWRITE_IF(floormod(x + y * c1, c2), floormod(x + y * floormod(c1, c2), c2),
c2.Eval()->value > 0);
c2.Eval()->value > 0 && c1.Eval()->value % c2.Eval()->value == 0);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Similarly, since c1 % c2 == 0 implies floormod(c1, c2) == 0, the expression floormod(x + y * floormod(c1, c2), c2) simplifies directly to floormod(x, c2). Rewriting directly to floormod(x, c2) avoids intermediate simplification overhead.

TVM_TRY_REWRITE_IF(floormod(x+y*c1, c2), floormod(x, c2),
c2.Eval()->value>0&&c1.Eval()->value % c2.Eval()->value==0);

@tlopex

Copy link
Copy Markdown
MemberAuthor

cc @LeiWang1999

@tqchen

Copy link
Copy Markdown
Member

would be good to add short comment about context

@tlopex
tlopexforce-pushed the fix-arith-floormod-itermap-19825 branch from 6e19711 to c926502CompareJune 18, 2026 19:47
tlopex added 2 commits June 18, 2026 15:52
… stable
The rewrites floormod(x * c1 + y, c2) -> floormod(x * floormod(c1, c2) + y, c2)
and its mirror floormod(x + y * c1, c2) reduce the multiplier modulo the
divisor. This is algebraically valid in isolation, but when the modulo is
paired with the matching floordiv of the same fused index it rewrites only the
modulo's source, so the two halves no longer share a visible fused expression
and DetectIterMap rejects an otherwise bijective split (e.g. a layout that
splits a flat index into lane = flat % 128 and reg = flat // 128).
Guard both rewrites with c1 % c2 == 0 so the multiplied term is only dropped
when it is a multiple of the divisor, which is iter-map-safe, as suggested in
issue apache#19825. Add a rewrite-simplify regression for both operand orderings and
an end-to-end DetectIterMap regression.
The 5D GridSample change (apache#19816) landed with a clang-format violation on
the structured binding for CheckTensorLayout, which fails the repo-wide
pre-commit lint (clang-format v20.1.8). Reformat to satisfy the hook.
@tlopex
tlopexforce-pushed the fix-arith-floormod-itermap-19825 branch from c926502 to b14a680CompareJune 18, 2026 19:52
@tlopex
tlopex merged commit 7bd73e5 into apache:mainJun 18, 2026
9 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Arith] floormod(x * c1 + y, c2) rewrite breaks DetectIterMap on fused div/mod maps

2 participants

@tlopex@tqchen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Arith] Restrict floormod coefficient reduction to keep DetectIterMapstable - #19832

Merged
tlopex merged 2 commits into
apache:mainfrom
tlopex:fix-arith-floormod-itermap-19825
Jun 18, 2026
Merged

[Arith] Restrict floormod coefficient reduction to keep DetectIterMapstable#19832
tlopex merged 2 commits into
apache:mainfrom
tlopex:fix-arith-floormod-itermap-19825

Conversation

@tlopex

@tlopextlopex commented Jun 18, 2026

Copy link
Copy Markdown
Member

This PR fixes#19825, which restricts the rewrites

floormod(x * c1 + y, c2) -> floormod(x * floormod(c1, c2) + y, c2)

and

floormod(x + y * c1, c2) -> floormod(x + y * floormod(c1, c2), c2).

While algebraically valid in isolation, these transformations rewrite only the floormod side of a matching floordiv/floormod pair. As a result, the two expressions no longer share a visible fused index expression, causing DetectIterMap to reject otherwise bijective splits such as:

lane = flat % 128
reg = flat // 128

where both expressions originate from the same fused index.

Context

Per the suggestion in #19825, the two rewrites are guarded with c1 % c2 == 0 rather than dropped outright. The multiplied term is still eliminated when it is a multiple of the divisor (e.g. (x*10 + y) % 2 -> y % 2), which is safe for DetectIterMap; only the coefficient-shrinking case (c1 not a multiple of c2) is disabled. Both operand orderings are covered, and the PR adds a rewrite-simplify regression plus an end-to-end DetectIterMap regression test.

@gemini-code-assistgemini-code-assistBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request restricts certain floormod rewrite rules in RewriteSimplifier to only apply when c1 % c2 == 0, and updates the corresponding tests. The reviewer suggests further simplifying the target expressions in both modified rules directly to floormod(y, c2) and floormod(x, c2) respectively, as floormod(c1, c2) always evaluates to 0 under the new conditions, which avoids unnecessary recursive simplification overhead.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines 1251 to +1252
TVM_TRY_REWRITE_IF(floormod(x * c1 + y, c2), floormod(x * floormod(c1, c2) + y, c2),
c2.Eval()->value > 0);
c2.Eval()->value > 0 && c1.Eval()->value % c2.Eval()->value == 0);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Since the rewrite is now restricted to cases where c1 % c2 == 0, floormod(c1, c2) will always evaluate to 0. Therefore, floormod(x * floormod(c1, c2) + y, c2) simplifies directly to floormod(y, c2). We can simplify the target expression directly to floormod(y, c2) to avoid unnecessary recursive simplification steps (such as multiplying by zero and adding zero).

TVM_TRY_REWRITE_IF(floormod(x*c1+y, c2), floormod(y, c2),
c2.Eval()->value>0&&c1.Eval()->value % c2.Eval()->value==0);

Comment on lines 1259 to +1260
TVM_TRY_REWRITE_IF(floormod(x + y * c1, c2), floormod(x + y * floormod(c1, c2), c2),
c2.Eval()->value > 0);
c2.Eval()->value > 0 && c1.Eval()->value % c2.Eval()->value == 0);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Similarly, since c1 % c2 == 0 implies floormod(c1, c2) == 0, the expression floormod(x + y * floormod(c1, c2), c2) simplifies directly to floormod(x, c2). Rewriting directly to floormod(x, c2) avoids intermediate simplification overhead.

TVM_TRY_REWRITE_IF(floormod(x+y*c1, c2), floormod(x, c2),
c2.Eval()->value>0&&c1.Eval()->value % c2.Eval()->value==0);

@tlopex

Copy link
Copy Markdown
MemberAuthor

cc @LeiWang1999

@tqchen

Copy link
Copy Markdown
Member

would be good to add short comment about context

@tlopex
tlopexforce-pushed the fix-arith-floormod-itermap-19825 branch from 6e19711 to c926502CompareJune 18, 2026 19:47
tlopex added 2 commits June 18, 2026 15:52
… stable
The rewrites floormod(x * c1 + y, c2) -> floormod(x * floormod(c1, c2) + y, c2)
and its mirror floormod(x + y * c1, c2) reduce the multiplier modulo the
divisor. This is algebraically valid in isolation, but when the modulo is
paired with the matching floordiv of the same fused index it rewrites only the
modulo's source, so the two halves no longer share a visible fused expression
and DetectIterMap rejects an otherwise bijective split (e.g. a layout that
splits a flat index into lane = flat % 128 and reg = flat // 128).
Guard both rewrites with c1 % c2 == 0 so the multiplied term is only dropped
when it is a multiple of the divisor, which is iter-map-safe, as suggested in
issue apache#19825. Add a rewrite-simplify regression for both operand orderings and
an end-to-end DetectIterMap regression.
The 5D GridSample change (apache#19816) landed with a clang-format violation on
the structured binding for CheckTensorLayout, which fails the repo-wide
pre-commit lint (clang-format v20.1.8). Reformat to satisfy the hook.
@tlopex
tlopexforce-pushed the fix-arith-floormod-itermap-19825 branch from c926502 to b14a680CompareJune 18, 2026 19:52
@tlopex
tlopex merged commit 7bd73e5 into apache:mainJun 18, 2026
9 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Arith] floormod(x * c1 + y, c2) rewrite breaks DetectIterMap on fused div/mod maps

2 participants

@tlopex@tqchen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[Arith] Restrict floormod coefficient reduction to keep DetectIterMapstable - #19832

Merged
tlopex merged 2 commits into
apache:mainfrom
tlopex:fix-arith-floormod-itermap-19825
Jun 18, 2026
Merged

[Arith] Restrict floormod coefficient reduction to keep DetectIterMapstable#19832
tlopex merged 2 commits into
apache:mainfrom
tlopex:fix-arith-floormod-itermap-19825

Conversation

@tlopex

@tlopextlopex commented Jun 18, 2026

Copy link
Copy Markdown
Member

This PR fixes#19825, which restricts the rewrites

floormod(x * c1 + y, c2) -> floormod(x * floormod(c1, c2) + y, c2)

and

floormod(x + y * c1, c2) -> floormod(x + y * floormod(c1, c2), c2).

While algebraically valid in isolation, these transformations rewrite only the floormod side of a matching floordiv/floormod pair. As a result, the two expressions no longer share a visible fused index expression, causing DetectIterMap to reject otherwise bijective splits such as:

lane = flat % 128
reg = flat // 128

where both expressions originate from the same fused index.

Context

Per the suggestion in #19825, the two rewrites are guarded with c1 % c2 == 0 rather than dropped outright. The multiplied term is still eliminated when it is a multiple of the divisor (e.g. (x*10 + y) % 2 -> y % 2), which is safe for DetectIterMap; only the coefficient-shrinking case (c1 not a multiple of c2) is disabled. Both operand orderings are covered, and the PR adds a rewrite-simplify regression plus an end-to-end DetectIterMap regression test.

@gemini-code-assistgemini-code-assistBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request restricts certain floormod rewrite rules in RewriteSimplifier to only apply when c1 % c2 == 0, and updates the corresponding tests. The reviewer suggests further simplifying the target expressions in both modified rules directly to floormod(y, c2) and floormod(x, c2) respectively, as floormod(c1, c2) always evaluates to 0 under the new conditions, which avoids unnecessary recursive simplification overhead.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines 1251 to +1252
TVM_TRY_REWRITE_IF(floormod(x * c1 + y, c2), floormod(x * floormod(c1, c2) + y, c2),
c2.Eval()->value > 0);
c2.Eval()->value > 0 && c1.Eval()->value % c2.Eval()->value == 0);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Since the rewrite is now restricted to cases where c1 % c2 == 0, floormod(c1, c2) will always evaluate to 0. Therefore, floormod(x * floormod(c1, c2) + y, c2) simplifies directly to floormod(y, c2). We can simplify the target expression directly to floormod(y, c2) to avoid unnecessary recursive simplification steps (such as multiplying by zero and adding zero).

TVM_TRY_REWRITE_IF(floormod(x*c1+y, c2), floormod(y, c2),
c2.Eval()->value>0&&c1.Eval()->value % c2.Eval()->value==0);

Comment on lines 1259 to +1260
TVM_TRY_REWRITE_IF(floormod(x + y * c1, c2), floormod(x + y * floormod(c1, c2), c2),
c2.Eval()->value > 0);
c2.Eval()->value > 0 && c1.Eval()->value % c2.Eval()->value == 0);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Similarly, since c1 % c2 == 0 implies floormod(c1, c2) == 0, the expression floormod(x + y * floormod(c1, c2), c2) simplifies directly to floormod(x, c2). Rewriting directly to floormod(x, c2) avoids intermediate simplification overhead.

TVM_TRY_REWRITE_IF(floormod(x+y*c1, c2), floormod(x, c2),
c2.Eval()->value>0&&c1.Eval()->value % c2.Eval()->value==0);

@tlopex

Copy link
Copy Markdown
MemberAuthor

cc @LeiWang1999

@tqchen

Copy link
Copy Markdown
Member

would be good to add short comment about context

@tlopex
tlopexforce-pushed the fix-arith-floormod-itermap-19825 branch from 6e19711 to c926502CompareJune 18, 2026 19:47
tlopex added 2 commits June 18, 2026 15:52
… stable
The rewrites floormod(x * c1 + y, c2) -> floormod(x * floormod(c1, c2) + y, c2)
and its mirror floormod(x + y * c1, c2) reduce the multiplier modulo the
divisor. This is algebraically valid in isolation, but when the modulo is
paired with the matching floordiv of the same fused index it rewrites only the
modulo's source, so the two halves no longer share a visible fused expression
and DetectIterMap rejects an otherwise bijective split (e.g. a layout that
splits a flat index into lane = flat % 128 and reg = flat // 128).
Guard both rewrites with c1 % c2 == 0 so the multiplied term is only dropped
when it is a multiple of the divisor, which is iter-map-safe, as suggested in
issue apache#19825. Add a rewrite-simplify regression for both operand orderings and
an end-to-end DetectIterMap regression.
The 5D GridSample change (apache#19816) landed with a clang-format violation on
the structured binding for CheckTensorLayout, which fails the repo-wide
pre-commit lint (clang-format v20.1.8). Reformat to satisfy the hook.
@tlopex
tlopexforce-pushed the fix-arith-floormod-itermap-19825 branch from c926502 to b14a680CompareJune 18, 2026 19:52
@tlopex
tlopex merged commit 7bd73e5 into apache:mainJun 18, 2026
9 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Arith] floormod(x * c1 + y, c2) rewrite breaks DetectIterMap on fused div/mod maps

2 participants

@tlopex@tqchen