// GENERATED FILE - DO NOT EDIT. // Generated by generate_tests.py // // Copyright (c) 2022 Google LLC. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "../diff_test_utils.h" #include "gtest/gtest.h" namespace spvtools { namespace diff { namespace { // Test where src has an extra if block in one function, and dst has an extra // if block in another function. constexpr char kSrc[] = R"( OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" %63 %68 OpExecutionMode %4 OriginUpperLeft OpSource ESSL 310 OpName %4 "main" OpName %8 "f1(" OpName %10 "f2(" OpName %13 "v" OpName %16 "Buffer" OpMemberName %16 0 "flag1" OpMemberName %16 1 "flag2" OpName %18 "" OpName %45 "v" OpName %63 "color" OpName %68 "v" OpDecorate %8 RelaxedPrecision OpDecorate %10 RelaxedPrecision OpDecorate %13 RelaxedPrecision OpMemberDecorate %16 0 RelaxedPrecision OpMemberDecorate %16 0 Offset 0 OpMemberDecorate %16 1 RelaxedPrecision OpMemberDecorate %16 1 Offset 4 OpDecorate %16 Block OpDecorate %18 DescriptorSet 0 OpDecorate %18 Binding 0 OpDecorate %23 RelaxedPrecision OpDecorate %30 RelaxedPrecision OpDecorate %31 RelaxedPrecision OpDecorate %34 RelaxedPrecision OpDecorate %35 RelaxedPrecision OpDecorate %36 RelaxedPrecision OpDecorate %37 RelaxedPrecision OpDecorate %38 RelaxedPrecision OpDecorate %39 RelaxedPrecision OpDecorate %40 RelaxedPrecision OpDecorate %41 RelaxedPrecision OpDecorate %42 RelaxedPrecision OpDecorate %45 RelaxedPrecision OpDecorate %47 RelaxedPrecision OpDecorate %48 RelaxedPrecision OpDecorate %50 RelaxedPrecision OpDecorate %51 RelaxedPrecision OpDecorate %54 RelaxedPrecision OpDecorate %55 RelaxedPrecision OpDecorate %56 RelaxedPrecision OpDecorate %57 RelaxedPrecision OpDecorate %58 RelaxedPrecision OpDecorate %63 RelaxedPrecision OpDecorate %63 Location 0 OpDecorate %64 RelaxedPrecision OpDecorate %65 RelaxedPrecision OpDecorate %66 RelaxedPrecision OpDecorate %68 RelaxedPrecision OpDecorate %68 Location 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeFloat 32 %7 = OpTypeFunction %6 %12 = OpTypePointer Function %6 %14 = OpConstant %6 0 %15 = OpTypeInt 32 0 %16 = OpTypeStruct %15 %15 %17 = OpTypePointer Uniform %16 %18 = OpVariable %17 Uniform %19 = OpTypeInt 32 1 %20 = OpConstant %19 0 %21 = OpTypePointer Uniform %15 %24 = OpConstant %15 0 %25 = OpTypeBool %29 = OpConstant %6 1 %32 = OpConstant %19 1 %49 = OpConstant %6 10 %52 = OpConstant %6 0.5 %53 = OpConstant %6 0.699999988 %61 = OpTypeVector %6 4 %62 = OpTypePointer Output %61 %63 = OpVariable %62 Output %67 = OpTypePointer Input %6 %68 = OpVariable %67 Input %4 = OpFunction %2 None %3 %5 = OpLabel %64 = OpFunctionCall %6 %8 %65 = OpFunctionCall %6 %10 %66 = OpCompositeConstruct %61 %64 %65 %14 %29 OpStore %63 %66 OpReturn OpFunctionEnd %8 = OpFunction %6 None %7 %9 = OpLabel %13 = OpVariable %12 Function OpStore %13 %14 %22 = OpAccessChain %21 %18 %20 %23 = OpLoad %15 %22 %26 = OpINotEqual %25 %23 %24 OpSelectionMerge %28 None OpBranchConditional %26 %27 %28 %27 = OpLabel %30 = OpLoad %6 %13 %31 = OpFAdd %6 %30 %29 OpStore %13 %31 OpBranch %28 %28 = OpLabel %33 = OpAccessChain %21 %18 %32 %34 = OpLoad %15 %33 %35 = OpConvertUToF %6 %34 %36 = OpExtInst %6 %1 Log2 %35 %37 = OpLoad %6 %13 %38 = OpFAdd %6 %37 %36 OpStore %13 %38 %39 = OpLoad %6 %13 %40 = OpLoad %6 %13 %41 = OpExtInst %6 %1 Sqrt %40 %42 = OpFSub %6 %39 %41 OpReturnValue %42 OpFunctionEnd %10 = OpFunction %6 None %7 %11 = OpLabel %45 = OpVariable %12 Function %46 = OpAccessChain %21 %18 %20 %47 = OpLoad %15 %46 %48 = OpConvertUToF %6 %47 %50 = OpFDiv %6 %48 %49 OpStore %45 %50 %51 = OpLoad %6 %45 %54 = OpExtInst %6 %1 FClamp %51 %52 %53 %55 = OpLoad %6 %45 %56 = OpFMul %6 %55 %54 OpStore %45 %56 %57 = OpLoad %6 %45 %58 = OpExtInst %6 %1 Exp %57 OpReturnValue %58 OpFunctionEnd )"; constexpr char kDst[] = R"( OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" %63 %69 OpExecutionMode %4 OriginUpperLeft OpSource ESSL 310 OpName %4 "main" OpName %8 "f1(" OpName %10 "f2(" OpName %13 "v" OpName %16 "Buffer" OpMemberName %16 0 "flag1" OpMemberName %16 1 "flag2" OpName %18 "" OpName %34 "v" OpName %63 "color" OpName %69 "v" OpDecorate %8 RelaxedPrecision OpDecorate %10 RelaxedPrecision OpDecorate %13 RelaxedPrecision OpMemberDecorate %16 0 RelaxedPrecision OpMemberDecorate %16 0 Offset 0 OpMemberDecorate %16 1 RelaxedPrecision OpMemberDecorate %16 1 Offset 4 OpDecorate %16 Block OpDecorate %18 DescriptorSet 0 OpDecorate %18 Binding 0 OpDecorate %23 RelaxedPrecision OpDecorate %24 RelaxedPrecision OpDecorate %25 RelaxedPrecision OpDecorate %26 RelaxedPrecision OpDecorate %27 RelaxedPrecision OpDecorate %28 RelaxedPrecision OpDecorate %29 RelaxedPrecision OpDecorate %30 RelaxedPrecision OpDecorate %31 RelaxedPrecision OpDecorate %34 RelaxedPrecision OpDecorate %37 RelaxedPrecision OpDecorate %38 RelaxedPrecision OpDecorate %40 RelaxedPrecision OpDecorate %41 RelaxedPrecision OpDecorate %44 RelaxedPrecision OpDecorate %45 RelaxedPrecision OpDecorate %46 RelaxedPrecision OpDecorate %48 RelaxedPrecision OpDecorate %55 RelaxedPrecision OpDecorate %56 RelaxedPrecision OpDecorate %57 RelaxedPrecision OpDecorate %58 RelaxedPrecision OpDecorate %63 RelaxedPrecision OpDecorate %63 Location 0 OpDecorate %64 RelaxedPrecision OpDecorate %65 RelaxedPrecision OpDecorate %67 RelaxedPrecision OpDecorate %69 RelaxedPrecision OpDecorate %69 Location 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeFloat 32 %7 = OpTypeFunction %6 %12 = OpTypePointer Function %6 %14 = OpConstant %6 0 %15 = OpTypeInt 32 0 %16 = OpTypeStruct %15 %15 %17 = OpTypePointer Uniform %16 %18 = OpVariable %17 Uniform %19 = OpTypeInt 32 1 %20 = OpConstant %19 1 %21 = OpTypePointer Uniform %15 %35 = OpConstant %19 0 %39 = OpConstant %6 10 %42 = OpConstant %6 0.5 %43 = OpConstant %6 0.699999988 %49 = OpConstant %15 0 %50 = OpTypeBool %54 = OpConstant %6 0.100000001 %61 = OpTypeVector %6 4 %62 = OpTypePointer Output %61 %63 = OpVariable %62 Output %66 = OpConstant %6 1 %68 = OpTypePointer Input %6 %69 = OpVariable %68 Input %4 = OpFunction %2 None %3 %5 = OpLabel %64 = OpFunctionCall %6 %8 %65 = OpFunctionCall %6 %10 %67 = OpCompositeConstruct %61 %64 %65 %14 %66 OpStore %63 %67 OpReturn OpFunctionEnd %8 = OpFunction %6 None %7 %9 = OpLabel %13 = OpVariable %12 Function OpStore %13 %14 %22 = OpAccessChain %21 %18 %20 %23 = OpLoad %15 %22 %24 = OpConvertUToF %6 %23 %25 = OpExtInst %6 %1 Log2 %24 %26 = OpLoad %6 %13 %27 = OpFAdd %6 %26 %25 OpStore %13 %27 %28 = OpLoad %6 %13 %29 = OpLoad %6 %13 %30 = OpExtInst %6 %1 Sqrt %29 %31 = OpFSub %6 %28 %30 OpReturnValue %31 OpFunctionEnd %10 = OpFunction %6 None %7 %11 = OpLabel %34 = OpVariable %12 Function %36 = OpAccessChain %21 %18 %35 %37 = OpLoad %15 %36 %38 = OpConvertUToF %6 %37 %40 = OpFDiv %6 %38 %39 OpStore %34 %40 %41 = OpLoad %6 %34 %44 = OpExtInst %6 %1 FClamp %41 %42 %43 %45 = OpLoad %6 %34 %46 = OpFMul %6 %45 %44 OpStore %34 %46 %47 = OpAccessChain %21 %18 %20 %48 = OpLoad %15 %47 %51 = OpINotEqual %50 %48 %49 OpSelectionMerge %53 None OpBranchConditional %51 %52 %53 %52 = OpLabel %55 = OpLoad %6 %34 %56 = OpFSub %6 %55 %54 OpStore %34 %56 OpBranch %53 %53 = OpLabel %57 = OpLoad %6 %34 %58 = OpExtInst %6 %1 Exp %57 OpReturnValue %58 OpFunctionEnd )"; TEST(DiffTest, ExtraIfBlock) { constexpr char kDiff[] = R"( ; SPIR-V ; Version: 1.6 ; Generator: Khronos SPIR-V Tools Assembler; 0 -; Bound: 69 +; Bound: 81 ; Schema: 0 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" %63 %68 OpExecutionMode %4 OriginUpperLeft OpSource ESSL 310 OpName %4 "main" OpName %8 "f1(" OpName %10 "f2(" OpName %13 "v" OpName %16 "Buffer" OpMemberName %16 0 "flag1" OpMemberName %16 1 "flag2" OpName %18 "" OpName %45 "v" OpName %63 "color" OpName %68 "v" OpDecorate %8 RelaxedPrecision OpDecorate %10 RelaxedPrecision OpDecorate %13 RelaxedPrecision OpMemberDecorate %16 0 RelaxedPrecision OpMemberDecorate %16 0 Offset 0 OpMemberDecorate %16 1 RelaxedPrecision OpMemberDecorate %16 1 Offset 4 OpDecorate %16 Block OpDecorate %18 DescriptorSet 0 OpDecorate %18 Binding 0 -OpDecorate %23 RelaxedPrecision -OpDecorate %30 RelaxedPrecision -OpDecorate %31 RelaxedPrecision OpDecorate %34 RelaxedPrecision OpDecorate %35 RelaxedPrecision OpDecorate %36 RelaxedPrecision OpDecorate %37 RelaxedPrecision OpDecorate %38 RelaxedPrecision OpDecorate %39 RelaxedPrecision OpDecorate %40 RelaxedPrecision OpDecorate %41 RelaxedPrecision OpDecorate %42 RelaxedPrecision OpDecorate %45 RelaxedPrecision OpDecorate %47 RelaxedPrecision OpDecorate %48 RelaxedPrecision OpDecorate %50 RelaxedPrecision OpDecorate %51 RelaxedPrecision OpDecorate %54 RelaxedPrecision OpDecorate %55 RelaxedPrecision OpDecorate %56 RelaxedPrecision +OpDecorate %72 RelaxedPrecision OpDecorate %57 RelaxedPrecision +OpDecorate %77 RelaxedPrecision +OpDecorate %78 RelaxedPrecision OpDecorate %58 RelaxedPrecision OpDecorate %63 RelaxedPrecision OpDecorate %63 Location 0 OpDecorate %64 RelaxedPrecision OpDecorate %65 RelaxedPrecision OpDecorate %66 RelaxedPrecision OpDecorate %68 RelaxedPrecision OpDecorate %68 Location 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeFloat 32 %7 = OpTypeFunction %6 %12 = OpTypePointer Function %6 %14 = OpConstant %6 0 %15 = OpTypeInt 32 0 %16 = OpTypeStruct %15 %15 %17 = OpTypePointer Uniform %16 %18 = OpVariable %17 Uniform %19 = OpTypeInt 32 1 %20 = OpConstant %19 0 %21 = OpTypePointer Uniform %15 %24 = OpConstant %15 0 %25 = OpTypeBool %29 = OpConstant %6 1 %32 = OpConstant %19 1 %49 = OpConstant %6 10 %52 = OpConstant %6 0.5 +%76 = OpConstant %6 0.100000001 %53 = OpConstant %6 0.699999988 %61 = OpTypeVector %6 4 %62 = OpTypePointer Output %61 %63 = OpVariable %62 Output %67 = OpTypePointer Input %6 %68 = OpVariable %67 Input %4 = OpFunction %2 None %3 %5 = OpLabel %64 = OpFunctionCall %6 %8 %65 = OpFunctionCall %6 %10 %66 = OpCompositeConstruct %61 %64 %65 %14 %29 OpStore %63 %66 OpReturn OpFunctionEnd %8 = OpFunction %6 None %7 %9 = OpLabel %13 = OpVariable %12 Function OpStore %13 %14 -%22 = OpAccessChain %21 %18 %20 -%23 = OpLoad %15 %22 -%26 = OpINotEqual %25 %23 %24 -OpSelectionMerge %28 None -OpBranchConditional %26 %27 %28 -%27 = OpLabel -%30 = OpLoad %6 %13 -%31 = OpFAdd %6 %30 %29 -OpStore %13 %31 -OpBranch %28 -%28 = OpLabel %33 = OpAccessChain %21 %18 %32 %34 = OpLoad %15 %33 %35 = OpConvertUToF %6 %34 %36 = OpExtInst %6 %1 Log2 %35 %37 = OpLoad %6 %13 %38 = OpFAdd %6 %37 %36 OpStore %13 %38 %39 = OpLoad %6 %13 %40 = OpLoad %6 %13 %41 = OpExtInst %6 %1 Sqrt %40 %42 = OpFSub %6 %39 %41 OpReturnValue %42 OpFunctionEnd %10 = OpFunction %6 None %7 %11 = OpLabel %45 = OpVariable %12 Function %46 = OpAccessChain %21 %18 %20 %47 = OpLoad %15 %46 %48 = OpConvertUToF %6 %47 %50 = OpFDiv %6 %48 %49 OpStore %45 %50 %51 = OpLoad %6 %45 %54 = OpExtInst %6 %1 FClamp %51 %52 %53 %55 = OpLoad %6 %45 %56 = OpFMul %6 %55 %54 OpStore %45 %56 +%71 = OpAccessChain %21 %18 %32 +%72 = OpLoad %15 %71 +%73 = OpINotEqual %25 %72 %24 +OpSelectionMerge %75 None +OpBranchConditional %73 %74 %75 +%74 = OpLabel %57 = OpLoad %6 %45 +%77 = OpFSub %6 %57 %76 +OpStore %45 %77 +OpBranch %75 +%75 = OpLabel +%78 = OpLoad %6 %45 -%58 = OpExtInst %6 %1 Exp %57 +%58 = OpExtInst %6 %1 Exp %78 OpReturnValue %58 OpFunctionEnd )"; Options options; DoStringDiffTest(kSrc, kDst, kDiff, options); } TEST(DiffTest, ExtraIfBlockNoDebug) { constexpr char kSrcNoDebug[] = R"( OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" %63 %68 OpExecutionMode %4 OriginUpperLeft OpSource ESSL 310 OpDecorate %8 RelaxedPrecision OpDecorate %10 RelaxedPrecision OpDecorate %13 RelaxedPrecision OpMemberDecorate %16 0 RelaxedPrecision OpMemberDecorate %16 0 Offset 0 OpMemberDecorate %16 1 RelaxedPrecision OpMemberDecorate %16 1 Offset 4 OpDecorate %16 Block OpDecorate %18 DescriptorSet 0 OpDecorate %18 Binding 0 OpDecorate %23 RelaxedPrecision OpDecorate %30 RelaxedPrecision OpDecorate %31 RelaxedPrecision OpDecorate %34 RelaxedPrecision OpDecorate %35 RelaxedPrecision OpDecorate %36 RelaxedPrecision OpDecorate %37 RelaxedPrecision OpDecorate %38 RelaxedPrecision OpDecorate %39 RelaxedPrecision OpDecorate %40 RelaxedPrecision OpDecorate %41 RelaxedPrecision OpDecorate %42 RelaxedPrecision OpDecorate %45 RelaxedPrecision OpDecorate %47 RelaxedPrecision OpDecorate %48 RelaxedPrecision OpDecorate %50 RelaxedPrecision OpDecorate %51 RelaxedPrecision OpDecorate %54 RelaxedPrecision OpDecorate %55 RelaxedPrecision OpDecorate %56 RelaxedPrecision OpDecorate %57 RelaxedPrecision OpDecorate %58 RelaxedPrecision OpDecorate %63 RelaxedPrecision OpDecorate %63 Location 0 OpDecorate %64 RelaxedPrecision OpDecorate %65 RelaxedPrecision OpDecorate %66 RelaxedPrecision OpDecorate %68 RelaxedPrecision OpDecorate %68 Location 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeFloat 32 %7 = OpTypeFunction %6 %12 = OpTypePointer Function %6 %14 = OpConstant %6 0 %15 = OpTypeInt 32 0 %16 = OpTypeStruct %15 %15 %17 = OpTypePointer Uniform %16 %18 = OpVariable %17 Uniform %19 = OpTypeInt 32 1 %20 = OpConstant %19 0 %21 = OpTypePointer Uniform %15 %24 = OpConstant %15 0 %25 = OpTypeBool %29 = OpConstant %6 1 %32 = OpConstant %19 1 %49 = OpConstant %6 10 %52 = OpConstant %6 0.5 %53 = OpConstant %6 0.699999988 %61 = OpTypeVector %6 4 %62 = OpTypePointer Output %61 %63 = OpVariable %62 Output %67 = OpTypePointer Input %6 %68 = OpVariable %67 Input %4 = OpFunction %2 None %3 %5 = OpLabel %64 = OpFunctionCall %6 %8 %65 = OpFunctionCall %6 %10 %66 = OpCompositeConstruct %61 %64 %65 %14 %29 OpStore %63 %66 OpReturn OpFunctionEnd %8 = OpFunction %6 None %7 %9 = OpLabel %13 = OpVariable %12 Function OpStore %13 %14 %22 = OpAccessChain %21 %18 %20 %23 = OpLoad %15 %22 %26 = OpINotEqual %25 %23 %24 OpSelectionMerge %28 None OpBranchConditional %26 %27 %28 %27 = OpLabel %30 = OpLoad %6 %13 %31 = OpFAdd %6 %30 %29 OpStore %13 %31 OpBranch %28 %28 = OpLabel %33 = OpAccessChain %21 %18 %32 %34 = OpLoad %15 %33 %35 = OpConvertUToF %6 %34 %36 = OpExtInst %6 %1 Log2 %35 %37 = OpLoad %6 %13 %38 = OpFAdd %6 %37 %36 OpStore %13 %38 %39 = OpLoad %6 %13 %40 = OpLoad %6 %13 %41 = OpExtInst %6 %1 Sqrt %40 %42 = OpFSub %6 %39 %41 OpReturnValue %42 OpFunctionEnd %10 = OpFunction %6 None %7 %11 = OpLabel %45 = OpVariable %12 Function %46 = OpAccessChain %21 %18 %20 %47 = OpLoad %15 %46 %48 = OpConvertUToF %6 %47 %50 = OpFDiv %6 %48 %49 OpStore %45 %50 %51 = OpLoad %6 %45 %54 = OpExtInst %6 %1 FClamp %51 %52 %53 %55 = OpLoad %6 %45 %56 = OpFMul %6 %55 %54 OpStore %45 %56 %57 = OpLoad %6 %45 %58 = OpExtInst %6 %1 Exp %57 OpReturnValue %58 OpFunctionEnd )"; constexpr char kDstNoDebug[] = R"( OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" %63 %69 OpExecutionMode %4 OriginUpperLeft OpSource ESSL 310 OpDecorate %8 RelaxedPrecision OpDecorate %10 RelaxedPrecision OpDecorate %13 RelaxedPrecision OpMemberDecorate %16 0 RelaxedPrecision OpMemberDecorate %16 0 Offset 0 OpMemberDecorate %16 1 RelaxedPrecision OpMemberDecorate %16 1 Offset 4 OpDecorate %16 Block OpDecorate %18 DescriptorSet 0 OpDecorate %18 Binding 0 OpDecorate %23 RelaxedPrecision OpDecorate %24 RelaxedPrecision OpDecorate %25 RelaxedPrecision OpDecorate %26 RelaxedPrecision OpDecorate %27 RelaxedPrecision OpDecorate %28 RelaxedPrecision OpDecorate %29 RelaxedPrecision OpDecorate %30 RelaxedPrecision OpDecorate %31 RelaxedPrecision OpDecorate %34 RelaxedPrecision OpDecorate %37 RelaxedPrecision OpDecorate %38 RelaxedPrecision OpDecorate %40 RelaxedPrecision OpDecorate %41 RelaxedPrecision OpDecorate %44 RelaxedPrecision OpDecorate %45 RelaxedPrecision OpDecorate %46 RelaxedPrecision OpDecorate %48 RelaxedPrecision OpDecorate %55 RelaxedPrecision OpDecorate %56 RelaxedPrecision OpDecorate %57 RelaxedPrecision OpDecorate %58 RelaxedPrecision OpDecorate %63 RelaxedPrecision OpDecorate %63 Location 0 OpDecorate %64 RelaxedPrecision OpDecorate %65 RelaxedPrecision OpDecorate %67 RelaxedPrecision OpDecorate %69 RelaxedPrecision OpDecorate %69 Location 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeFloat 32 %7 = OpTypeFunction %6 %12 = OpTypePointer Function %6 %14 = OpConstant %6 0 %15 = OpTypeInt 32 0 %16 = OpTypeStruct %15 %15 %17 = OpTypePointer Uniform %16 %18 = OpVariable %17 Uniform %19 = OpTypeInt 32 1 %20 = OpConstant %19 1 %21 = OpTypePointer Uniform %15 %35 = OpConstant %19 0 %39 = OpConstant %6 10 %42 = OpConstant %6 0.5 %43 = OpConstant %6 0.699999988 %49 = OpConstant %15 0 %50 = OpTypeBool %54 = OpConstant %6 0.100000001 %61 = OpTypeVector %6 4 %62 = OpTypePointer Output %61 %63 = OpVariable %62 Output %66 = OpConstant %6 1 %68 = OpTypePointer Input %6 %69 = OpVariable %68 Input %4 = OpFunction %2 None %3 %5 = OpLabel %64 = OpFunctionCall %6 %8 %65 = OpFunctionCall %6 %10 %67 = OpCompositeConstruct %61 %64 %65 %14 %66 OpStore %63 %67 OpReturn OpFunctionEnd %8 = OpFunction %6 None %7 %9 = OpLabel %13 = OpVariable %12 Function OpStore %13 %14 %22 = OpAccessChain %21 %18 %20 %23 = OpLoad %15 %22 %24 = OpConvertUToF %6 %23 %25 = OpExtInst %6 %1 Log2 %24 %26 = OpLoad %6 %13 %27 = OpFAdd %6 %26 %25 OpStore %13 %27 %28 = OpLoad %6 %13 %29 = OpLoad %6 %13 %30 = OpExtInst %6 %1 Sqrt %29 %31 = OpFSub %6 %28 %30 OpReturnValue %31 OpFunctionEnd %10 = OpFunction %6 None %7 %11 = OpLabel %34 = OpVariable %12 Function %36 = OpAccessChain %21 %18 %35 %37 = OpLoad %15 %36 %38 = OpConvertUToF %6 %37 %40 = OpFDiv %6 %38 %39 OpStore %34 %40 %41 = OpLoad %6 %34 %44 = OpExtInst %6 %1 FClamp %41 %42 %43 %45 = OpLoad %6 %34 %46 = OpFMul %6 %45 %44 OpStore %34 %46 %47 = OpAccessChain %21 %18 %20 %48 = OpLoad %15 %47 %51 = OpINotEqual %50 %48 %49 OpSelectionMerge %53 None OpBranchConditional %51 %52 %53 %52 = OpLabel %55 = OpLoad %6 %34 %56 = OpFSub %6 %55 %54 OpStore %34 %56 OpBranch %53 %53 = OpLabel %57 = OpLoad %6 %34 %58 = OpExtInst %6 %1 Exp %57 OpReturnValue %58 OpFunctionEnd )"; constexpr char kDiff[] = R"( ; SPIR-V ; Version: 1.6 ; Generator: Khronos SPIR-V Tools Assembler; 0 -; Bound: 69 +; Bound: 81 ; Schema: 0 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" %63 %68 OpExecutionMode %4 OriginUpperLeft OpSource ESSL 310 OpDecorate %8 RelaxedPrecision OpDecorate %10 RelaxedPrecision OpDecorate %13 RelaxedPrecision OpMemberDecorate %16 0 RelaxedPrecision OpMemberDecorate %16 0 Offset 0 OpMemberDecorate %16 1 RelaxedPrecision OpMemberDecorate %16 1 Offset 4 OpDecorate %16 Block OpDecorate %18 DescriptorSet 0 OpDecorate %18 Binding 0 -OpDecorate %23 RelaxedPrecision -OpDecorate %30 RelaxedPrecision -OpDecorate %31 RelaxedPrecision OpDecorate %34 RelaxedPrecision OpDecorate %35 RelaxedPrecision OpDecorate %36 RelaxedPrecision OpDecorate %37 RelaxedPrecision OpDecorate %38 RelaxedPrecision OpDecorate %39 RelaxedPrecision OpDecorate %40 RelaxedPrecision OpDecorate %41 RelaxedPrecision OpDecorate %42 RelaxedPrecision OpDecorate %45 RelaxedPrecision OpDecorate %47 RelaxedPrecision OpDecorate %48 RelaxedPrecision OpDecorate %50 RelaxedPrecision OpDecorate %51 RelaxedPrecision OpDecorate %54 RelaxedPrecision OpDecorate %55 RelaxedPrecision OpDecorate %56 RelaxedPrecision +OpDecorate %72 RelaxedPrecision OpDecorate %57 RelaxedPrecision +OpDecorate %77 RelaxedPrecision +OpDecorate %78 RelaxedPrecision OpDecorate %58 RelaxedPrecision OpDecorate %63 RelaxedPrecision OpDecorate %63 Location 0 OpDecorate %64 RelaxedPrecision OpDecorate %65 RelaxedPrecision OpDecorate %66 RelaxedPrecision OpDecorate %68 RelaxedPrecision OpDecorate %68 Location 0 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeFloat 32 %7 = OpTypeFunction %6 %12 = OpTypePointer Function %6 %14 = OpConstant %6 0 %15 = OpTypeInt 32 0 %16 = OpTypeStruct %15 %15 %17 = OpTypePointer Uniform %16 %18 = OpVariable %17 Uniform %19 = OpTypeInt 32 1 %20 = OpConstant %19 0 %21 = OpTypePointer Uniform %15 %24 = OpConstant %15 0 %25 = OpTypeBool %29 = OpConstant %6 1 %32 = OpConstant %19 1 %49 = OpConstant %6 10 %52 = OpConstant %6 0.5 +%76 = OpConstant %6 0.100000001 %53 = OpConstant %6 0.699999988 %61 = OpTypeVector %6 4 %62 = OpTypePointer Output %61 %63 = OpVariable %62 Output %67 = OpTypePointer Input %6 %68 = OpVariable %67 Input %4 = OpFunction %2 None %3 %5 = OpLabel %64 = OpFunctionCall %6 %8 %65 = OpFunctionCall %6 %10 %66 = OpCompositeConstruct %61 %64 %65 %14 %29 OpStore %63 %66 OpReturn OpFunctionEnd %8 = OpFunction %6 None %7 %9 = OpLabel %13 = OpVariable %12 Function OpStore %13 %14 -%22 = OpAccessChain %21 %18 %20 -%23 = OpLoad %15 %22 -%26 = OpINotEqual %25 %23 %24 -OpSelectionMerge %28 None -OpBranchConditional %26 %27 %28 -%27 = OpLabel -%30 = OpLoad %6 %13 -%31 = OpFAdd %6 %30 %29 -OpStore %13 %31 -OpBranch %28 -%28 = OpLabel %33 = OpAccessChain %21 %18 %32 %34 = OpLoad %15 %33 %35 = OpConvertUToF %6 %34 %36 = OpExtInst %6 %1 Log2 %35 %37 = OpLoad %6 %13 %38 = OpFAdd %6 %37 %36 OpStore %13 %38 %39 = OpLoad %6 %13 %40 = OpLoad %6 %13 %41 = OpExtInst %6 %1 Sqrt %40 %42 = OpFSub %6 %39 %41 OpReturnValue %42 OpFunctionEnd %10 = OpFunction %6 None %7 %11 = OpLabel %45 = OpVariable %12 Function %46 = OpAccessChain %21 %18 %20 %47 = OpLoad %15 %46 %48 = OpConvertUToF %6 %47 %50 = OpFDiv %6 %48 %49 OpStore %45 %50 %51 = OpLoad %6 %45 %54 = OpExtInst %6 %1 FClamp %51 %52 %53 %55 = OpLoad %6 %45 %56 = OpFMul %6 %55 %54 OpStore %45 %56 +%71 = OpAccessChain %21 %18 %32 +%72 = OpLoad %15 %71 +%73 = OpINotEqual %25 %72 %24 +OpSelectionMerge %75 None +OpBranchConditional %73 %74 %75 +%74 = OpLabel %57 = OpLoad %6 %45 +%77 = OpFSub %6 %57 %76 +OpStore %45 %77 +OpBranch %75 +%75 = OpLabel +%78 = OpLoad %6 %45 -%58 = OpExtInst %6 %1 Exp %57 +%58 = OpExtInst %6 %1 Exp %78 OpReturnValue %58 OpFunctionEnd )"; Options options; DoStringDiffTest(kSrcNoDebug, kDstNoDebug, kDiff, options); } } // namespace } // namespace diff } // namespace spvtools