Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimization issue when specifying --target-env #1403

Open
alexcher-im opened this issue Mar 7, 2024 · 0 comments
Open

Optimization issue when specifying --target-env #1403

alexcher-im opened this issue Mar 7, 2024 · 0 comments

Comments

@alexcher-im
Copy link

Hello, I noticed a performance degradations when calling some heavy non-side-effected GLSL function a few times, without using its result. Simplifying the code and checking that issue still exists, I ended up with this code:

#version 450
#extension GL_ARB_separate_shader_objects : enable
#extension GL_EXT_nonuniform_qualifier : enable

struct SampleStruct {
    int field;
};

layout (set = 0, binding = 1) uniform GlobalDSet0 {
    SampleStruct[16768] elems;
} buffers[];

SampleStruct read_buf() { return buffers[0].elems[0]; }

void main() {
    read_buf();
}

Which compiles (glslc shader.frag -O --target-env=vulkan1.2) into:

; SPIR-V
; Version: 1.5
; Generator: Google Shaderc over Glslang; 11
; Bound: 37
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %19
               OpExecutionMode %4 OriginUpperLeft
               OpMemberDecorate %_struct_11 0 Offset 0
               OpDecorate %_arr__struct_11_uint_16768 ArrayStride 16
               OpMemberDecorate %_struct_15 0 Offset 0
               OpDecorate %_struct_15 Block
               OpDecorate %19 DescriptorSet 0
               OpDecorate %19 Binding 1
       %void = OpTypeVoid
          %3 = OpTypeFunction %void
        %int = OpTypeInt 32 1
  %_struct_7 = OpTypeStruct %int
 %_struct_11 = OpTypeStruct %int
       %uint = OpTypeInt 32 0
 %uint_16768 = OpConstant %uint 16768
%_arr__struct_11_uint_16768 = OpTypeArray %_struct_11 %uint_16768
 %_struct_15 = OpTypeStruct %_arr__struct_11_uint_16768
     %uint_1 = OpConstant %uint 1
%_arr__struct_15_uint_1 = OpTypeArray %_struct_15 %uint_1
%_ptr_Uniform__arr__struct_15_uint_1 = OpTypePointer Uniform %_arr__struct_15_uint_1
         %19 = OpVariable %_ptr_Uniform__arr__struct_15_uint_1 Uniform
      %int_0 = OpConstant %int 0
%_ptr_Uniform__struct_11 = OpTypePointer Uniform %_struct_11
          %4 = OpFunction %void None %3
          %5 = OpLabel
         %34 = OpAccessChain %_ptr_Uniform__struct_11 %19 %int_0 %int_0 %int_0
         %35 = OpLoad %_struct_11 %34
         %36 = OpCopyLogical %_struct_7 %35
               OpReturn
               OpFunctionEnd

As I can see, read_buf() is a pure function, but calling it generates additional code in main().

This issue occures when I set --target-env to vulkan1.2 or vulkan1.3 , but clears out at vulkan1.0, vulkan1.1, or without specifying target env at all.

Version:
glslc from VulkanSDK 1.3.268.0

$ glslc --version
shaderc v2023.7 v2023.7
spirv-tools v2023.5 v2022.4-352-g360d469b
glslang 11.1.0-803-g48f9ed8b

Target: SPIR-V 1.0

Am I missing something about these Vulkan versions, or is this an optimizer bug?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant