Skip to content

[GVN] Don't coerce vector store via i128+#8574

Merged
llvm-beanz merged 1 commit into
microsoft:mainfrom
llvm-beanz:8573
Jun 26, 2026
Merged

[GVN] Don't coerce vector store via i128+#8574
llvm-beanz merged 1 commit into
microsoft:mainfrom
llvm-beanz:8573

Conversation

@llvm-beanz

@llvm-beanz llvm-beanz commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator

GVN forwards a wide stored value to a narrow load from the same address by bitcasting the stored value to an integer, then truncating to the loaded value's size. This avoids re-loading a value that was just stored.

For DXIL this is unsafe if the wider size is greater than 64-bits since DXIL doesn't allow integers larger than 64-bits. This change disables coercing in this case. This shouldn't cause any regressions in practice because the current validator fails to allow this code.

We could consider more robust load-store optimizations and coercion to integer vectors as an alternative, but at this time the important thing is to make DXC not generate invalid DXIL, which this simplified change does.

Fixes #8573

Assisted by Claude Opus 4.7

GVN forwards a wide stored value to a narrow load from the same addres
by bitcasting the stored value to an integer, then trucating to the
loaded value's size. This avoids re-loading a value that was just
stored.

For DXIL this is unsafe if the wider size is greater than 64-bits since
DXIL doesn't allow integers larger than 64-bits. This change disables
coercing in this case. This shoudln't cause any performance regressions
in practice because no existing cases can generate valid DXIL of this
form, but it does generate less optimal final output.

We could consider more robust load-store optimizations and coersion to
integer vectors as an alternative, but at this time the important thing
is to make DXC not generate invalid DXIL, which this simplified change
does.

Assisted by Claude Opus 4.7

@Icohedron Icohedron left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTUS @inbelic @alsepkow

one nit about the PR description though:

This shouldn't cause any performance regressions in practice because no existing cases can generate valid DXIL of this form, but it does generate less optimal final output.

Is the final output really "less optimal" if the "optimal" is invalid?

@llvm-beanz

Copy link
Copy Markdown
Collaborator Author

Is the final output really "less optimal" if the "optimal" is invalid?

Fair that my wording was confusing. The thing that's a bit silly about the DXIL rules here is that there's not really any good reason why i128's aren't legal. In practice i128s and bitwise operations on them (probably not arithmetic) should be trivial to implement and likely allow backends to generate better final code, but DXIL disallows them.

@llvm-beanz llvm-beanz merged commit ece8446 into microsoft:main Jun 26, 2026
15 checks passed
@llvm-beanz llvm-beanz deleted the 8573 branch June 26, 2026 16:44
@github-project-automation github-project-automation Bot moved this from New to Done in HLSL Roadmap Jun 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

[6.9] Invalid integer size created by GVN

3 participants