Skip to content

Upgrade elim-local-single-block for OpenCL.DebugInfo.100#3451

Merged
jaebaek merged 1 commit intoKhronosGroup:masterfrom
greg-lunarg:dbg_store4
Jul 9, 2020
Merged

Upgrade elim-local-single-block for OpenCL.DebugInfo.100#3451
jaebaek merged 1 commit intoKhronosGroup:masterfrom
greg-lunarg:dbg_store4

Conversation

@greg-lunarg
Copy link
Copy Markdown
Contributor

Essentially creates a DebugValue when removing a store to a local variable.

@greg-lunarg
Copy link
Copy Markdown
Contributor Author

This is WIP as I have not yet written a test. Once the reviewers have agreed to the approach I have used I will write a test.

The approach I have used is to generate DebugValue instructions without removing the associated DebugDeclare. I did not want to remove the DebugDeclare since this pass will always leave at least one Store to the variable. So this pass will leave SPIR-V such that there are both DebugDeclares and DebugValues for the same variable.

This is not expressly ruled out in any spec I could find, although it probably isn't ideal for tools. The good news is that this is only done when it is quite certain that a subsequent pass of ssa-rewrite will clean up the DebugDeclare. Specifically, we will only replace a Store with a DebugValue for scalar variables.

For additional consideration, this pass was written solely to improve the performance of ssa-rewrite, so we can generally expect a pass of ssa-rewrite to follow. It does for all the optimization sequences currently used by glslang and dxc.

Also for consideration: ssa-rewrite and other analyses that remove stores should be able to deal with this hybrid situation without difficulty, just concentrating on the DebugDeclare and Stores and ignoring any associated DebugValues.

@greg-lunarg
Copy link
Copy Markdown
Contributor Author

@jaebaek Please review

Copy link
Copy Markdown
Contributor

@jaebaek jaebaek left a comment

Choose a reason for hiding this comment

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

Thank you for this PR!

if (supported_ref_ptrs_.find(ptrId) != supported_ref_ptrs_.end()) return true;
if (get_def_use_mgr()->WhileEachUser(ptrId, [this](Instruction* user) {
auto dbg_op = user->GetOpenCL100DebugOpcode();
if (dbg_op == OpenCLDebugInfo100DebugDeclare) {
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.

I think we have to allow OpenCLDebugInfo100DebugDeclare as well.
See the following example that has DebugValue referencing a local variable pointer:

%deref = OpExtInst %void %ext DebugOperation Deref
%deref_expr = OpExtInst %void %ext DebugExpression %deref
...
%foo = OpVariable %ptr_Function_int Function
...
OpStore %foo %int_13
%val = OpExtInst %void %ext DebugValue %dbg_foo %foo %deref_expr

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.

@greg-lunarg I believe that jaebaek is right. You should look for a DebugValue here as well. Scalar replacement will be replacing DebugDeclare instructions with DebugValue instruction as shown above. This would still be a supported ref.

instructions_to_save.count(prev_store->second) == 0) {
instructions_to_save.count(prev_store->second) == 0 &&
!(IsArrayOrStruct(varId) &&
get_debug_info_mgr()->IsDebugDeclared(varId))) {
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.

In my opinion, we should allow delete store for this case. Consider the following example:

%empty_expr = OpExtInst %void %ext DebugExpression
...
%foo = OpVariable %ptr_Function_int Function
...
OpStore %foo %int_13  // will be deleted
OpStore %foo %int_17
%decl = OpExtInst %void %ext DebugDeclare %dbg_foo %foo %empty_expr

We have to delete OpStore %foo %int_13.

The following case looks non-trivial:

%empty_expr = OpExtInst %void %ext DebugExpression
...
%foo = OpVariable %ptr_Function_int Function
...
OpStore %foo %int_13  // will be deleted
%decl = OpExtInst %void %ext DebugDeclare %dbg_foo %foo %empty_expr
...
OpStore %foo %int_17

IMO, we have to change it to

%empty_expr = OpExtInst %void %ext DebugExpression
...
%foo = OpVariable %ptr_Function_int Function
...
%val = OpExtInst %void %ext DebugValue %dbg_foo %int_13 %empty_expr
...
OpStore %foo %int_17
%decl = OpExtInst %void %ext DebugDeclare %dbg_foo %foo %empty_expr

What do you think?

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.

I think we should just not delete the store for any variable (scalars as well) that have a debug declare. If DebugDeclare is suppose to match llvm.dbg.declare, the address has to always contains the correct value. However, the spir-v extension is not as clear as the llvm-ir spec, this might be fine.

I think that as long as we still remove the loads, this pass will still do what it needs to do.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

For clarification, do you believe that we should not remove the store even if we replace it with a DebugValue, which is being done here?

More generally, can we allow DebugDeclare and DebugValue to coexist for the same DebugLocalVariable? I think we can temporarily within spirv-opt as long as we ultimately remove the DebugDeclares before outputting the SPIR-V.

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.

I don't think we should remove the store. The DebugValue is not needed, but I don't think it hurts.

can we allow DebugDeclare and DebugValue to coexist for the same DebugLocalVariable?

The spec is so unclear, I am not sure what we can or cannot do. I believe it would be okay to have both as long as they give the same information.

I think we can temporarily within spirv-opt as long as we ultimately remove the DebugDeclares before outputting the SPIR-V.

If we could guarantee that users always run ssa-rewrite then I could agree with this: temporarily invalid code is fine. However, our passes are meant to be used in potentially any order. We have tried to ensure that no pass requires another pass to run in order to be correct. The only exception so far is merge-return and dead-branch elimination. In that case an error is emitted (https://github.com/KhronosGroup/SPIRV-Tools/blob/master/source/opt/merge_return_pass.cpp#L108).

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.

Ah ok, my comment was wrong.
llvm-dbg-declare explains "It is not control-dependent ... that address is considered to be the true home of the variable across its entire lifetime."

We must not delete the store if the variable is used for DebugDeclare.

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.

Can/should the legalization passes do less optimization in the presense of OpenCL.DebugInfo.100? For example, can/should the passes not eliminate OpStores? I think it is possible to eliminate OpStores as long as we replace them with DebugValues.

If the OpVariable is used by a DebugDeclare or a DebugValue then we should not remove the store unless you can also remove the use in the DebugDeclare or DebugValue. ssa-rewrite if removing the DebugDeclare and DebugValue, so later passes like ADCE can remove the stores. We can still remove the loads at any time, and do the copy propagation etc.

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.

I think it might be possible to legalize without removing OpStores. I will have to go back to our original legalization shaders and see. I just thought, to be safe, we should try to stick to the original passes as closely as possible but still retain the debug information.

I believe so as well, as long at the loads are removed. That is what we really wanted from elim-local-single-block and elim-local-single-store anyway.

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.

I am asking because I am looking at DCE right now which eliminates a lot of OpStores. If you think that is bad, it would be good to know now.

As I said before DCE should not remove the store if the OpVariable is used in a DebugDeclare or DebugValue. The ssa rewriter should remove those uses in cases where we can remove the stores, so I don't think it will hinder optimization.

Copy link
Copy Markdown
Contributor Author

@greg-lunarg greg-lunarg Jun 23, 2020

Choose a reason for hiding this comment

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

I think it is ok to replace a single OpStore with a DebugValue as long as we eventually replace them all and get rid of the DebugDeclare before outputting the SPIR-V.

I agree with the general philosophy that each pass should be able to stand alone, but elim-local-single-block is not really a stand-alone pass; it was written to be a helper to ssa-rewrite, so I think it is ok to assume that ssa-rewrite will follow.

That said, I don't think its a huge deal if we don't eliminate OpStores in elim-local-single-block; follow up passes will take care of them. I was just trying to create as little new logic and exceptions and different behavior for DebugInfo as possible in the interest of reducing complexity.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

OK. Just looked at output from ssa-rewrite. Now I understand your approach better.

ssa-rewrite is adding DebugValue after each Store and removing the DebugDeclare. So essentially ssa-rewrite is preparing the OpStores and OpVariable for deletion.

I can work with this model now that I understand it.

@s-perron
Copy link
Copy Markdown
Collaborator

Thanks for this Greg. This looks good in general. The problem I am having with all of this debug stuff is how imprecise the specification of the debug extension is.

@greg-lunarg greg-lunarg force-pushed the dbg_store4 branch 3 times, most recently from e40f51d to 6ea60e0 Compare June 24, 2020 06:12
@greg-lunarg
Copy link
Copy Markdown
Contributor Author

I have changed this to only avoiding deleting a store in the case that the variable is has a DebugDeclare, deferring to ssa-rewrite to take care of it. I have also added a test and thus have removed the WIP.

@greg-lunarg greg-lunarg changed the title WIP: Upgrade elim-local-single-block for OpenCL.DebugInfo.100 Upgrade elim-local-single-block for OpenCL.DebugInfo.100 Jun 24, 2020
Copy link
Copy Markdown
Collaborator

@s-perron s-perron left a comment

Choose a reason for hiding this comment

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

This looks good. However, I think we need to make it a little bit more general. The address can also appear in a DebugValue instruction. Those should not stop the loads from being removed.

if (supported_ref_ptrs_.find(ptrId) != supported_ref_ptrs_.end()) return true;
if (get_def_use_mgr()->WhileEachUser(ptrId, [this](Instruction* user) {
auto dbg_op = user->GetOpenCL100DebugOpcode();
if (dbg_op == OpenCLDebugInfo100DebugDeclare) {
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.

@greg-lunarg I believe that jaebaek is right. You should look for a DebugValue here as well. Scalar replacement will be replacing DebugDeclare instructions with DebugValue instruction as shown above. This would still be a supported ref.

SinglePassRunAndMatch<LocalSingleBlockLoadStoreElimPass>(text, false);
}

TEST_F(LocalSingleBlockLoadStoreElimTest, DebugInfoTest) {
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.

This is a good test. We should add another one where a DebugValue with a dref expression is used in place of the DebugDeclare. We would expect the same resutls.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I admit that the OpenCL.DebugInfo.100 spec is vague, but after some research and thought, I do not believe that a DebugValue with a deref of a pointer Value is the same as a DebugDeclare. A DebugValue represents an assignment of the Value and Expression to the rvalue of the LocalVariable. A DebugDeclare represents an "equivalencing" of the Expression applied to lvalue of the Variable to the lvalue of the LocalVariable. I am fairly certain these are not the same thing.

I am also fairly certain that we will never have cause to have a deref in an Expression in a DebugValue in a shader. The Variable would have to be of type pointer into function scope memory which don't exist in shaders.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

After some thought, while I am still fairly certain that one cannot use a DebugValue to create an equivalent to a DebugDeclare in a shader, I will grant that one could create a legitimate DebugValue that contains a deref of a local pointer for a shader, However, I think that such a reference would be so highly unlikely that it would not be worth creating the logic to add it to the supported references for this optimization. If such a thing did appear, it would merely disable optimization and not generate incorrect code. So I think the existing logic is reasonable and acceptable at this time. If someone can make an argument for why such a construct would be prevalent enough to justify optimization here, we can reconsider this logic at that time.

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.

A DebugValue represents an assignment of the Value and Expression to the rvalue of the LocalVariable.

I have thought about this a lot as well when trying to figure out the design for scalar replacement. I understand your point of view. At first, I was thinking that way as well. However, I started thinking about how this would actually be implemented by a debugger, and in dwarf. In DWARF, you don't give the value of a variable. DWARF say where you go to get the value (register or memory). The important point to realize is that the DebugValue is not an assignment of a value. This can be easily confused when rerefs are not used because, in llvm-ir and in spir-v, the ssa value cannot be changed.

The other reason that I believed the llvm.dbg.value could not be viewed as an assignment of a value is the extra work this would put on debuggers, and how it would slow down debugging. The debugging info is not present in the machine code. If the debugger was required to capture the value of the expression at every llvm.dbg.value, the debugger would have to stop the normal execution of the program at every position of an llvm.dbg.value to read the value. This would cause a ridiculous amount of overhead in debugging. We wouldn't want a spir-v debugger to have to do the same.

Granted this was just guesses, which is why I ask Jaebaek to look at what code actually gets generated by llvm-ir when a debug value is used with a dref expression, and to examine what a real debugger does with it. We hand wrote llvm-ir that has exactly one llvm.dbg.value where the address of the memory location is the value and there is a deref expression. The instruction was placed after the first store to the memory location. There was a second store to the same memory location, but there was not a second llvm.dbg.value. When running in the debugger, you see the value of the first store when you break after the first store. However, when you break after the second store, you see the result of the second store. The debugger did not capture the value of the first store to be used anytime the developer asks for the value of the variable. The debugger checks the value in the memory location.

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.

As Steven mentioned, we confirmed that GDB can track a variable decorated by llvm.dbg.value with deref similar to a variable decorated by llvm.dbg.declare.
Since I am also considering how I should understand the "debug value", I recently conducted one more experiment, in particular, to check "llvm.dbg.declare is not control-dependent" (See llvm-dbg-declare).

I moved llvm.dbg.declare and print the variable value in GDB. It is independent on its position but it depends on its scope. If it is under a function, we can print the value of the variable anytime in the function even when I moved it to the end of the function.

I tested the same thing using llvm.dbg.value, but it is control-dependent. As far as I understand, it is the only difference between debug value with deref and debug declare in the view of GDB (and the DWARF section generated by the LLVM IR. I checked the X86 assembly code).
I am still considering how it affects on our implementation. The main concern is how to keep the position of debug value in DebugInfoManager and how to handle reference variables or pointer-to-pointer replacements, but for the this unit test, I agree with Steven that it would be better to add a test simulating the case we use DebugValue with Deref instead of DebugDeclare.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

OK. Thanks for the detailed response. I do now agree that a DebugDeclare can be replaced with a DebugValue with a deref, and I apologize that it took me this long to come to this understanding.

So I guess now the question in my mind is: is this really what we want to do?

Essentially, to do this, we have to keep backing memory for all locals (function scope variables) and keep all Stores to that memory that we normally remove. So we will have to add extra logic to all optimizations that eliminate stores. In one way it will be simpler for the optimizer since it only has to generate one DebugValue at the top of the program, but there will be performance cost from the extra Stores.

This design will also require a whole additional and redundant memory analysis of derefs in DebugValues.

The next question is: do we need to do this? You opined above that DebugValue would be intractable for debuggers as I imagined them. But if you look at https://llvm.org/docs/SourceLevelDebugging.html#object-lifetime-in-optimized-code it appears that llvm.dbg.value is being used in just this manner.

As far as debugger implementation, I imagine the debugger would be able to create a fairly simple map for each local variable, mapping a line number range to a register.

Still, your design will functionally work, albeit with probable performance costs, and I can work with it.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I think I can just look at the Value field of the DebugValue and see if its a pointer, so that should be fairly easy.

Copy link
Copy Markdown
Contributor

@jaebaek jaebaek Jun 29, 2020

Choose a reason for hiding this comment

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

Your questions are very important questions to remove the technical debt and make a reasonable design. I appreciate it. I am conducting more experiments to figure out the relationship between llvm.dbg.declare and llvm.dbg.value particularly with DW_OP_LLVM_fragment.

I am sorry for delaying approval for this PR long time but I suspect using DebugValue with Deref for the declare. I want to take more time to consider this issue before going further.

IIRC, we decided to use DebugValue with Deref to express the declaration because we thought it is the only way to express the declaration in the scalar replacement. In LLVM world, SROA conducts both the scalar replacement and ssa-rewrite in a single pass, so it does not have to consider "splitting a composite type while keeping the information of declaration". On the other hand, spirv-opt scalar replacement must "split a composite type while keeping the information of declaration". Since DebugDeclare does not have Indexes operand while DebugValue does, we had no idea how to use DebugDeclare for each member of a composite. See DebugDeclare.

The main questions I currently have are

  • Q1: Does LLVM SROA pass propagate llvm.dbg.value for store and phi instructions when we give llvm.dbg.value with DW_OP_deref?
  • Q2: Can we use DW_OP_LLVM_fragment with llvm.dbg.declare for the scalar replacement?
  • Q3: Is there a way to express a member of a composite using DebugDeclare and Deref operation?

If Q2 and Q3 are true, I think we do not have to use DebugValue with Deref for the declaration in the scalar replacement.
In addition, if Q2 and Q3 are true and Q1 is false, it would be better to follow what LLVM does i.e., we must not use DebugValue with Deref as a declaration.

In my brief experiments, Q1 is false and Q2 is true, but I am doublechecking it if I made some mistakes. I am also digging into LLVM source code.
As far as I understand, DW_OP_LLVM_fragment is applied to the variable not its value of llvm.dbg.value nor its storage of llvm.dbg.declare.
I am curious what DW_OP_bit_piece means because I guess (I do not have any evidence yet) that it is applied to the value of llvm.dbg.value or the storage of llvm.dbg.declare.

For Q3, I am discussing the spec change with the initial author of the spec.

Please give me 1 or 2 more days. I will figure them out and let you know.

Copy link
Copy Markdown
Contributor

@jaebaek jaebaek left a comment

Choose a reason for hiding this comment

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

Ok. This PR looks good to me. I want to consider the DebugValue with Deref issue more but I do not want to block your work. I believe we can update it later if we want. Thank you for working on it!

@greg-lunarg
Copy link
Copy Markdown
Contributor Author

@s-perron I think have provided all of your requested changes. Is there anything else that is needed?

@jaebaek
Copy link
Copy Markdown
Contributor

jaebaek commented Jul 8, 2020

@greg-lunarg Steven is on vacation and he will not work for a while. I think this PR is ready to be submitted.

I will open a separate bug if we have to update the part related to DebugValue.

@jaebaek jaebaek merged commit 4442835 into KhronosGroup:master Jul 9, 2020
@jaebaek jaebaek mentioned this pull request Jul 9, 2020
@s-perron
Copy link
Copy Markdown
Collaborator

This looks good to me. Thanks.

dnovillo pushed a commit to dnovillo/SPIRV-Tools that referenced this pull request Aug 19, 2020
…p#3451)

Creates a DebugValue when removing a store to a local variable.
dneto0 pushed a commit to dneto0/SPIRV-Tools that referenced this pull request Sep 14, 2024
Roll third_party/effcee/ 5af957bbf..2ec8f8738 (3 commits)

google/effcee@5af957b...2ec8f87

$ git log 5af957bbf..2ec8f8738 --date=short --no-merges --format='%ad %ae %s'
2020-06-16 dneto Start v2020.0-dev
2020-06-16 dneto Finalize v2019.1
2020-06-15 dneto Update CHANGES

Created with:
  roll-dep third_party/effcee

Roll third_party/glslang/ e8c9fd6..b481744 (19 commits)

KhronosGroup/glslang@e8c9fd6...b481744

$ git log e8c9fd6..b481744 --date=short --no-merges --format='%ad %ae %s'
2020-07-14 bclayton Give build_info.py the executable bit
2020-07-14 cepheus Fix recently found non-determinism with gl_WorldToObject3x4EXT.
2020-07-14 cepheus Non-determinism: Remove test file that seems to trigger non-determinism.
2020-07-13 bclayton Add bison license to LICENSE.txt
2020-07-13 bclayton CMake: Move project() to top of CMakeLists.txt
2020-07-13 bclayton Kokoro: Print test output to stdout
2020-07-13 cepheus Fix comma in licence checker.
2020-07-13 cepheus Revert "Merge pull request KhronosGroup#2330 from ShabbyX/optimize_for_angle"
2020-07-13 cepheus Fix a couple lines that were too long, to retrigger bots.
2020-07-13 cepheus Fix KhronosGroup#2329: don't use invalid initializers.
2020-07-12 bclayton Add missing comma from license-checker.cfg
2020-07-12 ccom Common: include standard headers before doing any defines
2020-07-10 bclayton Fix CMake rules when nesting CMake projects
2020-07-10 bclayton Attempt to fix chromium builds
2020-06-17 bclayton Generate build information from CHANGES.md
2020-07-03 ShabbyX Customize glslang.y to GLSLANG_ANGLE
2020-07-03 ShabbyX Use GLSLANG_ANGLE to strip features to what ANGLE requires
2020-07-07 rharrison Make sure glslang_angle has a definition in BUILD.gn
2020-07-07 bclayton Use CMake's builtin functionality for PCHs

Created with:
  roll-dep third_party/glslang

Roll third_party/googletest/ 356f2d264..70b90929b (7 commits)

google/googletest@356f2d2...70b9092

$ git log 356f2d264..70b90929b --date=short --no-merges --format='%ad %ae %s'
2020-07-09 absl-team Googletest export
2020-07-07 ofats Googletest export
2020-07-07 absl-team Googletest export
2020-07-07 absl-team Googletest export
2020-04-11 olivier.ldff use target_compile_features to use c++11 if cmake > 3.8
2020-05-30 eli fix compilation on OpenBSD 6.7
2020-01-22 mjvk Fixes extensions missing for QNX

Created with:
  roll-dep third_party/googletest

Roll third_party/spirv-cross/ 559b21c6c..6575e451f (2 commits)

KhronosGroup/SPIRV-Cross@559b21c...6575e45

$ git log 559b21c6c..6575e451f --date=short --no-merges --format='%ad %ae %s'
2020-07-11 post MSVC 2013: Fix silently broken builds.
2020-07-07 troughton MSL: Ensure OpStore source operands are marked for inclusion in function arguments

Created with:
  roll-dep third_party/spirv-cross

Roll third_party/spirv-tools/ 6a4da9d..c9b254d (17 commits)

KhronosGroup/SPIRV-Tools@6a4da9d...c9b254d

$ git log 6a4da9d..c9b254d --date=short --no-merges --format='%ad %ae %s'
2020-07-14 andreperezmaselco.developer spirv-fuzz: Support adding dead break from back-edge block (KhronosGroup#3519)
2020-07-14 andreperezmaselco.developer Support OpPhi when replacing boolean constant operand (KhronosGroup#3518)
2020-07-12 vasniktel spirv-fuzz: TransformationAddSynonyms (KhronosGroup#3447)
2020-07-11 vasniktel spirv-fuzz: Remove unused functions (KhronosGroup#3510)
2020-07-11 vasniktel spirv-fuzz: Minor refactoring (KhronosGroup#3507)
2020-07-10 greg Preserve OpenCL.DebugInfo.100 through elim-local-single-store (KhronosGroup#3498)
2020-07-10 jaebaek Preserve debug info in vector DCE pass (KhronosGroup#3497)
2020-07-10 stefano.milizia00 Implement transformation to record synonymous constants. (KhronosGroup#3494)
2020-07-09 jaebaek Fix build failure (KhronosGroup#3508)
2020-07-09 greg Upgrade elim-local-single-block for OpenCL.DebugInfo.100 (KhronosGroup#3451)
2020-07-09 vasniktel spirv-fuzz: TransformationReplaceParameterWithGlobal (KhronosGroup#3434)
2020-07-09 andreperezmaselco.developer Implement the OpMatrixTimesVector linear algebra case (KhronosGroup#3500)
2020-07-08 jaebaek Preserve OpenCL.100.DebugInfo in reduce-load-size pass (KhronosGroup#3492)
2020-07-08 andreperezmaselco.developer spirv-fuzz: Add image sample unused components transformation (KhronosGroup#3439)
2020-07-07 andreperezmaselco.developer spirv-fuzz: Add variables with workgroup storage class (KhronosGroup#3485)
2020-07-07 andreperezmaselco.developer spirv-fuzz: Implement the OpVectorTimesMatrix linear algebra case (KhronosGroup#3489)
2020-07-07 vasniktel spirv-fuzz: fuzzerutil::MaybeGetConstant* KhronosGroup#3487

Created with:
  roll-dep third_party/spirv-tools
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants