| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789 |
- // Copyright (c) 2019 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 "gtest/gtest.h"
- #include "source/fuzz/fuzzer.h"
- #include "source/fuzz/fuzzer_util.h"
- #include "source/fuzz/pseudo_random_generator.h"
- #include "source/fuzz/replayer.h"
- #include "source/fuzz/uniform_buffer_element_descriptor.h"
- #include "test/fuzz/fuzz_test_util.h"
- namespace spvtools {
- namespace fuzz {
- namespace {
- const uint32_t kNumFuzzerRuns = 20;
- // The SPIR-V came from this GLSL:
- //
- // #version 310 es
- //
- // void foo() {
- // int x;
- // x = 2;
- // for (int i = 0; i < 100; i++) {
- // x += i;
- // x = x * 2;
- // }
- // return;
- // }
- //
- // void main() {
- // foo();
- // for (int i = 0; i < 10; i++) {
- // int j = 20;
- // while(j > 0) {
- // foo();
- // j--;
- // }
- // do {
- // i++;
- // } while(i < 4);
- // }
- // }
- const std::string kTestShader1 = R"(
- OpCapability Shader
- %1 = OpExtInstImport "GLSL.std.450"
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %4 "main"
- OpExecutionMode %4 OriginUpperLeft
- OpSource ESSL 310
- OpName %4 "main"
- OpName %6 "foo("
- OpName %10 "x"
- OpName %12 "i"
- OpName %33 "i"
- OpName %42 "j"
- OpDecorate %10 RelaxedPrecision
- OpDecorate %12 RelaxedPrecision
- OpDecorate %19 RelaxedPrecision
- OpDecorate %23 RelaxedPrecision
- OpDecorate %24 RelaxedPrecision
- OpDecorate %25 RelaxedPrecision
- OpDecorate %26 RelaxedPrecision
- OpDecorate %27 RelaxedPrecision
- OpDecorate %28 RelaxedPrecision
- OpDecorate %30 RelaxedPrecision
- OpDecorate %33 RelaxedPrecision
- OpDecorate %39 RelaxedPrecision
- OpDecorate %42 RelaxedPrecision
- OpDecorate %49 RelaxedPrecision
- OpDecorate %52 RelaxedPrecision
- OpDecorate %53 RelaxedPrecision
- OpDecorate %58 RelaxedPrecision
- OpDecorate %59 RelaxedPrecision
- OpDecorate %60 RelaxedPrecision
- OpDecorate %63 RelaxedPrecision
- OpDecorate %64 RelaxedPrecision
- %2 = OpTypeVoid
- %3 = OpTypeFunction %2
- %8 = OpTypeInt 32 1
- %9 = OpTypePointer Function %8
- %11 = OpConstant %8 2
- %13 = OpConstant %8 0
- %20 = OpConstant %8 100
- %21 = OpTypeBool
- %29 = OpConstant %8 1
- %40 = OpConstant %8 10
- %43 = OpConstant %8 20
- %61 = OpConstant %8 4
- %4 = OpFunction %2 None %3
- %5 = OpLabel
- %33 = OpVariable %9 Function
- %42 = OpVariable %9 Function
- %32 = OpFunctionCall %2 %6
- OpStore %33 %13
- OpBranch %34
- %34 = OpLabel
- OpLoopMerge %36 %37 None
- OpBranch %38
- %38 = OpLabel
- %39 = OpLoad %8 %33
- %41 = OpSLessThan %21 %39 %40
- OpBranchConditional %41 %35 %36
- %35 = OpLabel
- OpStore %42 %43
- OpBranch %44
- %44 = OpLabel
- OpLoopMerge %46 %47 None
- OpBranch %48
- %48 = OpLabel
- %49 = OpLoad %8 %42
- %50 = OpSGreaterThan %21 %49 %13
- OpBranchConditional %50 %45 %46
- %45 = OpLabel
- %51 = OpFunctionCall %2 %6
- %52 = OpLoad %8 %42
- %53 = OpISub %8 %52 %29
- OpStore %42 %53
- OpBranch %47
- %47 = OpLabel
- OpBranch %44
- %46 = OpLabel
- OpBranch %54
- %54 = OpLabel
- OpLoopMerge %56 %57 None
- OpBranch %55
- %55 = OpLabel
- %58 = OpLoad %8 %33
- %59 = OpIAdd %8 %58 %29
- OpStore %33 %59
- OpBranch %57
- %57 = OpLabel
- %60 = OpLoad %8 %33
- %62 = OpSLessThan %21 %60 %61
- OpBranchConditional %62 %54 %56
- %56 = OpLabel
- OpBranch %37
- %37 = OpLabel
- %63 = OpLoad %8 %33
- %64 = OpIAdd %8 %63 %29
- OpStore %33 %64
- OpBranch %34
- %36 = OpLabel
- OpReturn
- OpFunctionEnd
- %6 = OpFunction %2 None %3
- %7 = OpLabel
- %10 = OpVariable %9 Function
- %12 = OpVariable %9 Function
- OpStore %10 %11
- OpStore %12 %13
- OpBranch %14
- %14 = OpLabel
- OpLoopMerge %16 %17 None
- OpBranch %18
- %18 = OpLabel
- %19 = OpLoad %8 %12
- %22 = OpSLessThan %21 %19 %20
- OpBranchConditional %22 %15 %16
- %15 = OpLabel
- %23 = OpLoad %8 %12
- %24 = OpLoad %8 %10
- %25 = OpIAdd %8 %24 %23
- OpStore %10 %25
- %26 = OpLoad %8 %10
- %27 = OpIMul %8 %26 %11
- OpStore %10 %27
- OpBranch %17
- %17 = OpLabel
- %28 = OpLoad %8 %12
- %30 = OpIAdd %8 %28 %29
- OpStore %12 %30
- OpBranch %14
- %16 = OpLabel
- OpReturn
- OpFunctionEnd
- )";
- // The SPIR-V came from this GLSL, which was then optimized using spirv-opt
- // with the -O argument:
- //
- // #version 310 es
- //
- // precision highp float;
- //
- // layout(location = 0) out vec4 _GLF_color;
- //
- // layout(set = 0, binding = 0) uniform buf0 {
- // vec2 injectionSwitch;
- // };
- // layout(set = 0, binding = 1) uniform buf1 {
- // vec2 resolution;
- // };
- // bool checkSwap(float a, float b)
- // {
- // return gl_FragCoord.y < resolution.y / 2.0 ? a > b : a < b;
- // }
- // void main()
- // {
- // float data[10];
- // for(int i = 0; i < 10; i++)
- // {
- // data[i] = float(10 - i) * injectionSwitch.y;
- // }
- // for(int i = 0; i < 9; i++)
- // {
- // for(int j = 0; j < 10; j++)
- // {
- // if(j < i + 1)
- // {
- // continue;
- // }
- // bool doSwap = checkSwap(data[i], data[j]);
- // if(doSwap)
- // {
- // float temp = data[i];
- // data[i] = data[j];
- // data[j] = temp;
- // }
- // }
- // }
- // if(gl_FragCoord.x < resolution.x / 2.0)
- // {
- // _GLF_color = vec4(data[0] / 10.0, data[5] / 10.0, data[9] / 10.0, 1.0);
- // }
- // else
- // {
- // _GLF_color = vec4(data[5] / 10.0, data[9] / 10.0, data[0] / 10.0, 1.0);
- // }
- // }
- const std::string kTestShader2 = R"(
- OpCapability Shader
- %1 = OpExtInstImport "GLSL.std.450"
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %4 "main" %16 %139 %25 %68
- OpExecutionMode %4 OriginUpperLeft
- OpSource ESSL 310
- OpName %4 "main"
- OpName %16 "gl_FragCoord"
- OpName %23 "buf1"
- OpMemberName %23 0 "resolution"
- OpName %25 ""
- OpName %61 "data"
- OpName %66 "buf0"
- OpMemberName %66 0 "injectionSwitch"
- OpName %68 ""
- OpName %139 "_GLF_color"
- OpDecorate %16 BuiltIn FragCoord
- OpMemberDecorate %23 0 Offset 0
- OpDecorate %23 Block
- OpDecorate %25 DescriptorSet 0
- OpDecorate %25 Binding 1
- OpDecorate %64 RelaxedPrecision
- OpMemberDecorate %66 0 Offset 0
- OpDecorate %66 Block
- OpDecorate %68 DescriptorSet 0
- OpDecorate %68 Binding 0
- OpDecorate %75 RelaxedPrecision
- OpDecorate %95 RelaxedPrecision
- OpDecorate %126 RelaxedPrecision
- OpDecorate %128 RelaxedPrecision
- OpDecorate %139 Location 0
- OpDecorate %182 RelaxedPrecision
- OpDecorate %183 RelaxedPrecision
- OpDecorate %184 RelaxedPrecision
- %2 = OpTypeVoid
- %3 = OpTypeFunction %2
- %6 = OpTypeFloat 32
- %7 = OpTypePointer Function %6
- %8 = OpTypeBool
- %14 = OpTypeVector %6 4
- %15 = OpTypePointer Input %14
- %16 = OpVariable %15 Input
- %17 = OpTypeInt 32 0
- %18 = OpConstant %17 1
- %19 = OpTypePointer Input %6
- %22 = OpTypeVector %6 2
- %23 = OpTypeStruct %22
- %24 = OpTypePointer Uniform %23
- %25 = OpVariable %24 Uniform
- %26 = OpTypeInt 32 1
- %27 = OpConstant %26 0
- %28 = OpTypePointer Uniform %6
- %56 = OpConstant %26 10
- %58 = OpConstant %17 10
- %59 = OpTypeArray %6 %58
- %60 = OpTypePointer Function %59
- %66 = OpTypeStruct %22
- %67 = OpTypePointer Uniform %66
- %68 = OpVariable %67 Uniform
- %74 = OpConstant %26 1
- %83 = OpConstant %26 9
- %129 = OpConstant %17 0
- %138 = OpTypePointer Output %14
- %139 = OpVariable %138 Output
- %144 = OpConstant %26 5
- %151 = OpConstant %6 1
- %194 = OpConstant %6 0.5
- %195 = OpConstant %6 0.100000001
- %4 = OpFunction %2 None %3
- %5 = OpLabel
- %61 = OpVariable %60 Function
- OpBranch %50
- %50 = OpLabel
- %182 = OpPhi %26 %27 %5 %75 %51
- %57 = OpSLessThan %8 %182 %56
- OpLoopMerge %52 %51 None
- OpBranchConditional %57 %51 %52
- %51 = OpLabel
- %64 = OpISub %26 %56 %182
- %65 = OpConvertSToF %6 %64
- %69 = OpAccessChain %28 %68 %27 %18
- %70 = OpLoad %6 %69
- %71 = OpFMul %6 %65 %70
- %72 = OpAccessChain %7 %61 %182
- OpStore %72 %71
- %75 = OpIAdd %26 %182 %74
- OpBranch %50
- %52 = OpLabel
- OpBranch %77
- %77 = OpLabel
- %183 = OpPhi %26 %27 %52 %128 %88
- %84 = OpSLessThan %8 %183 %83
- OpLoopMerge %79 %88 None
- OpBranchConditional %84 %78 %79
- %78 = OpLabel
- OpBranch %86
- %86 = OpLabel
- %184 = OpPhi %26 %27 %78 %126 %89
- %92 = OpSLessThan %8 %184 %56
- OpLoopMerge %1000 %89 None
- OpBranchConditional %92 %87 %1000
- %87 = OpLabel
- %95 = OpIAdd %26 %183 %74
- %96 = OpSLessThan %8 %184 %95
- OpSelectionMerge %98 None
- OpBranchConditional %96 %97 %98
- %97 = OpLabel
- OpBranch %89
- %98 = OpLabel
- %104 = OpAccessChain %7 %61 %183
- %105 = OpLoad %6 %104
- %107 = OpAccessChain %7 %61 %184
- %108 = OpLoad %6 %107
- %166 = OpAccessChain %19 %16 %18
- %167 = OpLoad %6 %166
- %168 = OpAccessChain %28 %25 %27 %18
- %169 = OpLoad %6 %168
- %170 = OpFMul %6 %169 %194
- %171 = OpFOrdLessThan %8 %167 %170
- OpSelectionMerge %172 None
- OpBranchConditional %171 %173 %174
- %173 = OpLabel
- %177 = OpFOrdGreaterThan %8 %105 %108
- OpBranch %172
- %174 = OpLabel
- %180 = OpFOrdLessThan %8 %105 %108
- OpBranch %172
- %172 = OpLabel
- %186 = OpPhi %8 %177 %173 %180 %174
- OpSelectionMerge %112 None
- OpBranchConditional %186 %111 %112
- %111 = OpLabel
- %116 = OpLoad %6 %104
- %120 = OpLoad %6 %107
- OpStore %104 %120
- OpStore %107 %116
- OpBranch %112
- %112 = OpLabel
- OpBranch %89
- %89 = OpLabel
- %126 = OpIAdd %26 %184 %74
- OpBranch %86
- %1000 = OpLabel
- OpBranch %88
- %88 = OpLabel
- %128 = OpIAdd %26 %183 %74
- OpBranch %77
- %79 = OpLabel
- %130 = OpAccessChain %19 %16 %129
- %131 = OpLoad %6 %130
- %132 = OpAccessChain %28 %25 %27 %129
- %133 = OpLoad %6 %132
- %134 = OpFMul %6 %133 %194
- %135 = OpFOrdLessThan %8 %131 %134
- OpSelectionMerge %137 None
- OpBranchConditional %135 %136 %153
- %136 = OpLabel
- %140 = OpAccessChain %7 %61 %27
- %141 = OpLoad %6 %140
- %143 = OpFMul %6 %141 %195
- %145 = OpAccessChain %7 %61 %144
- %146 = OpLoad %6 %145
- %147 = OpFMul %6 %146 %195
- %148 = OpAccessChain %7 %61 %83
- %149 = OpLoad %6 %148
- %150 = OpFMul %6 %149 %195
- %152 = OpCompositeConstruct %14 %143 %147 %150 %151
- OpStore %139 %152
- OpBranch %137
- %153 = OpLabel
- %154 = OpAccessChain %7 %61 %144
- %155 = OpLoad %6 %154
- %156 = OpFMul %6 %155 %195
- %157 = OpAccessChain %7 %61 %83
- %158 = OpLoad %6 %157
- %159 = OpFMul %6 %158 %195
- %160 = OpAccessChain %7 %61 %27
- %161 = OpLoad %6 %160
- %162 = OpFMul %6 %161 %195
- %163 = OpCompositeConstruct %14 %156 %159 %162 %151
- OpStore %139 %163
- OpBranch %137
- %137 = OpLabel
- OpReturn
- OpFunctionEnd
- )";
- // The SPIR-V came from this GLSL, which was then optimized using spirv-opt
- // with the -O argument:
- //
- // #version 310 es
- //
- // precision highp float;
- //
- // layout(location = 0) out vec4 _GLF_color;
- //
- // layout(set = 0, binding = 0) uniform buf0 {
- // vec2 resolution;
- // };
- // void main(void)
- // {
- // float A[50];
- // for(
- // int i = 0;
- // i < 200;
- // i ++
- // )
- // {
- // if(i >= int(resolution.x))
- // {
- // break;
- // }
- // if((4 * (i / 4)) == i)
- // {
- // A[i / 4] = float(i);
- // }
- // }
- // for(
- // int i = 0;
- // i < 50;
- // i ++
- // )
- // {
- // if(i < int(gl_FragCoord.x))
- // {
- // break;
- // }
- // if(i > 0)
- // {
- // A[i] += A[i - 1];
- // }
- // }
- // if(int(gl_FragCoord.x) < 20)
- // {
- // _GLF_color = vec4(A[0] / resolution.x, A[4] / resolution.y, 1.0, 1.0);
- // }
- // else
- // if(int(gl_FragCoord.x) < 40)
- // {
- // _GLF_color = vec4(A[5] / resolution.x, A[9] / resolution.y, 1.0, 1.0);
- // }
- // else
- // if(int(gl_FragCoord.x) < 60)
- // {
- // _GLF_color = vec4(A[10] / resolution.x, A[14] / resolution.y,
- // 1.0, 1.0);
- // }
- // else
- // if(int(gl_FragCoord.x) < 80)
- // {
- // _GLF_color = vec4(A[15] / resolution.x, A[19] / resolution.y,
- // 1.0, 1.0);
- // }
- // else
- // if(int(gl_FragCoord.x) < 100)
- // {
- // _GLF_color = vec4(A[20] / resolution.x, A[24] / resolution.y,
- // 1.0, 1.0);
- // }
- // else
- // if(int(gl_FragCoord.x) < 120)
- // {
- // _GLF_color = vec4(A[25] / resolution.x, A[29] / resolution.y,
- // 1.0, 1.0);
- // }
- // else
- // if(int(gl_FragCoord.x) < 140)
- // {
- // _GLF_color = vec4(A[30] / resolution.x, A[34] / resolution.y,
- // 1.0, 1.0);
- // }
- // else
- // if(int(gl_FragCoord.x) < 160)
- // {
- // _GLF_color = vec4(A[35] / resolution.x, A[39] /
- // resolution.y, 1.0, 1.0);
- // }
- // else
- // if(int(gl_FragCoord.x) < 180)
- // {
- // _GLF_color = vec4(A[40] / resolution.x, A[44] /
- // resolution.y, 1.0, 1.0);
- // }
- // else
- // if(int(gl_FragCoord.x) < 180)
- // {
- // _GLF_color = vec4(A[45] / resolution.x, A[49] /
- // resolution.y, 1.0, 1.0);
- // }
- // else
- // {
- // discard;
- // }
- // }
- const std::string kTestShader3 = R"(
- OpCapability Shader
- %1 = OpExtInstImport "GLSL.std.450"
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %4 "main" %68 %100 %24
- OpExecutionMode %4 OriginUpperLeft
- OpSource ESSL 310
- OpName %4 "main"
- OpName %22 "buf0"
- OpMemberName %22 0 "resolution"
- OpName %24 ""
- OpName %46 "A"
- OpName %68 "gl_FragCoord"
- OpName %100 "_GLF_color"
- OpMemberDecorate %22 0 Offset 0
- OpDecorate %22 Block
- OpDecorate %24 DescriptorSet 0
- OpDecorate %24 Binding 0
- OpDecorate %37 RelaxedPrecision
- OpDecorate %38 RelaxedPrecision
- OpDecorate %55 RelaxedPrecision
- OpDecorate %68 BuiltIn FragCoord
- OpDecorate %83 RelaxedPrecision
- OpDecorate %91 RelaxedPrecision
- OpDecorate %100 Location 0
- OpDecorate %302 RelaxedPrecision
- OpDecorate %304 RelaxedPrecision
- %2 = OpTypeVoid
- %3 = OpTypeFunction %2
- %6 = OpTypeInt 32 1
- %9 = OpConstant %6 0
- %16 = OpConstant %6 200
- %17 = OpTypeBool
- %20 = OpTypeFloat 32
- %21 = OpTypeVector %20 2
- %22 = OpTypeStruct %21
- %23 = OpTypePointer Uniform %22
- %24 = OpVariable %23 Uniform
- %25 = OpTypeInt 32 0
- %26 = OpConstant %25 0
- %27 = OpTypePointer Uniform %20
- %35 = OpConstant %6 4
- %43 = OpConstant %25 50
- %44 = OpTypeArray %20 %43
- %45 = OpTypePointer Function %44
- %51 = OpTypePointer Function %20
- %54 = OpConstant %6 1
- %63 = OpConstant %6 50
- %66 = OpTypeVector %20 4
- %67 = OpTypePointer Input %66
- %68 = OpVariable %67 Input
- %69 = OpTypePointer Input %20
- %95 = OpConstant %6 20
- %99 = OpTypePointer Output %66
- %100 = OpVariable %99 Output
- %108 = OpConstant %25 1
- %112 = OpConstant %20 1
- %118 = OpConstant %6 40
- %122 = OpConstant %6 5
- %128 = OpConstant %6 9
- %139 = OpConstant %6 60
- %143 = OpConstant %6 10
- %149 = OpConstant %6 14
- %160 = OpConstant %6 80
- %164 = OpConstant %6 15
- %170 = OpConstant %6 19
- %181 = OpConstant %6 100
- %190 = OpConstant %6 24
- %201 = OpConstant %6 120
- %205 = OpConstant %6 25
- %211 = OpConstant %6 29
- %222 = OpConstant %6 140
- %226 = OpConstant %6 30
- %232 = OpConstant %6 34
- %243 = OpConstant %6 160
- %247 = OpConstant %6 35
- %253 = OpConstant %6 39
- %264 = OpConstant %6 180
- %273 = OpConstant %6 44
- %287 = OpConstant %6 45
- %293 = OpConstant %6 49
- %4 = OpFunction %2 None %3
- %5 = OpLabel
- %46 = OpVariable %45 Function
- OpBranch %10
- %10 = OpLabel
- %302 = OpPhi %6 %9 %5 %55 %42
- %18 = OpSLessThan %17 %302 %16
- OpLoopMerge %12 %42 None
- OpBranchConditional %18 %11 %12
- %11 = OpLabel
- %28 = OpAccessChain %27 %24 %9 %26
- %29 = OpLoad %20 %28
- %30 = OpConvertFToS %6 %29
- %31 = OpSGreaterThanEqual %17 %302 %30
- OpSelectionMerge %33 None
- OpBranchConditional %31 %32 %33
- %32 = OpLabel
- OpBranch %12
- %33 = OpLabel
- %37 = OpSDiv %6 %302 %35
- %38 = OpIMul %6 %35 %37
- %40 = OpIEqual %17 %38 %302
- OpBranchConditional %40 %41 %42
- %41 = OpLabel
- %50 = OpConvertSToF %20 %302
- %52 = OpAccessChain %51 %46 %37
- OpStore %52 %50
- OpBranch %42
- %42 = OpLabel
- %55 = OpIAdd %6 %302 %54
- OpBranch %10
- %12 = OpLabel
- OpBranch %57
- %57 = OpLabel
- %304 = OpPhi %6 %9 %12 %91 %80
- %64 = OpSLessThan %17 %304 %63
- OpLoopMerge %59 %80 None
- OpBranchConditional %64 %58 %59
- %58 = OpLabel
- %70 = OpAccessChain %69 %68 %26
- %71 = OpLoad %20 %70
- %72 = OpConvertFToS %6 %71
- %73 = OpSLessThan %17 %304 %72
- OpSelectionMerge %75 None
- OpBranchConditional %73 %74 %75
- %74 = OpLabel
- OpBranch %59
- %75 = OpLabel
- %78 = OpSGreaterThan %17 %304 %9
- OpBranchConditional %78 %79 %80
- %79 = OpLabel
- %83 = OpISub %6 %304 %54
- %84 = OpAccessChain %51 %46 %83
- %85 = OpLoad %20 %84
- %86 = OpAccessChain %51 %46 %304
- %87 = OpLoad %20 %86
- %88 = OpFAdd %20 %87 %85
- OpStore %86 %88
- OpBranch %80
- %80 = OpLabel
- %91 = OpIAdd %6 %304 %54
- OpBranch %57
- %59 = OpLabel
- %92 = OpAccessChain %69 %68 %26
- %93 = OpLoad %20 %92
- %94 = OpConvertFToS %6 %93
- %96 = OpSLessThan %17 %94 %95
- OpSelectionMerge %98 None
- OpBranchConditional %96 %97 %114
- %97 = OpLabel
- %101 = OpAccessChain %51 %46 %9
- %102 = OpLoad %20 %101
- %103 = OpAccessChain %27 %24 %9 %26
- %104 = OpLoad %20 %103
- %105 = OpFDiv %20 %102 %104
- %106 = OpAccessChain %51 %46 %35
- %107 = OpLoad %20 %106
- %109 = OpAccessChain %27 %24 %9 %108
- %110 = OpLoad %20 %109
- %111 = OpFDiv %20 %107 %110
- %113 = OpCompositeConstruct %66 %105 %111 %112 %112
- OpStore %100 %113
- OpBranch %98
- %114 = OpLabel
- %119 = OpSLessThan %17 %94 %118
- OpSelectionMerge %121 None
- OpBranchConditional %119 %120 %135
- %120 = OpLabel
- %123 = OpAccessChain %51 %46 %122
- %124 = OpLoad %20 %123
- %125 = OpAccessChain %27 %24 %9 %26
- %126 = OpLoad %20 %125
- %127 = OpFDiv %20 %124 %126
- %129 = OpAccessChain %51 %46 %128
- %130 = OpLoad %20 %129
- %131 = OpAccessChain %27 %24 %9 %108
- %132 = OpLoad %20 %131
- %133 = OpFDiv %20 %130 %132
- %134 = OpCompositeConstruct %66 %127 %133 %112 %112
- OpStore %100 %134
- OpBranch %121
- %135 = OpLabel
- %140 = OpSLessThan %17 %94 %139
- OpSelectionMerge %142 None
- OpBranchConditional %140 %141 %156
- %141 = OpLabel
- %144 = OpAccessChain %51 %46 %143
- %145 = OpLoad %20 %144
- %146 = OpAccessChain %27 %24 %9 %26
- %147 = OpLoad %20 %146
- %148 = OpFDiv %20 %145 %147
- %150 = OpAccessChain %51 %46 %149
- %151 = OpLoad %20 %150
- %152 = OpAccessChain %27 %24 %9 %108
- %153 = OpLoad %20 %152
- %154 = OpFDiv %20 %151 %153
- %155 = OpCompositeConstruct %66 %148 %154 %112 %112
- OpStore %100 %155
- OpBranch %142
- %156 = OpLabel
- %161 = OpSLessThan %17 %94 %160
- OpSelectionMerge %163 None
- OpBranchConditional %161 %162 %177
- %162 = OpLabel
- %165 = OpAccessChain %51 %46 %164
- %166 = OpLoad %20 %165
- %167 = OpAccessChain %27 %24 %9 %26
- %168 = OpLoad %20 %167
- %169 = OpFDiv %20 %166 %168
- %171 = OpAccessChain %51 %46 %170
- %172 = OpLoad %20 %171
- %173 = OpAccessChain %27 %24 %9 %108
- %174 = OpLoad %20 %173
- %175 = OpFDiv %20 %172 %174
- %176 = OpCompositeConstruct %66 %169 %175 %112 %112
- OpStore %100 %176
- OpBranch %163
- %177 = OpLabel
- %182 = OpSLessThan %17 %94 %181
- OpSelectionMerge %184 None
- OpBranchConditional %182 %183 %197
- %183 = OpLabel
- %185 = OpAccessChain %51 %46 %95
- %186 = OpLoad %20 %185
- %187 = OpAccessChain %27 %24 %9 %26
- %188 = OpLoad %20 %187
- %189 = OpFDiv %20 %186 %188
- %191 = OpAccessChain %51 %46 %190
- %192 = OpLoad %20 %191
- %193 = OpAccessChain %27 %24 %9 %108
- %194 = OpLoad %20 %193
- %195 = OpFDiv %20 %192 %194
- %196 = OpCompositeConstruct %66 %189 %195 %112 %112
- OpStore %100 %196
- OpBranch %184
- %197 = OpLabel
- %202 = OpSLessThan %17 %94 %201
- OpSelectionMerge %204 None
- OpBranchConditional %202 %203 %218
- %203 = OpLabel
- %206 = OpAccessChain %51 %46 %205
- %207 = OpLoad %20 %206
- %208 = OpAccessChain %27 %24 %9 %26
- %209 = OpLoad %20 %208
- %210 = OpFDiv %20 %207 %209
- %212 = OpAccessChain %51 %46 %211
- %213 = OpLoad %20 %212
- %214 = OpAccessChain %27 %24 %9 %108
- %215 = OpLoad %20 %214
- %216 = OpFDiv %20 %213 %215
- %217 = OpCompositeConstruct %66 %210 %216 %112 %112
- OpStore %100 %217
- OpBranch %204
- %218 = OpLabel
- %223 = OpSLessThan %17 %94 %222
- OpSelectionMerge %225 None
- OpBranchConditional %223 %224 %239
- %224 = OpLabel
- %227 = OpAccessChain %51 %46 %226
- %228 = OpLoad %20 %227
- %229 = OpAccessChain %27 %24 %9 %26
- %230 = OpLoad %20 %229
- %231 = OpFDiv %20 %228 %230
- %233 = OpAccessChain %51 %46 %232
- %234 = OpLoad %20 %233
- %235 = OpAccessChain %27 %24 %9 %108
- %236 = OpLoad %20 %235
- %237 = OpFDiv %20 %234 %236
- %238 = OpCompositeConstruct %66 %231 %237 %112 %112
- OpStore %100 %238
- OpBranch %225
- %239 = OpLabel
- %244 = OpSLessThan %17 %94 %243
- OpSelectionMerge %246 None
- OpBranchConditional %244 %245 %260
- %245 = OpLabel
- %248 = OpAccessChain %51 %46 %247
- %249 = OpLoad %20 %248
- %250 = OpAccessChain %27 %24 %9 %26
- %251 = OpLoad %20 %250
- %252 = OpFDiv %20 %249 %251
- %254 = OpAccessChain %51 %46 %253
- %255 = OpLoad %20 %254
- %256 = OpAccessChain %27 %24 %9 %108
- %257 = OpLoad %20 %256
- %258 = OpFDiv %20 %255 %257
- %259 = OpCompositeConstruct %66 %252 %258 %112 %112
- OpStore %100 %259
- OpBranch %246
- %260 = OpLabel
- %265 = OpSLessThan %17 %94 %264
- OpSelectionMerge %267 None
- OpBranchConditional %265 %266 %280
- %266 = OpLabel
- %268 = OpAccessChain %51 %46 %118
- %269 = OpLoad %20 %268
- %270 = OpAccessChain %27 %24 %9 %26
- %271 = OpLoad %20 %270
- %272 = OpFDiv %20 %269 %271
- %274 = OpAccessChain %51 %46 %273
- %275 = OpLoad %20 %274
- %276 = OpAccessChain %27 %24 %9 %108
- %277 = OpLoad %20 %276
- %278 = OpFDiv %20 %275 %277
- %279 = OpCompositeConstruct %66 %272 %278 %112 %112
- OpStore %100 %279
- OpBranch %267
- %280 = OpLabel
- OpSelectionMerge %285 None
- OpBranchConditional %265 %285 %300
- %285 = OpLabel
- %288 = OpAccessChain %51 %46 %287
- %289 = OpLoad %20 %288
- %290 = OpAccessChain %27 %24 %9 %26
- %291 = OpLoad %20 %290
- %292 = OpFDiv %20 %289 %291
- %294 = OpAccessChain %51 %46 %293
- %295 = OpLoad %20 %294
- %296 = OpAccessChain %27 %24 %9 %108
- %297 = OpLoad %20 %296
- %298 = OpFDiv %20 %295 %297
- %299 = OpCompositeConstruct %66 %292 %298 %112 %112
- OpStore %100 %299
- OpBranch %267
- %300 = OpLabel
- OpKill
- %267 = OpLabel
- OpBranch %246
- %246 = OpLabel
- OpBranch %225
- %225 = OpLabel
- OpBranch %204
- %204 = OpLabel
- OpBranch %184
- %184 = OpLabel
- OpBranch %163
- %163 = OpLabel
- OpBranch %142
- %142 = OpLabel
- OpBranch %121
- %121 = OpLabel
- OpBranch %98
- %98 = OpLabel
- OpReturn
- OpFunctionEnd
- )";
- // The SPIR-V comes from the 'matrices_smart_loops' GLSL shader that ships
- // with GraphicsFuzz.
- const std::string kTestShader4 = R"(
- OpCapability Shader
- %1 = OpExtInstImport "GLSL.std.450"
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %4 "main" %327 %363 %65 %70 %80 %90 %99 %108 %117 %126 %135 %144 %333
- OpExecutionMode %4 OriginUpperLeft
- OpSource ESSL 310
- OpName %4 "main"
- OpName %8 "matrix_number"
- OpName %12 "cols"
- OpName %23 "rows"
- OpName %31 "c"
- OpName %41 "r"
- OpName %65 "m22"
- OpName %68 "buf0"
- OpMemberName %68 0 "one"
- OpName %70 ""
- OpName %80 "m23"
- OpName %90 "m24"
- OpName %99 "m32"
- OpName %108 "m33"
- OpName %117 "m34"
- OpName %126 "m42"
- OpName %135 "m43"
- OpName %144 "m44"
- OpName %164 "sum_index"
- OpName %165 "cols"
- OpName %173 "rows"
- OpName %184 "sums"
- OpName %189 "c"
- OpName %198 "r"
- OpName %325 "region_x"
- OpName %327 "gl_FragCoord"
- OpName %331 "buf1"
- OpMemberName %331 0 "resolution"
- OpName %333 ""
- OpName %340 "region_y"
- OpName %348 "overall_region"
- OpName %363 "_GLF_color"
- OpDecorate %8 RelaxedPrecision
- OpDecorate %12 RelaxedPrecision
- OpDecorate %19 RelaxedPrecision
- OpDecorate %23 RelaxedPrecision
- OpDecorate %29 RelaxedPrecision
- OpDecorate %31 RelaxedPrecision
- OpDecorate %38 RelaxedPrecision
- OpDecorate %39 RelaxedPrecision
- OpDecorate %41 RelaxedPrecision
- OpDecorate %47 RelaxedPrecision
- OpDecorate %48 RelaxedPrecision
- OpDecorate %50 RelaxedPrecision
- OpDecorate %66 RelaxedPrecision
- OpDecorate %67 RelaxedPrecision
- OpMemberDecorate %68 0 Offset 0
- OpDecorate %68 Block
- OpDecorate %70 DescriptorSet 0
- OpDecorate %70 Binding 0
- OpDecorate %81 RelaxedPrecision
- OpDecorate %82 RelaxedPrecision
- OpDecorate %91 RelaxedPrecision
- OpDecorate %92 RelaxedPrecision
- OpDecorate %100 RelaxedPrecision
- OpDecorate %101 RelaxedPrecision
- OpDecorate %109 RelaxedPrecision
- OpDecorate %110 RelaxedPrecision
- OpDecorate %118 RelaxedPrecision
- OpDecorate %119 RelaxedPrecision
- OpDecorate %127 RelaxedPrecision
- OpDecorate %128 RelaxedPrecision
- OpDecorate %136 RelaxedPrecision
- OpDecorate %137 RelaxedPrecision
- OpDecorate %145 RelaxedPrecision
- OpDecorate %146 RelaxedPrecision
- OpDecorate %152 RelaxedPrecision
- OpDecorate %154 RelaxedPrecision
- OpDecorate %155 RelaxedPrecision
- OpDecorate %156 RelaxedPrecision
- OpDecorate %157 RelaxedPrecision
- OpDecorate %159 RelaxedPrecision
- OpDecorate %160 RelaxedPrecision
- OpDecorate %161 RelaxedPrecision
- OpDecorate %162 RelaxedPrecision
- OpDecorate %163 RelaxedPrecision
- OpDecorate %164 RelaxedPrecision
- OpDecorate %165 RelaxedPrecision
- OpDecorate %171 RelaxedPrecision
- OpDecorate %173 RelaxedPrecision
- OpDecorate %179 RelaxedPrecision
- OpDecorate %185 RelaxedPrecision
- OpDecorate %189 RelaxedPrecision
- OpDecorate %195 RelaxedPrecision
- OpDecorate %196 RelaxedPrecision
- OpDecorate %198 RelaxedPrecision
- OpDecorate %204 RelaxedPrecision
- OpDecorate %205 RelaxedPrecision
- OpDecorate %207 RelaxedPrecision
- OpDecorate %218 RelaxedPrecision
- OpDecorate %219 RelaxedPrecision
- OpDecorate %220 RelaxedPrecision
- OpDecorate %228 RelaxedPrecision
- OpDecorate %229 RelaxedPrecision
- OpDecorate %230 RelaxedPrecision
- OpDecorate %238 RelaxedPrecision
- OpDecorate %239 RelaxedPrecision
- OpDecorate %240 RelaxedPrecision
- OpDecorate %248 RelaxedPrecision
- OpDecorate %249 RelaxedPrecision
- OpDecorate %250 RelaxedPrecision
- OpDecorate %258 RelaxedPrecision
- OpDecorate %259 RelaxedPrecision
- OpDecorate %260 RelaxedPrecision
- OpDecorate %268 RelaxedPrecision
- OpDecorate %269 RelaxedPrecision
- OpDecorate %270 RelaxedPrecision
- OpDecorate %278 RelaxedPrecision
- OpDecorate %279 RelaxedPrecision
- OpDecorate %280 RelaxedPrecision
- OpDecorate %288 RelaxedPrecision
- OpDecorate %289 RelaxedPrecision
- OpDecorate %290 RelaxedPrecision
- OpDecorate %298 RelaxedPrecision
- OpDecorate %299 RelaxedPrecision
- OpDecorate %300 RelaxedPrecision
- OpDecorate %309 RelaxedPrecision
- OpDecorate %310 RelaxedPrecision
- OpDecorate %311 RelaxedPrecision
- OpDecorate %312 RelaxedPrecision
- OpDecorate %313 RelaxedPrecision
- OpDecorate %319 RelaxedPrecision
- OpDecorate %320 RelaxedPrecision
- OpDecorate %321 RelaxedPrecision
- OpDecorate %322 RelaxedPrecision
- OpDecorate %323 RelaxedPrecision
- OpDecorate %324 RelaxedPrecision
- OpDecorate %325 RelaxedPrecision
- OpDecorate %327 BuiltIn FragCoord
- OpMemberDecorate %331 0 Offset 0
- OpDecorate %331 Block
- OpDecorate %333 DescriptorSet 0
- OpDecorate %333 Binding 1
- OpDecorate %339 RelaxedPrecision
- OpDecorate %340 RelaxedPrecision
- OpDecorate %347 RelaxedPrecision
- OpDecorate %348 RelaxedPrecision
- OpDecorate %349 RelaxedPrecision
- OpDecorate %351 RelaxedPrecision
- OpDecorate %352 RelaxedPrecision
- OpDecorate %353 RelaxedPrecision
- OpDecorate %354 RelaxedPrecision
- OpDecorate %356 RelaxedPrecision
- OpDecorate %363 Location 0
- OpDecorate %364 RelaxedPrecision
- %2 = OpTypeVoid
- %3 = OpTypeFunction %2
- %6 = OpTypeInt 32 0
- %7 = OpTypePointer Function %6
- %9 = OpConstant %6 0
- %10 = OpTypeInt 32 1
- %11 = OpTypePointer Function %10
- %13 = OpConstant %10 2
- %20 = OpConstant %10 4
- %21 = OpTypeBool
- %32 = OpConstant %10 0
- %61 = OpTypeFloat 32
- %62 = OpTypeVector %61 2
- %63 = OpTypeMatrix %62 2
- %64 = OpTypePointer Private %63
- %65 = OpVariable %64 Private
- %68 = OpTypeStruct %61
- %69 = OpTypePointer Uniform %68
- %70 = OpVariable %69 Uniform
- %71 = OpTypePointer Uniform %61
- %74 = OpTypePointer Private %61
- %77 = OpTypeVector %61 3
- %78 = OpTypeMatrix %77 2
- %79 = OpTypePointer Private %78
- %80 = OpVariable %79 Private
- %87 = OpTypeVector %61 4
- %88 = OpTypeMatrix %87 2
- %89 = OpTypePointer Private %88
- %90 = OpVariable %89 Private
- %97 = OpTypeMatrix %62 3
- %98 = OpTypePointer Private %97
- %99 = OpVariable %98 Private
- %106 = OpTypeMatrix %77 3
- %107 = OpTypePointer Private %106
- %108 = OpVariable %107 Private
- %115 = OpTypeMatrix %87 3
- %116 = OpTypePointer Private %115
- %117 = OpVariable %116 Private
- %124 = OpTypeMatrix %62 4
- %125 = OpTypePointer Private %124
- %126 = OpVariable %125 Private
- %133 = OpTypeMatrix %77 4
- %134 = OpTypePointer Private %133
- %135 = OpVariable %134 Private
- %142 = OpTypeMatrix %87 4
- %143 = OpTypePointer Private %142
- %144 = OpVariable %143 Private
- %153 = OpConstant %10 1
- %158 = OpConstant %6 1
- %181 = OpConstant %6 9
- %182 = OpTypeArray %61 %181
- %183 = OpTypePointer Function %182
- %186 = OpConstant %61 0
- %187 = OpTypePointer Function %61
- %314 = OpConstant %61 16
- %326 = OpTypePointer Input %87
- %327 = OpVariable %326 Input
- %328 = OpTypePointer Input %61
- %331 = OpTypeStruct %62
- %332 = OpTypePointer Uniform %331
- %333 = OpVariable %332 Uniform
- %336 = OpConstant %61 3
- %350 = OpConstant %10 3
- %357 = OpConstant %10 9
- %362 = OpTypePointer Output %87
- %363 = OpVariable %362 Output
- %368 = OpConstant %61 1
- %374 = OpConstantComposite %87 %186 %186 %186 %368
- %4 = OpFunction %2 None %3
- %5 = OpLabel
- %8 = OpVariable %7 Function
- %12 = OpVariable %11 Function
- %23 = OpVariable %11 Function
- %31 = OpVariable %11 Function
- %41 = OpVariable %11 Function
- %164 = OpVariable %11 Function
- %165 = OpVariable %11 Function
- %173 = OpVariable %11 Function
- %184 = OpVariable %183 Function
- %189 = OpVariable %11 Function
- %198 = OpVariable %11 Function
- %325 = OpVariable %11 Function
- %340 = OpVariable %11 Function
- %348 = OpVariable %11 Function
- OpStore %8 %9
- OpStore %12 %13
- OpBranch %14
- %14 = OpLabel
- OpLoopMerge %16 %17 None
- OpBranch %18
- %18 = OpLabel
- %19 = OpLoad %10 %12
- %22 = OpSLessThanEqual %21 %19 %20
- OpBranchConditional %22 %15 %16
- %15 = OpLabel
- OpStore %23 %13
- OpBranch %24
- %24 = OpLabel
- OpLoopMerge %26 %27 None
- OpBranch %28
- %28 = OpLabel
- %29 = OpLoad %10 %23
- %30 = OpSLessThanEqual %21 %29 %20
- OpBranchConditional %30 %25 %26
- %25 = OpLabel
- OpStore %31 %32
- OpBranch %33
- %33 = OpLabel
- OpLoopMerge %35 %36 None
- OpBranch %37
- %37 = OpLabel
- %38 = OpLoad %10 %31
- %39 = OpLoad %10 %12
- %40 = OpSLessThan %21 %38 %39
- OpBranchConditional %40 %34 %35
- %34 = OpLabel
- OpStore %41 %32
- OpBranch %42
- %42 = OpLabel
- OpLoopMerge %44 %45 None
- OpBranch %46
- %46 = OpLabel
- %47 = OpLoad %10 %41
- %48 = OpLoad %10 %23
- %49 = OpSLessThan %21 %47 %48
- OpBranchConditional %49 %43 %44
- %43 = OpLabel
- %50 = OpLoad %6 %8
- OpSelectionMerge %60 None
- OpSwitch %50 %60 0 %51 1 %52 2 %53 3 %54 4 %55 5 %56 6 %57 7 %58 8 %59
- %51 = OpLabel
- %66 = OpLoad %10 %31
- %67 = OpLoad %10 %41
- %72 = OpAccessChain %71 %70 %32
- %73 = OpLoad %61 %72
- %75 = OpAccessChain %74 %65 %66 %67
- OpStore %75 %73
- OpBranch %60
- %52 = OpLabel
- %81 = OpLoad %10 %31
- %82 = OpLoad %10 %41
- %83 = OpAccessChain %71 %70 %32
- %84 = OpLoad %61 %83
- %85 = OpAccessChain %74 %80 %81 %82
- OpStore %85 %84
- OpBranch %60
- %53 = OpLabel
- %91 = OpLoad %10 %31
- %92 = OpLoad %10 %41
- %93 = OpAccessChain %71 %70 %32
- %94 = OpLoad %61 %93
- %95 = OpAccessChain %74 %90 %91 %92
- OpStore %95 %94
- OpBranch %60
- %54 = OpLabel
- %100 = OpLoad %10 %31
- %101 = OpLoad %10 %41
- %102 = OpAccessChain %71 %70 %32
- %103 = OpLoad %61 %102
- %104 = OpAccessChain %74 %99 %100 %101
- OpStore %104 %103
- OpBranch %60
- %55 = OpLabel
- %109 = OpLoad %10 %31
- %110 = OpLoad %10 %41
- %111 = OpAccessChain %71 %70 %32
- %112 = OpLoad %61 %111
- %113 = OpAccessChain %74 %108 %109 %110
- OpStore %113 %112
- OpBranch %60
- %56 = OpLabel
- %118 = OpLoad %10 %31
- %119 = OpLoad %10 %41
- %120 = OpAccessChain %71 %70 %32
- %121 = OpLoad %61 %120
- %122 = OpAccessChain %74 %117 %118 %119
- OpStore %122 %121
- OpBranch %60
- %57 = OpLabel
- %127 = OpLoad %10 %31
- %128 = OpLoad %10 %41
- %129 = OpAccessChain %71 %70 %32
- %130 = OpLoad %61 %129
- %131 = OpAccessChain %74 %126 %127 %128
- OpStore %131 %130
- OpBranch %60
- %58 = OpLabel
- %136 = OpLoad %10 %31
- %137 = OpLoad %10 %41
- %138 = OpAccessChain %71 %70 %32
- %139 = OpLoad %61 %138
- %140 = OpAccessChain %74 %135 %136 %137
- OpStore %140 %139
- OpBranch %60
- %59 = OpLabel
- %145 = OpLoad %10 %31
- %146 = OpLoad %10 %41
- %147 = OpAccessChain %71 %70 %32
- %148 = OpLoad %61 %147
- %149 = OpAccessChain %74 %144 %145 %146
- OpStore %149 %148
- OpBranch %60
- %60 = OpLabel
- OpBranch %45
- %45 = OpLabel
- %152 = OpLoad %10 %41
- %154 = OpIAdd %10 %152 %153
- OpStore %41 %154
- OpBranch %42
- %44 = OpLabel
- OpBranch %36
- %36 = OpLabel
- %155 = OpLoad %10 %31
- %156 = OpIAdd %10 %155 %153
- OpStore %31 %156
- OpBranch %33
- %35 = OpLabel
- %157 = OpLoad %6 %8
- %159 = OpIAdd %6 %157 %158
- OpStore %8 %159
- OpBranch %27
- %27 = OpLabel
- %160 = OpLoad %10 %23
- %161 = OpIAdd %10 %160 %153
- OpStore %23 %161
- OpBranch %24
- %26 = OpLabel
- OpBranch %17
- %17 = OpLabel
- %162 = OpLoad %10 %12
- %163 = OpIAdd %10 %162 %153
- OpStore %12 %163
- OpBranch %14
- %16 = OpLabel
- OpStore %164 %32
- OpStore %165 %13
- OpBranch %166
- %166 = OpLabel
- OpLoopMerge %168 %169 None
- OpBranch %170
- %170 = OpLabel
- %171 = OpLoad %10 %165
- %172 = OpSLessThanEqual %21 %171 %20
- OpBranchConditional %172 %167 %168
- %167 = OpLabel
- OpStore %173 %13
- OpBranch %174
- %174 = OpLabel
- OpLoopMerge %176 %177 None
- OpBranch %178
- %178 = OpLabel
- %179 = OpLoad %10 %173
- %180 = OpSLessThanEqual %21 %179 %20
- OpBranchConditional %180 %175 %176
- %175 = OpLabel
- %185 = OpLoad %10 %164
- %188 = OpAccessChain %187 %184 %185
- OpStore %188 %186
- OpStore %189 %32
- OpBranch %190
- %190 = OpLabel
- OpLoopMerge %192 %193 None
- OpBranch %194
- %194 = OpLabel
- %195 = OpLoad %10 %189
- %196 = OpLoad %10 %165
- %197 = OpSLessThan %21 %195 %196
- OpBranchConditional %197 %191 %192
- %191 = OpLabel
- OpStore %198 %32
- OpBranch %199
- %199 = OpLabel
- OpLoopMerge %201 %202 None
- OpBranch %203
- %203 = OpLabel
- %204 = OpLoad %10 %198
- %205 = OpLoad %10 %173
- %206 = OpSLessThan %21 %204 %205
- OpBranchConditional %206 %200 %201
- %200 = OpLabel
- %207 = OpLoad %10 %164
- OpSelectionMerge %217 None
- OpSwitch %207 %217 0 %208 1 %209 2 %210 3 %211 4 %212 5 %213 6 %214 7 %215 8 %216
- %208 = OpLabel
- %218 = OpLoad %10 %164
- %219 = OpLoad %10 %189
- %220 = OpLoad %10 %198
- %221 = OpAccessChain %74 %65 %219 %220
- %222 = OpLoad %61 %221
- %223 = OpAccessChain %187 %184 %218
- %224 = OpLoad %61 %223
- %225 = OpFAdd %61 %224 %222
- %226 = OpAccessChain %187 %184 %218
- OpStore %226 %225
- OpBranch %217
- %209 = OpLabel
- %228 = OpLoad %10 %164
- %229 = OpLoad %10 %189
- %230 = OpLoad %10 %198
- %231 = OpAccessChain %74 %80 %229 %230
- %232 = OpLoad %61 %231
- %233 = OpAccessChain %187 %184 %228
- %234 = OpLoad %61 %233
- %235 = OpFAdd %61 %234 %232
- %236 = OpAccessChain %187 %184 %228
- OpStore %236 %235
- OpBranch %217
- %210 = OpLabel
- %238 = OpLoad %10 %164
- %239 = OpLoad %10 %189
- %240 = OpLoad %10 %198
- %241 = OpAccessChain %74 %90 %239 %240
- %242 = OpLoad %61 %241
- %243 = OpAccessChain %187 %184 %238
- %244 = OpLoad %61 %243
- %245 = OpFAdd %61 %244 %242
- %246 = OpAccessChain %187 %184 %238
- OpStore %246 %245
- OpBranch %217
- %211 = OpLabel
- %248 = OpLoad %10 %164
- %249 = OpLoad %10 %189
- %250 = OpLoad %10 %198
- %251 = OpAccessChain %74 %99 %249 %250
- %252 = OpLoad %61 %251
- %253 = OpAccessChain %187 %184 %248
- %254 = OpLoad %61 %253
- %255 = OpFAdd %61 %254 %252
- %256 = OpAccessChain %187 %184 %248
- OpStore %256 %255
- OpBranch %217
- %212 = OpLabel
- %258 = OpLoad %10 %164
- %259 = OpLoad %10 %189
- %260 = OpLoad %10 %198
- %261 = OpAccessChain %74 %108 %259 %260
- %262 = OpLoad %61 %261
- %263 = OpAccessChain %187 %184 %258
- %264 = OpLoad %61 %263
- %265 = OpFAdd %61 %264 %262
- %266 = OpAccessChain %187 %184 %258
- OpStore %266 %265
- OpBranch %217
- %213 = OpLabel
- %268 = OpLoad %10 %164
- %269 = OpLoad %10 %189
- %270 = OpLoad %10 %198
- %271 = OpAccessChain %74 %117 %269 %270
- %272 = OpLoad %61 %271
- %273 = OpAccessChain %187 %184 %268
- %274 = OpLoad %61 %273
- %275 = OpFAdd %61 %274 %272
- %276 = OpAccessChain %187 %184 %268
- OpStore %276 %275
- OpBranch %217
- %214 = OpLabel
- %278 = OpLoad %10 %164
- %279 = OpLoad %10 %189
- %280 = OpLoad %10 %198
- %281 = OpAccessChain %74 %126 %279 %280
- %282 = OpLoad %61 %281
- %283 = OpAccessChain %187 %184 %278
- %284 = OpLoad %61 %283
- %285 = OpFAdd %61 %284 %282
- %286 = OpAccessChain %187 %184 %278
- OpStore %286 %285
- OpBranch %217
- %215 = OpLabel
- %288 = OpLoad %10 %164
- %289 = OpLoad %10 %189
- %290 = OpLoad %10 %198
- %291 = OpAccessChain %74 %135 %289 %290
- %292 = OpLoad %61 %291
- %293 = OpAccessChain %187 %184 %288
- %294 = OpLoad %61 %293
- %295 = OpFAdd %61 %294 %292
- %296 = OpAccessChain %187 %184 %288
- OpStore %296 %295
- OpBranch %217
- %216 = OpLabel
- %298 = OpLoad %10 %164
- %299 = OpLoad %10 %189
- %300 = OpLoad %10 %198
- %301 = OpAccessChain %74 %144 %299 %300
- %302 = OpLoad %61 %301
- %303 = OpAccessChain %187 %184 %298
- %304 = OpLoad %61 %303
- %305 = OpFAdd %61 %304 %302
- %306 = OpAccessChain %187 %184 %298
- OpStore %306 %305
- OpBranch %217
- %217 = OpLabel
- OpBranch %202
- %202 = OpLabel
- %309 = OpLoad %10 %198
- %310 = OpIAdd %10 %309 %153
- OpStore %198 %310
- OpBranch %199
- %201 = OpLabel
- OpBranch %193
- %193 = OpLabel
- %311 = OpLoad %10 %189
- %312 = OpIAdd %10 %311 %153
- OpStore %189 %312
- OpBranch %190
- %192 = OpLabel
- %313 = OpLoad %10 %164
- %315 = OpAccessChain %187 %184 %313
- %316 = OpLoad %61 %315
- %317 = OpFDiv %61 %316 %314
- %318 = OpAccessChain %187 %184 %313
- OpStore %318 %317
- %319 = OpLoad %10 %164
- %320 = OpIAdd %10 %319 %153
- OpStore %164 %320
- OpBranch %177
- %177 = OpLabel
- %321 = OpLoad %10 %173
- %322 = OpIAdd %10 %321 %153
- OpStore %173 %322
- OpBranch %174
- %176 = OpLabel
- OpBranch %169
- %169 = OpLabel
- %323 = OpLoad %10 %165
- %324 = OpIAdd %10 %323 %153
- OpStore %165 %324
- OpBranch %166
- %168 = OpLabel
- %329 = OpAccessChain %328 %327 %9
- %330 = OpLoad %61 %329
- %334 = OpAccessChain %71 %333 %32 %9
- %335 = OpLoad %61 %334
- %337 = OpFDiv %61 %335 %336
- %338 = OpFDiv %61 %330 %337
- %339 = OpConvertFToS %10 %338
- OpStore %325 %339
- %341 = OpAccessChain %328 %327 %158
- %342 = OpLoad %61 %341
- %343 = OpAccessChain %71 %333 %32 %9
- %344 = OpLoad %61 %343
- %345 = OpFDiv %61 %344 %336
- %346 = OpFDiv %61 %342 %345
- %347 = OpConvertFToS %10 %346
- OpStore %340 %347
- %349 = OpLoad %10 %340
- %351 = OpIMul %10 %349 %350
- %352 = OpLoad %10 %325
- %353 = OpIAdd %10 %351 %352
- OpStore %348 %353
- %354 = OpLoad %10 %348
- %355 = OpSGreaterThan %21 %354 %32
- %356 = OpLoad %10 %348
- %358 = OpSLessThan %21 %356 %357
- %359 = OpLogicalAnd %21 %355 %358
- OpSelectionMerge %361 None
- OpBranchConditional %359 %360 %373
- %360 = OpLabel
- %364 = OpLoad %10 %348
- %365 = OpAccessChain %187 %184 %364
- %366 = OpLoad %61 %365
- %367 = OpCompositeConstruct %77 %366 %366 %366
- %369 = OpCompositeExtract %61 %367 0
- %370 = OpCompositeExtract %61 %367 1
- %371 = OpCompositeExtract %61 %367 2
- %372 = OpCompositeConstruct %87 %369 %370 %371 %368
- OpStore %363 %372
- OpBranch %361
- %373 = OpLabel
- OpStore %363 %374
- OpBranch %361
- %361 = OpLabel
- OpReturn
- OpFunctionEnd
- )";
- // The SPIR-V comes from the following GLSL:
- //
- // #version 310 es
- // precision highp float;
- //
- // layout(location = 0) out vec4 color;
- //
- // void main()
- // {
- // color = vec4(1.0, 0.0, 0.0, 1.0);
- // }
- const std::string kTestShader5 = R"(
- OpCapability Shader
- %1 = OpExtInstImport "GLSL.std.450"
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %4 "main" %9
- OpExecutionMode %4 OriginUpperLeft
- OpSource ESSL 310
- OpName %4 "main"
- OpName %9 "color"
- OpDecorate %9 Location 0
- %2 = OpTypeVoid
- %3 = OpTypeFunction %2
- %6 = OpTypeFloat 32
- %7 = OpTypeVector %6 4
- %8 = OpTypePointer Output %7
- %9 = OpVariable %8 Output
- %10 = OpConstant %6 1
- %11 = OpConstant %6 0
- %12 = OpConstantComposite %7 %10 %11 %11 %10
- %4 = OpFunction %2 None %3
- %5 = OpLabel
- OpStore %9 %12
- OpReturn
- OpFunctionEnd
- )";
- // Some miscellaneous SPIR-V.
- const std::string kTestShader6 = R"(
- OpCapability Shader
- OpCapability SampledBuffer
- OpCapability ImageBuffer
- %1 = OpExtInstImport "GLSL.std.450"
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %2 "main" %40 %41
- OpExecutionMode %2 OriginUpperLeft
- OpSource GLSL 450
- OpDecorate %40 DescriptorSet 0
- OpDecorate %40 Binding 69
- OpDecorate %41 DescriptorSet 0
- OpDecorate %41 Binding 1
- %54 = OpTypeFloat 32
- %76 = OpTypeVector %54 4
- %55 = OpConstant %54 0
- %56 = OpTypeVector %54 3
- %94 = OpTypeVector %54 2
- %112 = OpConstantComposite %94 %55 %55
- %57 = OpConstantComposite %56 %55 %55 %55
- %15 = OpTypeImage %54 2D 2 0 0 1 Unknown
- %114 = OpTypePointer UniformConstant %15
- %38 = OpTypeSampler
- %125 = OpTypePointer UniformConstant %38
- %132 = OpTypeVoid
- %133 = OpTypeFunction %132
- %45 = OpTypeSampledImage %15
- %40 = OpVariable %114 UniformConstant
- %41 = OpVariable %125 UniformConstant
- %2 = OpFunction %132 None %133
- %164 = OpLabel
- %184 = OpLoad %15 %40
- %213 = OpLoad %38 %41
- %216 = OpSampledImage %45 %184 %213
- %217 = OpImageSampleImplicitLod %76 %216 %112 Bias %55
- OpReturn
- OpFunctionEnd
- )";
- // A virtually empty piece of SPIR-V.
- const std::string kTestShader7 = R"(
- OpCapability Shader
- %1 = OpExtInstImport "GLSL.std.450"
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %4 "main"
- OpExecutionMode %4 OriginUpperLeft
- OpSource ESSL 320
- %2 = OpTypeVoid
- %3 = OpTypeFunction %2
- %4 = OpFunction %2 None %3
- %5 = OpLabel
- OpReturn
- OpFunctionEnd
- )";
- void AddConstantUniformFact(protobufs::FactSequence* facts,
- uint32_t descriptor_set, uint32_t binding,
- std::vector<uint32_t>&& indices, uint32_t value) {
- protobufs::FactConstantUniform fact;
- *fact.mutable_uniform_buffer_element_descriptor() =
- MakeUniformBufferElementDescriptor(descriptor_set, binding,
- std::move(indices));
- *fact.mutable_constant_word()->Add() = value;
- protobufs::Fact temp;
- *temp.mutable_constant_uniform_fact() = fact;
- *facts->mutable_fact()->Add() = temp;
- }
- // Reinterpret the bits of |value| as a 32-bit unsigned int
- uint32_t FloatBitsAsUint(float value) {
- uint32_t result;
- memcpy(&result, &value, sizeof(float));
- return result;
- }
- // Assembles the given |shader| text, and then runs the fuzzer |num_runs|
- // times, using successive seeds starting from |initial_seed|. Checks that
- // the binary produced after each fuzzer run is valid, and that replaying
- // the transformations that were applied during fuzzing leads to an
- // identical binary.
- void RunFuzzerAndReplayer(const std::string& shader,
- const protobufs::FactSequence& initial_facts,
- uint32_t initial_seed, uint32_t num_runs) {
- const auto env = SPV_ENV_UNIVERSAL_1_5;
- std::vector<uint32_t> binary_in;
- SpirvTools t(env);
- t.SetMessageConsumer(kConsoleMessageConsumer);
- ASSERT_TRUE(t.Assemble(shader, &binary_in, kFuzzAssembleOption));
- ASSERT_TRUE(t.Validate(binary_in));
- std::vector<fuzzerutil::ModuleSupplier> donor_suppliers;
- for (auto donor : {&kTestShader1, &kTestShader2, &kTestShader3, &kTestShader4,
- &kTestShader5, &kTestShader6}) {
- donor_suppliers.emplace_back([donor]() {
- return BuildModule(env, kConsoleMessageConsumer, *donor,
- kFuzzAssembleOption);
- });
- }
- std::vector<RepeatedPassStrategy> strategies{
- RepeatedPassStrategy::kSimple,
- RepeatedPassStrategy::kLoopedWithRecommendations,
- RepeatedPassStrategy::kRandomWithRecommendations};
- uint32_t strategy_index = 0;
- for (uint32_t seed = initial_seed; seed < initial_seed + num_runs; seed++) {
- spvtools::ValidatorOptions validator_options;
- std::unique_ptr<opt::IRContext> ir_context;
- ASSERT_TRUE(fuzzerutil::BuildIRContext(env, kConsoleMessageConsumer,
- binary_in, validator_options,
- &ir_context));
- auto fuzzer_context = MakeUnique<FuzzerContext>(
- MakeUnique<PseudoRandomGenerator>(seed),
- FuzzerContext::GetMinFreshId(ir_context.get()), false);
- auto transformation_context = MakeUnique<TransformationContext>(
- MakeUnique<FactManager>(ir_context.get()), validator_options);
- transformation_context->GetFactManager()->AddInitialFacts(
- kConsoleMessageConsumer, initial_facts);
- // Every 4th time we run the fuzzer, enable all fuzzer passes.
- bool enable_all_passes = (seed % 4) == 0;
- Fuzzer fuzzer(std::move(ir_context), std::move(transformation_context),
- std::move(fuzzer_context), kConsoleMessageConsumer,
- donor_suppliers, enable_all_passes,
- strategies[strategy_index], true, validator_options, false);
- auto fuzzer_result = fuzzer.Run(0);
- // Cycle the repeated pass strategy so that we try a different one next time
- // we run the fuzzer.
- strategy_index =
- (strategy_index + 1) % static_cast<uint32_t>(strategies.size());
- ASSERT_NE(Fuzzer::Status::kFuzzerPassLedToInvalidModule,
- fuzzer_result.status);
- std::vector<uint32_t> transformed_binary;
- fuzzer.GetIRContext()->module()->ToBinary(&transformed_binary, true);
- ASSERT_TRUE(t.Validate(transformed_binary));
- auto replayer_result =
- Replayer(env, kConsoleMessageConsumer, binary_in, initial_facts,
- fuzzer.GetTransformationSequence(),
- static_cast<uint32_t>(
- fuzzer.GetTransformationSequence().transformation_size()),
- false, validator_options)
- .Run();
- ASSERT_EQ(Replayer::ReplayerResultStatus::kComplete,
- replayer_result.status);
- // After replaying the transformations applied by the fuzzer, exactly those
- // transformations should have been applied, and the binary resulting from
- // replay should be identical to that which resulted from fuzzing.
- std::string fuzzer_transformations_string;
- std::string replayer_transformations_string;
- fuzzer.GetTransformationSequence().SerializeToString(
- &fuzzer_transformations_string);
- replayer_result.applied_transformations.SerializeToString(
- &replayer_transformations_string);
- ASSERT_EQ(fuzzer_transformations_string, replayer_transformations_string);
- ASSERT_TRUE(IsEqual(env, transformed_binary,
- replayer_result.transformed_module.get()));
- }
- }
- TEST(FuzzerReplayerTest, Miscellaneous1) {
- // Do some fuzzer runs, starting from an initial seed of 0 (seed value chosen
- // arbitrarily).
- RunFuzzerAndReplayer(kTestShader1, protobufs::FactSequence(), 0,
- kNumFuzzerRuns);
- }
- TEST(FuzzerReplayerTest, Miscellaneous2) {
- // Do some fuzzer runs, starting from an initial seed of 10 (seed value chosen
- // arbitrarily).
- RunFuzzerAndReplayer(kTestShader2, protobufs::FactSequence(), 10,
- kNumFuzzerRuns);
- }
- TEST(FuzzerReplayerTest, Miscellaneous3) {
- // Add the facts "resolution.x == 250" and "resolution.y == 100".
- protobufs::FactSequence facts;
- AddConstantUniformFact(&facts, 0, 0, {0, 0}, 250);
- AddConstantUniformFact(&facts, 0, 0, {0, 1}, 100);
- // Do some fuzzer runs, starting from an initial seed of 94 (seed value chosen
- // arbitrarily).
- RunFuzzerAndReplayer(kTestShader3, facts, 94, kNumFuzzerRuns);
- }
- TEST(FuzzerReplayerTest, Miscellaneous4) {
- // Add the facts:
- // - "one == 1.0"
- // - "resolution.y == 256.0",
- protobufs::FactSequence facts;
- AddConstantUniformFact(&facts, 0, 0, {0}, FloatBitsAsUint(1.0));
- AddConstantUniformFact(&facts, 0, 1, {0, 0}, FloatBitsAsUint(256.0));
- AddConstantUniformFact(&facts, 0, 1, {0, 1}, FloatBitsAsUint(256.0));
- // Do some fuzzer runs, starting from an initial seed of 14 (seed value chosen
- // arbitrarily).
- RunFuzzerAndReplayer(kTestShader4, facts, 14, kNumFuzzerRuns);
- }
- TEST(FuzzerReplayerTest, Miscellaneous5) {
- // Do some fuzzer runs, starting from an initial seed of 29 (seed value chosen
- // arbitrarily).
- RunFuzzerAndReplayer(kTestShader5, protobufs::FactSequence(), 29,
- kNumFuzzerRuns);
- }
- TEST(FuzzerReplayerTest, Miscellaneous6) {
- // Do some fuzzer runs, starting from an initial seed of 57 (seed value chosen
- // arbitrarily).
- RunFuzzerAndReplayer(kTestShader6, protobufs::FactSequence(), 57,
- kNumFuzzerRuns);
- }
- TEST(FuzzerReplayerTest, Miscellaneous7) {
- // Do some fuzzer runs, starting from an initial seed of 1 (seed value chosen
- // arbitrarily).
- RunFuzzerAndReplayer(kTestShader7, protobufs::FactSequence(), 1,
- kNumFuzzerRuns);
- }
- } // namespace
- } // namespace fuzz
- } // namespace spvtools
|