Fold OpLoad from Private variables with constant initializers#512
Merged
LegNeato merged 1 commit intoRust-GPU:mainfrom Jan 13, 2026
Merged
Fold OpLoad from Private variables with constant initializers#512LegNeato merged 1 commit intoRust-GPU:mainfrom
LegNeato merged 1 commit intoRust-GPU:mainfrom
Conversation
Disclosure: I had AI write this and I only superficially understand the code. Replace OpLoad from Private/Function storage class variables with their constant initializers. This eliminates pointer-to-pointer patterns like `&&123` which would otherwise generate invalid SPIR-V in Logical addressing mode (pointer-to-pointer is only allowed for StorageBuffer/Workgroup, not Private). The optimization runs after inlining (which may expose such patterns) and before DCE (so the now-unused variables can be removed). Also extend DCE to treat Private storage class variables as pure, allowing them to be removed when unused. Newer versions of spirv-val catch this, acusing compiletests to fail.
Firestar99
approved these changes
Jan 13, 2026
Member
Firestar99
left a comment
There was a problem hiding this comment.
Code looks good!
And indeed spirv-tools v2025.5 (pulled from nix unstable) introduces a new validation rule that is failing nested-ref:
error: error:0:0 - In Logical addressing, variables can only allocate a pointer to the StorageBuffer or Workgroup storage classes
%3 = OpVariable %_ptr_Private__ptr_Private_uint Private %4
|
= note: spirv-val failed
= note: module `$TEST_BUILD_DIR/lang/consts/nested-ref.vulkan1.2`
Member
|
For a moment I was considering if this transformation may be unsound. There could be a situation where an |
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Disclosure: I had AI write this and I only superficially understand the code.
Replace OpLoad from Private/Function
storage class variables with their constant initializers. This eliminates pointer-to-pointer patterns like
&&123which would otherwise generate invalid SPIR-V in Logical addressing mode (pointer-to-pointer is only allowed for StorageBuffer/Workgroup, not Private).The optimization runs after inlining (which may expose such patterns) and before DCE (so the now-unused variables can be removed).
Also extend DCE to treat Private storage class variables as pure, allowing them to be removed when unused.
Newer versions of spirv-val catch this, causing our compiletests to fail.