| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271 |
- // Copyright (c) 2018 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 "assembly_builder.h"
- #include "pass_fixture.h"
- #include "pass_utils.h"
- namespace {
- using namespace spvtools;
- using UpgradeMemoryModelTest = opt::PassTest<::testing::Test>;
- TEST_F(UpgradeMemoryModelTest, InvalidMemoryModelOpenCL) {
- const std::string text = R"(
- ; CHECK: OpMemoryModel Logical OpenCL
- OpCapability Kernel
- OpCapability Linkage
- OpMemoryModel Logical OpenCL
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, InvalidMemoryModelVulkan) {
- const std::string text = R"(
- ; CHECK: OpMemoryModel Logical Vulkan
- OpCapability Shader
- OpCapability Linkage
- OpCapability VulkanMemoryModel
- OpExtension "SPV_KHR_vulkan_memory_model"
- OpMemoryModel Logical Vulkan
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, JustMemoryModel) {
- const std::string text = R"(
- ; CHECK: OpCapability VulkanMemoryModel
- ; CHECK: OpExtension "SPV_KHR_vulkan_memory_model"
- ; CHECK: OpMemoryModel Logical Vulkan
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, RemoveDecorations) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- OpDecorate %var Volatile
- OpDecorate %var Coherent
- %int = OpTypeInt 32 0
- %ptr_int_Uniform = OpTypePointer Uniform %int
- %var = OpVariable %ptr_int_Uniform Uniform
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, WorkgroupVariable) {
- const std::string text = R"(
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 2
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_int_Workgroup = OpTypePointer Workgroup %int
- %var = OpVariable %ptr_int_Workgroup Workgroup
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %ld = OpLoad %int %var
- OpStore %var %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, WorkgroupFunctionParameter) {
- const std::string text = R"(
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 2
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_int_Workgroup = OpTypePointer Workgroup %int
- %func_ty = OpTypeFunction %void %ptr_int_Workgroup
- %func = OpFunction %void None %func_ty
- %param = OpFunctionParameter %ptr_int_Workgroup
- %1 = OpLabel
- %ld = OpLoad %int %param
- OpStore %param %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SimpleUniformVariable) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- OpDecorate %var Coherent
- OpDecorate %var Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_int_Uniform = OpTypePointer Uniform %int
- %var = OpVariable %ptr_int_Uniform Uniform
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %ld = OpLoad %int %var
- OpStore %var %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SimpleUniformFunctionParameter) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- OpDecorate %param Coherent
- OpDecorate %param Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_int_Uniform = OpTypePointer Uniform %int
- %func_ty = OpTypeFunction %void %ptr_int_Uniform
- %func = OpFunction %void None %func_ty
- %param = OpFunctionParameter %ptr_int_Uniform
- %1 = OpLabel
- %ld = OpLoad %int %param
- OpStore %param %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SimpleUniformVariableOnlyVolatile) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK-NOT: OpConstant
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile
- ; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- OpDecorate %var Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_int_Uniform = OpTypePointer Uniform %int
- %var = OpVariable %ptr_int_Uniform Uniform
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %ld = OpLoad %int %var
- OpStore %var %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SimpleUniformVariableCopied) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- OpDecorate %var Coherent
- OpDecorate %var Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_int_Uniform = OpTypePointer Uniform %int
- %var = OpVariable %ptr_int_Uniform Uniform
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %copy = OpCopyObject %ptr_int_Uniform %var
- %ld = OpLoad %int %copy
- OpStore %copy %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SimpleUniformFunctionParameterCopied) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- OpDecorate %param Coherent
- OpDecorate %param Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_int_Uniform = OpTypePointer Uniform %int
- %func_ty = OpTypeFunction %void %ptr_int_Uniform
- %func = OpFunction %void None %func_ty
- %param = OpFunctionParameter %ptr_int_Uniform
- %1 = OpLabel
- %copy = OpCopyObject %ptr_int_Uniform %param
- %ld = OpLoad %int %copy
- %copy2 = OpCopyObject %ptr_int_Uniform %param
- OpStore %copy2 %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SimpleUniformVariableAccessChain) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- OpDecorate %var Coherent
- OpDecorate %var Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %int0 = OpConstant %int 0
- %int3 = OpConstant %int 3
- %int_array_3 = OpTypeArray %int %int3
- %ptr_intarray_Uniform = OpTypePointer Uniform %int_array_3
- %ptr_int_Uniform = OpTypePointer Uniform %int
- %var = OpVariable %ptr_intarray_Uniform Uniform
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %gep = OpAccessChain %ptr_int_Uniform %var %int0
- %ld = OpLoad %int %gep
- OpStore %gep %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SimpleUniformFunctionParameterAccessChain) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- OpDecorate %param Coherent
- OpDecorate %param Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %int0 = OpConstant %int 0
- %int3 = OpConstant %int 3
- %int_array_3 = OpTypeArray %int %int3
- %ptr_intarray_Uniform = OpTypePointer Uniform %int_array_3
- %ptr_int_Uniform = OpTypePointer Uniform %int
- %func_ty = OpTypeFunction %void %ptr_intarray_Uniform
- %func = OpFunction %void None %func_ty
- %param = OpFunctionParameter %ptr_intarray_Uniform
- %1 = OpLabel
- %ld_gep = OpAccessChain %ptr_int_Uniform %param %int0
- %ld = OpLoad %int %ld_gep
- %st_gep = OpAccessChain %ptr_int_Uniform %param %int0
- OpStore %st_gep %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, VariablePointerSelect) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpCapability VariablePointers
- OpExtension "SPV_KHR_variable_pointers"
- OpMemoryModel Logical GLSL450
- OpDecorate %var Coherent
- OpDecorate %var Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %bool = OpTypeBool
- %true = OpConstantTrue %bool
- %ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int
- %null = OpConstantNull %ptr_int_StorageBuffer
- %var = OpVariable %ptr_int_StorageBuffer StorageBuffer
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %select = OpSelect %ptr_int_StorageBuffer %true %var %null
- %ld = OpLoad %int %select
- OpStore %var %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, VariablePointerSelectConservative) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpCapability VariablePointers
- OpExtension "SPV_KHR_variable_pointers"
- OpMemoryModel Logical GLSL450
- OpDecorate %var1 Coherent
- OpDecorate %var2 Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %bool = OpTypeBool
- %true = OpConstantTrue %bool
- %ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int
- %var1 = OpVariable %ptr_int_StorageBuffer StorageBuffer
- %var2 = OpVariable %ptr_int_StorageBuffer StorageBuffer
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %select = OpSelect %ptr_int_StorageBuffer %true %var1 %var2
- %ld = OpLoad %int %select
- OpStore %select %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, VariablePointerIncrement) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate {{%\w+}} Coherent
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpCapability VariablePointers
- OpExtension "SPV_KHR_variable_pointers"
- OpMemoryModel Logical GLSL450
- OpDecorate %param Coherent
- OpDecorate %ptr_int_StorageBuffer ArrayStride 4
- %void = OpTypeVoid
- %bool = OpTypeBool
- %int = OpTypeInt 32 0
- %int0 = OpConstant %int 0
- %int1 = OpConstant %int 1
- %int10 = OpConstant %int 10
- %ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int
- %func_ty = OpTypeFunction %void %ptr_int_StorageBuffer
- %func = OpFunction %void None %func_ty
- %param = OpFunctionParameter %ptr_int_StorageBuffer
- %1 = OpLabel
- OpBranch %2
- %2 = OpLabel
- %phi = OpPhi %ptr_int_StorageBuffer %param %1 %ptr_next %2
- %iv = OpPhi %int %int0 %1 %inc %2
- %inc = OpIAdd %int %iv %int1
- %ptr_next = OpPtrAccessChain %ptr_int_StorageBuffer %phi %int1
- %cmp = OpIEqual %bool %iv %int10
- OpLoopMerge %3 %2 None
- OpBranchConditional %cmp %3 %2
- %3 = OpLabel
- %ld = OpLoad %int %phi
- OpStore %phi %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, CoherentStructElement) {
- const std::string text = R"(
- ; CHECK-NOT: OpMemberDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpMemberDecorate %struct 0 Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %int0 = OpConstant %int 0
- %struct = OpTypeStruct %int
- %ptr_struct_StorageBuffer = OpTypePointer StorageBuffer %struct
- %ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int
- %func_ty = OpTypeFunction %void %ptr_struct_StorageBuffer
- %func = OpFunction %void None %func_ty
- %param = OpFunctionParameter %ptr_struct_StorageBuffer
- %1 = OpLabel
- %gep = OpAccessChain %ptr_int_StorageBuffer %param %int0
- %ld = OpLoad %int %gep
- OpStore %gep %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, CoherentElementFullStructAccess) {
- const std::string text = R"(
- ; CHECK-NOT: OpMemberDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpMemberDecorate %struct 0 Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %struct = OpTypeStruct %int
- %ptr_struct_StorageBuffer = OpTypePointer StorageBuffer %struct
- %func_ty = OpTypeFunction %void %ptr_struct_StorageBuffer
- %func = OpFunction %void None %func_ty
- %param = OpFunctionParameter %ptr_struct_StorageBuffer
- %1 = OpLabel
- %ld = OpLoad %struct %param
- OpStore %param %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, CoherentElementNotAccessed) {
- const std::string text = R"(
- ; CHECK-NOT: OpMemberDecorate
- ; CHECK-NOT: MakePointerAvailable
- ; CHECK-NOT: NonPrivatePointer
- ; CHECK-NOT: MakePointerVisible
- OpCapability Shader
- OpCapability Linkage
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpMemberDecorate %struct 1 Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %int0 = OpConstant %int 0
- %struct = OpTypeStruct %int %int
- %ptr_struct_StorageBuffer = OpTypePointer StorageBuffer %struct
- %ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int
- %func_ty = OpTypeFunction %void %ptr_struct_StorageBuffer
- %func = OpFunction %void None %func_ty
- %param = OpFunctionParameter %ptr_struct_StorageBuffer
- %1 = OpLabel
- %gep = OpAccessChain %ptr_int_StorageBuffer %param %int0
- %ld = OpLoad %int %gep
- OpStore %gep %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, MultiIndexAccessCoherent) {
- const std::string text = R"(
- ; CHECK-NOT: OpMemberDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpMemberDecorate %inner 1 Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %int0 = OpConstant %int 0
- %int1 = OpConstant %int 1
- %inner = OpTypeStruct %int %int
- %middle = OpTypeStruct %inner
- %outer = OpTypeStruct %middle %middle
- %ptr_outer_StorageBuffer = OpTypePointer StorageBuffer %outer
- %ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int
- %func_ty = OpTypeFunction %void %ptr_outer_StorageBuffer
- %func = OpFunction %void None %func_ty
- %param = OpFunctionParameter %ptr_outer_StorageBuffer
- %1 = OpLabel
- %ld_gep = OpInBoundsAccessChain %ptr_int_StorageBuffer %param %int0 %int0 %int1
- %ld = OpLoad %int %ld_gep
- %st_gep = OpInBoundsAccessChain %ptr_int_StorageBuffer %param %int1 %int0 %int1
- OpStore %st_gep %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, MultiIndexAccessNonCoherent) {
- const std::string text = R"(
- ; CHECK-NOT: OpMemberDecorate
- ; CHECK-NOT: MakePointerAvailable
- ; CHECK-NOT: NonPrivatePointer
- ; CHECK-NOT: MakePointerVisible
- OpCapability Shader
- OpCapability Linkage
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpMemberDecorate %inner 1 Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %int0 = OpConstant %int 0
- %int1 = OpConstant %int 1
- %inner = OpTypeStruct %int %int
- %middle = OpTypeStruct %inner
- %outer = OpTypeStruct %middle %middle
- %ptr_outer_StorageBuffer = OpTypePointer StorageBuffer %outer
- %ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int
- %func_ty = OpTypeFunction %void %ptr_outer_StorageBuffer
- %func = OpFunction %void None %func_ty
- %param = OpFunctionParameter %ptr_outer_StorageBuffer
- %1 = OpLabel
- %ld_gep = OpInBoundsAccessChain %ptr_int_StorageBuffer %param %int0 %int0 %int0
- %ld = OpLoad %int %ld_gep
- %st_gep = OpInBoundsAccessChain %ptr_int_StorageBuffer %param %int1 %int0 %int0
- OpStore %st_gep %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, ConsecutiveAccessChainCoherent) {
- const std::string text = R"(
- ; CHECK-NOT: OpMemberDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpMemberDecorate %inner 1 Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %int0 = OpConstant %int 0
- %int1 = OpConstant %int 1
- %inner = OpTypeStruct %int %int
- %middle = OpTypeStruct %inner
- %outer = OpTypeStruct %middle %middle
- %ptr_outer_StorageBuffer = OpTypePointer StorageBuffer %outer
- %ptr_middle_StorageBuffer = OpTypePointer StorageBuffer %middle
- %ptr_inner_StorageBuffer = OpTypePointer StorageBuffer %inner
- %ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int
- %func_ty = OpTypeFunction %void %ptr_outer_StorageBuffer
- %func = OpFunction %void None %func_ty
- %param = OpFunctionParameter %ptr_outer_StorageBuffer
- %1 = OpLabel
- %ld_gep1 = OpInBoundsAccessChain %ptr_middle_StorageBuffer %param %int0
- %ld_gep2 = OpInBoundsAccessChain %ptr_inner_StorageBuffer %ld_gep1 %int0
- %ld_gep3 = OpInBoundsAccessChain %ptr_int_StorageBuffer %ld_gep2 %int1
- %ld = OpLoad %int %ld_gep3
- %st_gep1 = OpInBoundsAccessChain %ptr_middle_StorageBuffer %param %int1
- %st_gep2 = OpInBoundsAccessChain %ptr_inner_StorageBuffer %st_gep1 %int0
- %st_gep3 = OpInBoundsAccessChain %ptr_int_StorageBuffer %st_gep2 %int1
- OpStore %st_gep3 %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, ConsecutiveAccessChainNonCoherent) {
- const std::string text = R"(
- ; CHECK-NOT: OpMemberDecorate
- ; CHECK-NOT: MakePointerAvailable
- ; CHECK-NOT: NonPrivatePointer
- ; CHECK-NOT: MakePointerVisible
- OpCapability Shader
- OpCapability Linkage
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpMemberDecorate %inner 1 Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %int0 = OpConstant %int 0
- %int1 = OpConstant %int 1
- %inner = OpTypeStruct %int %int
- %middle = OpTypeStruct %inner
- %outer = OpTypeStruct %middle %middle
- %ptr_outer_StorageBuffer = OpTypePointer StorageBuffer %outer
- %ptr_middle_StorageBuffer = OpTypePointer StorageBuffer %middle
- %ptr_inner_StorageBuffer = OpTypePointer StorageBuffer %inner
- %ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int
- %func_ty = OpTypeFunction %void %ptr_outer_StorageBuffer
- %func = OpFunction %void None %func_ty
- %param = OpFunctionParameter %ptr_outer_StorageBuffer
- %1 = OpLabel
- %ld_gep1 = OpInBoundsAccessChain %ptr_middle_StorageBuffer %param %int0
- %ld_gep2 = OpInBoundsAccessChain %ptr_inner_StorageBuffer %ld_gep1 %int0
- %ld_gep3 = OpInBoundsAccessChain %ptr_int_StorageBuffer %ld_gep2 %int0
- %ld = OpLoad %int %ld_gep3
- %st_gep1 = OpInBoundsAccessChain %ptr_middle_StorageBuffer %param %int1
- %st_gep2 = OpInBoundsAccessChain %ptr_inner_StorageBuffer %st_gep1 %int0
- %st_gep3 = OpInBoundsAccessChain %ptr_int_StorageBuffer %st_gep2 %int0
- OpStore %st_gep3 %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, CoherentStructElementAccess) {
- const std::string text = R"(
- ; CHECK-NOT: OpMemberDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpMemberDecorate %middle 0 Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %int0 = OpConstant %int 0
- %int1 = OpConstant %int 1
- %inner = OpTypeStruct %int %int
- %middle = OpTypeStruct %inner
- %outer = OpTypeStruct %middle %middle
- %ptr_outer_StorageBuffer = OpTypePointer StorageBuffer %outer
- %ptr_middle_StorageBuffer = OpTypePointer StorageBuffer %middle
- %ptr_inner_StorageBuffer = OpTypePointer StorageBuffer %inner
- %ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int
- %func_ty = OpTypeFunction %void %ptr_outer_StorageBuffer
- %func = OpFunction %void None %func_ty
- %param = OpFunctionParameter %ptr_outer_StorageBuffer
- %1 = OpLabel
- %ld_gep1 = OpInBoundsAccessChain %ptr_middle_StorageBuffer %param %int0
- %ld_gep2 = OpInBoundsAccessChain %ptr_inner_StorageBuffer %ld_gep1 %int0
- %ld_gep3 = OpInBoundsAccessChain %ptr_int_StorageBuffer %ld_gep2 %int1
- %ld = OpLoad %int %ld_gep3
- %st_gep1 = OpInBoundsAccessChain %ptr_middle_StorageBuffer %param %int1
- %st_gep2 = OpInBoundsAccessChain %ptr_inner_StorageBuffer %st_gep1 %int0
- %st_gep3 = OpInBoundsAccessChain %ptr_int_StorageBuffer %st_gep2 %int1
- OpStore %st_gep3 %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, NonCoherentLoadCoherentStore) {
- const std::string text = R"(
- ; CHECK-NOT: OpMemberDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK-NOT: MakePointerVisible
- ; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpMemberDecorate %outer 1 Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %int0 = OpConstant %int 0
- %int1 = OpConstant %int 1
- %inner = OpTypeStruct %int %int
- %middle = OpTypeStruct %inner
- %outer = OpTypeStruct %middle %middle
- %ptr_outer_StorageBuffer = OpTypePointer StorageBuffer %outer
- %ptr_middle_StorageBuffer = OpTypePointer StorageBuffer %middle
- %ptr_inner_StorageBuffer = OpTypePointer StorageBuffer %inner
- %ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int
- %func_ty = OpTypeFunction %void %ptr_outer_StorageBuffer
- %func = OpFunction %void None %func_ty
- %param = OpFunctionParameter %ptr_outer_StorageBuffer
- %1 = OpLabel
- %ld_gep1 = OpInBoundsAccessChain %ptr_middle_StorageBuffer %param %int0
- %ld_gep2 = OpInBoundsAccessChain %ptr_inner_StorageBuffer %ld_gep1 %int0
- %ld_gep3 = OpInBoundsAccessChain %ptr_int_StorageBuffer %ld_gep2 %int1
- %ld = OpLoad %int %ld_gep3
- %st_gep1 = OpInBoundsAccessChain %ptr_middle_StorageBuffer %param %int1
- %st_gep2 = OpInBoundsAccessChain %ptr_inner_StorageBuffer %st_gep1 %int0
- %st_gep3 = OpInBoundsAccessChain %ptr_int_StorageBuffer %st_gep2 %int1
- OpStore %st_gep3 %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, CopyMemory) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: [[queuefamily:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Volatile|MakePointerVisible|NonPrivatePointer [[queuefamily]]
- ; CHECK-NOT: [[queuefamily]]
- OpCapability Shader
- OpCapability Linkage
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpDecorate %in_var Coherent
- OpDecorate %out_var Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int
- %in_var = OpVariable %ptr_int_StorageBuffer StorageBuffer
- %out_var = OpVariable %ptr_int_StorageBuffer StorageBuffer
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- OpCopyMemory %out_var %in_var
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, CopyMemorySized) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: [[queuefamily:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpCopyMemorySized {{%\w+}} {{%\w+}} {{%\w+}} Volatile|MakePointerAvailable|NonPrivatePointer [[queuefamily]]
- ; CHECK-NOT: [[queuefamily]]
- OpCapability Shader
- OpCapability Linkage
- OpCapability Addresses
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpDecorate %out_param Coherent
- OpDecorate %in_param Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %int4 = OpConstant %int 4
- %ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int
- %func_ty = OpTypeFunction %void %ptr_int_StorageBuffer %ptr_int_StorageBuffer
- %func = OpFunction %void None %func_ty
- %in_param = OpFunctionParameter %ptr_int_StorageBuffer
- %out_param = OpFunctionParameter %ptr_int_StorageBuffer
- %1 = OpLabel
- OpCopyMemorySized %out_param %in_param %int4
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, CopyMemoryTwoScopes) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK-DAG: [[queuefamily:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK-DAG: [[workgroup:%\w+]] = OpConstant {{%\w+}} 2
- ; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} MakePointerAvailable|MakePointerVisible|NonPrivatePointer [[workgroup]] [[queuefamily]]
- OpCapability Shader
- OpCapability Linkage
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpDecorate %in_var Coherent
- OpDecorate %out_var Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_int_Workgroup = OpTypePointer Workgroup %int
- %ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int
- %in_var = OpVariable %ptr_int_StorageBuffer StorageBuffer
- %out_var = OpVariable %ptr_int_Workgroup Workgroup
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- OpCopyMemory %out_var %in_var
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, VolatileImageRead) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile
- ; CHECK: OpImageRead {{%\w+}} {{%\w+}} {{%\w+}} VolatileTexel
- OpCapability Shader
- OpCapability Linkage
- OpCapability StorageImageReadWithoutFormat
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpDecorate %var Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %v2int = OpTypeVector %int 2
- %float = OpTypeFloat 32
- %int0 = OpConstant %int 0
- %v2int_0 = OpConstantComposite %v2int %int0 %int0
- %image = OpTypeImage %float 2D 0 0 0 2 Unknown
- %ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image
- %var = OpVariable %ptr_image_StorageBuffer StorageBuffer
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %ld = OpLoad %image %var
- %rd = OpImageRead %float %ld %v2int_0
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, CoherentImageRead) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpImageRead {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelVisible|NonPrivateTexel [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpCapability StorageImageReadWithoutFormat
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpDecorate %var Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %v2int = OpTypeVector %int 2
- %float = OpTypeFloat 32
- %int0 = OpConstant %int 0
- %v2int_0 = OpConstantComposite %v2int %int0 %int0
- %image = OpTypeImage %float 2D 0 0 0 2 Unknown
- %ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image
- %var = OpVariable %ptr_image_StorageBuffer StorageBuffer
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %ld = OpLoad %image %var
- %rd = OpImageRead %float %ld %v2int_0
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, CoherentImageReadExtractedFromSampledImage) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: [[image:%\w+]] = OpTypeImage
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad [[image]] {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK-NOT: NonPrivatePointer
- ; CHECK: OpImageRead {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelVisible|NonPrivateTexel [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpCapability StorageImageReadWithoutFormat
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpDecorate %var Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %v2int = OpTypeVector %int 2
- %float = OpTypeFloat 32
- %int0 = OpConstant %int 0
- %v2int_0 = OpConstantComposite %v2int %int0 %int0
- %image = OpTypeImage %float 2D 0 0 0 0 Unknown
- %sampled_image = OpTypeSampledImage %image
- %sampler = OpTypeSampler
- %ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image
- %ptr_sampler_StorageBuffer = OpTypePointer StorageBuffer %sampler
- %var = OpVariable %ptr_image_StorageBuffer StorageBuffer
- %sampler_var = OpVariable %ptr_sampler_StorageBuffer StorageBuffer
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %ld = OpLoad %image %var
- %ld_sampler = OpLoad %sampler %sampler_var
- %sample = OpSampledImage %sampled_image %ld %ld_sampler
- %extract = OpImage %image %sample
- %rd = OpImageRead %float %extract %v2int_0
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, VolatileImageWrite) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile
- ; CHECK: OpImageWrite {{%\w+}} {{%\w+}} {{%\w+}} VolatileTexel
- OpCapability Shader
- OpCapability Linkage
- OpCapability StorageImageWriteWithoutFormat
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpDecorate %param Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %v2int = OpTypeVector %int 2
- %float = OpTypeFloat 32
- %float0 = OpConstant %float 0
- %v2int_null = OpConstantNull %v2int
- %image = OpTypeImage %float 2D 0 0 0 0 Unknown
- %ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image
- %func_ty = OpTypeFunction %void %ptr_image_StorageBuffer
- %func = OpFunction %void None %func_ty
- %param = OpFunctionParameter %ptr_image_StorageBuffer
- %1 = OpLabel
- %ld = OpLoad %image %param
- OpImageWrite %ld %v2int_null %float0
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, CoherentImageWrite) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer
- ; CHECK: OpImageWrite {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelAvailable|NonPrivateTexel [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpCapability StorageImageWriteWithoutFormat
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpDecorate %param Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %v2int = OpTypeVector %int 2
- %float = OpTypeFloat 32
- %float0 = OpConstant %float 0
- %v2int_null = OpConstantNull %v2int
- %image = OpTypeImage %float 2D 0 0 0 0 Unknown
- %ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image
- %func_ty = OpTypeFunction %void %ptr_image_StorageBuffer
- %func = OpFunction %void None %func_ty
- %param = OpFunctionParameter %ptr_image_StorageBuffer
- %1 = OpLabel
- %ld = OpLoad %image %param
- OpImageWrite %ld %v2int_null %float0
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, CoherentImageWriteExtractFromSampledImage) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer
- ; CHECK-NOT: NonPrivatePointer
- ; CHECK: OpImageWrite {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelAvailable|NonPrivateTexel [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpCapability StorageImageWriteWithoutFormat
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpDecorate %param Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %v2int = OpTypeVector %int 2
- %float = OpTypeFloat 32
- %float0 = OpConstant %float 0
- %v2int_null = OpConstantNull %v2int
- %image = OpTypeImage %float 2D 0 0 0 0 Unknown
- %sampled_image = OpTypeSampledImage %image
- %sampler = OpTypeSampler
- %ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image
- %ptr_sampler_StorageBuffer = OpTypePointer StorageBuffer %sampler
- %func_ty = OpTypeFunction %void %ptr_image_StorageBuffer %ptr_sampler_StorageBuffer
- %func = OpFunction %void None %func_ty
- %param = OpFunctionParameter %ptr_image_StorageBuffer
- %sampler_param = OpFunctionParameter %ptr_sampler_StorageBuffer
- %1 = OpLabel
- %ld = OpLoad %image %param
- %ld_sampler = OpLoad %sampler %sampler_param
- %sample = OpSampledImage %sampled_image %ld %ld_sampler
- %extract = OpImage %image %sample
- OpImageWrite %extract %v2int_null %float0
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, VolatileImageSparseRead) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile
- ; CHECK: OpImageSparseRead {{%\w+}} {{%\w+}} {{%\w+}} VolatileTexel
- OpCapability Shader
- OpCapability Linkage
- OpCapability StorageImageReadWithoutFormat
- OpCapability SparseResidency
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpDecorate %var Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %v2int = OpTypeVector %int 2
- %float = OpTypeFloat 32
- %int0 = OpConstant %int 0
- %v2int_0 = OpConstantComposite %v2int %int0 %int0
- %image = OpTypeImage %float 2D 0 0 0 2 Unknown
- %struct = OpTypeStruct %int %float
- %ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image
- %var = OpVariable %ptr_image_StorageBuffer StorageBuffer
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %ld = OpLoad %image %var
- %rd = OpImageSparseRead %struct %ld %v2int_0
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, CoherentImageSparseRead) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK: OpImageSparseRead {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelVisible|NonPrivateTexel [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpCapability StorageImageReadWithoutFormat
- OpCapability SparseResidency
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpDecorate %var Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %v2int = OpTypeVector %int 2
- %float = OpTypeFloat 32
- %int0 = OpConstant %int 0
- %v2int_0 = OpConstantComposite %v2int %int0 %int0
- %image = OpTypeImage %float 2D 0 0 0 2 Unknown
- %struct = OpTypeStruct %int %float
- %ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image
- %var = OpVariable %ptr_image_StorageBuffer StorageBuffer
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %ld = OpLoad %image %var
- %rd = OpImageSparseRead %struct %ld %v2int_0
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest,
- CoherentImageSparseReadExtractedFromSampledImage) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate
- ; CHECK: [[image:%\w+]] = OpTypeImage
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpLoad [[image]] {{%\w+}} MakePointerVisible|NonPrivatePointer [[scope]]
- ; CHECK-NOT: NonPrivatePointer
- ; CHECK: OpImageSparseRead {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelVisible|NonPrivateTexel [[scope]]
- OpCapability Shader
- OpCapability Linkage
- OpCapability StorageImageReadWithoutFormat
- OpCapability SparseResidency
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpDecorate %var Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %v2int = OpTypeVector %int 2
- %float = OpTypeFloat 32
- %int0 = OpConstant %int 0
- %v2int_0 = OpConstantComposite %v2int %int0 %int0
- %image = OpTypeImage %float 2D 0 0 0 0 Unknown
- %struct = OpTypeStruct %int %float
- %sampled_image = OpTypeSampledImage %image
- %sampler = OpTypeSampler
- %ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image
- %ptr_sampler_StorageBuffer = OpTypePointer StorageBuffer %sampler
- %var = OpVariable %ptr_image_StorageBuffer StorageBuffer
- %sampler_var = OpVariable %ptr_sampler_StorageBuffer StorageBuffer
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %ld = OpLoad %image %var
- %ld_sampler = OpLoad %sampler %sampler_var
- %sample = OpSampledImage %sampled_image %ld %ld_sampler
- %extract = OpImage %image %sample
- %rd = OpImageSparseRead %struct %extract %v2int_0
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, TessellationControlBarrierNoChange) {
- const std::string text = R"(
- ; CHECK: [[none:%\w+]] = OpConstant {{%\w+}} 0
- ; CHECK: [[workgroup:%\w+]] = OpConstant {{%\w+}} 2
- ; CHECK: OpControlBarrier [[workgroup]] [[workgroup]] [[none]]
- OpCapability Tessellation
- OpMemoryModel Logical GLSL450
- OpEntryPoint TessellationControl %func "func"
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %none = OpConstant %int 0
- %workgroup = OpConstant %int 2
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- OpControlBarrier %workgroup %workgroup %none
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, TessellationControlBarrierAddOutput) {
- const std::string text = R"(
- ; CHECK: [[workgroup:%\w+]] = OpConstant {{%\w+}} 2
- ; CHECK: [[output:%\w+]] = OpConstant {{%\w+}} 4096
- ; CHECK: OpControlBarrier [[workgroup]] [[workgroup]] [[output]]
- OpCapability Tessellation
- OpMemoryModel Logical GLSL450
- OpEntryPoint TessellationControl %func "func" %var
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %none = OpConstant %int 0
- %workgroup = OpConstant %int 2
- %ptr_int_Output = OpTypePointer Output %int
- %var = OpVariable %ptr_int_Output Output
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %ld = OpLoad %int %var
- OpControlBarrier %workgroup %workgroup %none
- OpStore %var %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, TessellationMemoryBarrierNoChange) {
- const std::string text = R"(
- ; CHECK: [[none:%\w+]] = OpConstant {{%\w+}} 0
- ; CHECK: [[workgroup:%\w+]] = OpConstant {{%\w+}} 2
- ; CHECK: OpMemoryBarrier [[workgroup]] [[none]]
- OpCapability Tessellation
- OpMemoryModel Logical GLSL450
- OpEntryPoint TessellationControl %func "func" %var
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %none = OpConstant %int 0
- %workgroup = OpConstant %int 2
- %ptr_int_Output = OpTypePointer Output %int
- %var = OpVariable %ptr_int_Output Output
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %ld = OpLoad %int %var
- OpMemoryBarrier %workgroup %none
- OpStore %var %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, TessellationControlBarrierAddOutputSubFunction) {
- const std::string text = R"(
- ; CHECK: [[workgroup:%\w+]] = OpConstant {{%\w+}} 2
- ; CHECK: [[output:%\w+]] = OpConstant {{%\w+}} 4096
- ; CHECK: OpControlBarrier [[workgroup]] [[workgroup]] [[output]]
- OpCapability Tessellation
- OpMemoryModel Logical GLSL450
- OpEntryPoint TessellationControl %func "func" %var
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %none = OpConstant %int 0
- %workgroup = OpConstant %int 2
- %ptr_int_Output = OpTypePointer Output %int
- %var = OpVariable %ptr_int_Output Output
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %call = OpFunctionCall %void %sub_func
- OpReturn
- OpFunctionEnd
- %sub_func = OpFunction %void None %func_ty
- %2 = OpLabel
- %ld = OpLoad %int %var
- OpControlBarrier %workgroup %workgroup %none
- OpStore %var %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest,
- TessellationControlBarrierAddOutputDifferentFunctions) {
- const std::string text = R"(
- ; CHECK: [[workgroup:%\w+]] = OpConstant {{%\w+}} 2
- ; CHECK: [[output:%\w+]] = OpConstant {{%\w+}} 4096
- ; CHECK: OpControlBarrier [[workgroup]] [[workgroup]] [[output]]
- OpCapability Tessellation
- OpMemoryModel Logical GLSL450
- OpEntryPoint TessellationControl %func "func" %var
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %none = OpConstant %int 0
- %workgroup = OpConstant %int 2
- %ptr_int_Output = OpTypePointer Output %int
- %var = OpVariable %ptr_int_Output Output
- %func_ty = OpTypeFunction %void
- %ld_func_ty = OpTypeFunction %int
- %st_func_ty = OpTypeFunction %void %int
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %call_ld = OpFunctionCall %int %ld_func
- %call_barrier = OpFunctionCall %void %barrier_func
- %call_st = OpFunctionCall %void %st_func %call_ld
- OpReturn
- OpFunctionEnd
- %ld_func = OpFunction %int None %ld_func_ty
- %2 = OpLabel
- %ld = OpLoad %int %var
- OpReturnValue %ld
- OpFunctionEnd
- %barrier_func = OpFunction %void None %func_ty
- %3 = OpLabel
- OpControlBarrier %workgroup %workgroup %none
- OpReturn
- OpFunctionEnd
- %st_func = OpFunction %void None %st_func_ty
- %param = OpFunctionParameter %int
- %4 = OpLabel
- OpStore %var %param
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, ChangeControlBarrierMemoryScope) {
- std::string text = R"(
- ; CHECK: [[workgroup:%\w+]] = OpConstant {{%\w+}} 2
- ; CHECK: [[queuefamily:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpControlBarrier [[workgroup]] [[queuefamily]]
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %func "func"
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %none = OpConstant %int 0
- %device = OpConstant %int 1
- %workgroup = OpConstant %int 2
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- OpControlBarrier %workgroup %device %none
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, ChangeMemoryBarrierMemoryScope) {
- std::string text = R"(
- ; CHECK: [[queuefamily:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpMemoryBarrier [[queuefamily]]
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %func "func"
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %none = OpConstant %int 0
- %device = OpConstant %int 1
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- OpMemoryBarrier %device %none
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, ChangeAtomicMemoryScope) {
- std::string text = R"(
- ; CHECK: [[int:%\w+]] = OpTypeInt
- ; CHECK: [[var:%\w+]] = OpVariable
- ; CHECK: [[qf:%\w+]] = OpConstant [[int]] 5
- ; CHECK: OpAtomicLoad [[int]] [[var]] [[qf]]
- ; CHECK: OpAtomicStore [[var]] [[qf]]
- ; CHECK: OpAtomicExchange [[int]] [[var]] [[qf]]
- ; CHECK: OpAtomicCompareExchange [[int]] [[var]] [[qf]]
- ; CHECK: OpAtomicIIncrement [[int]] [[var]] [[qf]]
- ; CHECK: OpAtomicIDecrement [[int]] [[var]] [[qf]]
- ; CHECK: OpAtomicIAdd [[int]] [[var]] [[qf]]
- ; CHECK: OpAtomicISub [[int]] [[var]] [[qf]]
- ; CHECK: OpAtomicSMin [[int]] [[var]] [[qf]]
- ; CHECK: OpAtomicSMax [[int]] [[var]] [[qf]]
- ; CHECK: OpAtomicUMin [[int]] [[var]] [[qf]]
- ; CHECK: OpAtomicUMax [[int]] [[var]] [[qf]]
- ; CHECK: OpAtomicAnd [[int]] [[var]] [[qf]]
- ; CHECK: OpAtomicOr [[int]] [[var]] [[qf]]
- ; CHECK: OpAtomicXor [[int]] [[var]] [[qf]]
- OpCapability Shader
- OpExtension "SPV_KHR_storage_buffer_storage_class"
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %func "func"
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %none = OpConstant %int 0
- %device = OpConstant %int 1
- %func_ty = OpTypeFunction %void
- %ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int
- %var = OpVariable %ptr_int_StorageBuffer StorageBuffer
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %ld = OpAtomicLoad %int %var %device %none
- OpAtomicStore %var %device %none %ld
- %ex = OpAtomicExchange %int %var %device %none %ld
- %cmp_ex = OpAtomicCompareExchange %int %var %device %none %none %ld %ld
- %inc = OpAtomicIIncrement %int %var %device %none
- %dec = OpAtomicIDecrement %int %var %device %none
- %add = OpAtomicIAdd %int %var %device %none %ld
- %sub = OpAtomicISub %int %var %device %none %ld
- %smin = OpAtomicSMin %int %var %device %none %ld
- %smax = OpAtomicSMax %int %var %device %none %ld
- %umin = OpAtomicUMin %int %var %device %none %ld
- %umax = OpAtomicUMax %int %var %device %none %ld
- %and = OpAtomicAnd %int %var %device %none %ld
- %or = OpAtomicOr %int %var %device %none %ld
- %xor = OpAtomicXor %int %var %device %none %ld
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, UpgradeModfNoFlags) {
- const std::string text = R"(
- ; CHECK: [[float:%\w+]] = OpTypeFloat 32
- ; CHECK: [[float_0:%\w+]] = OpConstant [[float]] 0
- ; CHECK: [[ptr:%\w+]] = OpTypePointer StorageBuffer [[float]]
- ; CHECK: [[var:%\w+]] = OpVariable [[ptr]] StorageBuffer
- ; CHECK: [[struct:%\w+]] = OpTypeStruct [[float]] [[float]]
- ; CHECK: [[modfstruct:%\w+]] = OpExtInst [[struct]] {{%\w+}} ModfStruct [[float_0]]
- ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
- ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 1
- ; CHECK: OpStore [[var]] [[ex1]]
- ; CHECK-NOT: NonPrivatePointer
- ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- %import = OpExtInstImport "GLSL.std.450"
- OpEntryPoint GLCompute %func "func"
- %void = OpTypeVoid
- %float = OpTypeFloat 32
- %float_0 = OpConstant %float 0
- %ptr_ssbo_float = OpTypePointer StorageBuffer %float
- %ssbo_var = OpVariable %ptr_ssbo_float StorageBuffer
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %2 = OpExtInst %float %import Modf %float_0 %ssbo_var
- %3 = OpFAdd %float %float_0 %2
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, UpgradeModfWorkgroupCoherent) {
- const std::string text = R"(
- ; CHECK: [[float:%\w+]] = OpTypeFloat 32
- ; CHECK: [[float_0:%\w+]] = OpConstant [[float]] 0
- ; CHECK: [[ptr:%\w+]] = OpTypePointer Workgroup [[float]]
- ; CHECK: [[var:%\w+]] = OpVariable [[ptr]] Workgroup
- ; CHECK: [[struct:%\w+]] = OpTypeStruct [[float]] [[float]]
- ; CHECK: [[wg_scope:%\w+]] = OpConstant {{%\w+}} 2
- ; CHECK: [[modfstruct:%\w+]] = OpExtInst [[struct]] {{%\w+}} ModfStruct [[float_0]]
- ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
- ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 1
- ; CHECK: OpStore [[var]] [[ex1]] MakePointerAvailable|NonPrivatePointer [[wg_scope]]
- ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- %import = OpExtInstImport "GLSL.std.450"
- OpEntryPoint GLCompute %func "func"
- OpDecorate %wg_var Coherent
- %void = OpTypeVoid
- %float = OpTypeFloat 32
- %float_0 = OpConstant %float 0
- %ptr_wg_float = OpTypePointer Workgroup %float
- %wg_var = OpVariable %ptr_wg_float Workgroup
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %2 = OpExtInst %float %import Modf %float_0 %wg_var
- %3 = OpFAdd %float %float_0 %2
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, UpgradeModfSSBOCoherent) {
- const std::string text = R"(
- ; CHECK: [[float:%\w+]] = OpTypeFloat 32
- ; CHECK: [[float_0:%\w+]] = OpConstant [[float]] 0
- ; CHECK: [[ptr:%\w+]] = OpTypePointer StorageBuffer [[float]]
- ; CHECK: [[var:%\w+]] = OpVariable [[ptr]] StorageBuffer
- ; CHECK: [[struct:%\w+]] = OpTypeStruct [[float]] [[float]]
- ; CHECK: [[qf_scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: [[modfstruct:%\w+]] = OpExtInst [[struct]] {{%\w+}} ModfStruct [[float_0]]
- ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
- ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 1
- ; CHECK: OpStore [[var]] [[ex1]] MakePointerAvailable|NonPrivatePointer [[qf_scope]]
- ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- %import = OpExtInstImport "GLSL.std.450"
- OpEntryPoint GLCompute %func "func"
- OpDecorate %ssbo_var Coherent
- %void = OpTypeVoid
- %float = OpTypeFloat 32
- %float_0 = OpConstant %float 0
- %ptr_ssbo_float = OpTypePointer StorageBuffer %float
- %ssbo_var = OpVariable %ptr_ssbo_float StorageBuffer
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %2 = OpExtInst %float %import Modf %float_0 %ssbo_var
- %3 = OpFAdd %float %float_0 %2
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, UpgradeModfSSBOVolatile) {
- const std::string text = R"(
- ; CHECK: [[float:%\w+]] = OpTypeFloat 32
- ; CHECK: [[float_0:%\w+]] = OpConstant [[float]] 0
- ; CHECK: [[ptr:%\w+]] = OpTypePointer StorageBuffer [[float]]
- ; CHECK: [[var:%\w+]] = OpVariable [[ptr]] StorageBuffer
- ; CHECK: [[struct:%\w+]] = OpTypeStruct [[float]] [[float]]
- ; CHECK: [[modfstruct:%\w+]] = OpExtInst [[struct]] {{%\w+}} ModfStruct [[float_0]]
- ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
- ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 1
- ; CHECK: OpStore [[var]] [[ex1]] Volatile
- ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- %import = OpExtInstImport "GLSL.std.450"
- OpEntryPoint GLCompute %func "func"
- OpDecorate %wg_var Volatile
- %void = OpTypeVoid
- %float = OpTypeFloat 32
- %float_0 = OpConstant %float 0
- %ptr_ssbo_float = OpTypePointer StorageBuffer %float
- %wg_var = OpVariable %ptr_ssbo_float StorageBuffer
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %2 = OpExtInst %float %import Modf %float_0 %wg_var
- %3 = OpFAdd %float %float_0 %2
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, UpgradeFrexpNoFlags) {
- const std::string text = R"(
- ; CHECK: [[float:%\w+]] = OpTypeFloat 32
- ; CHECK: [[float_0:%\w+]] = OpConstant [[float]] 0
- ; CHECK: [[int:%\w+]] = OpTypeInt 32 0
- ; CHECK: [[ptr:%\w+]] = OpTypePointer StorageBuffer [[int]]
- ; CHECK: [[var:%\w+]] = OpVariable [[ptr]] StorageBuffer
- ; CHECK: [[struct:%\w+]] = OpTypeStruct [[float]] [[int]]
- ; CHECK: [[modfstruct:%\w+]] = OpExtInst [[struct]] {{%\w+}} FrexpStruct [[float_0]]
- ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
- ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[int]] [[modfstruct]] 1
- ; CHECK: OpStore [[var]] [[ex1]]
- ; CHECK-NOT: NonPrivatePointer
- ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- %import = OpExtInstImport "GLSL.std.450"
- OpEntryPoint GLCompute %func "func"
- %void = OpTypeVoid
- %float = OpTypeFloat 32
- %float_0 = OpConstant %float 0
- %int = OpTypeInt 32 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %ssbo_var = OpVariable %ptr_ssbo_int StorageBuffer
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %2 = OpExtInst %float %import Frexp %float_0 %ssbo_var
- %3 = OpFAdd %float %float_0 %2
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, UpgradeFrexpWorkgroupCoherent) {
- const std::string text = R"(
- ; CHECK: [[float:%\w+]] = OpTypeFloat 32
- ; CHECK: [[float_0:%\w+]] = OpConstant [[float]] 0
- ; CHECK: [[int:%\w+]] = OpTypeInt 32 0
- ; CHECK: [[ptr:%\w+]] = OpTypePointer Workgroup [[int]]
- ; CHECK: [[var:%\w+]] = OpVariable [[ptr]] Workgroup
- ; CHECK: [[struct:%\w+]] = OpTypeStruct [[float]] [[int]]
- ; CHECK: [[wg_scope:%\w+]] = OpConstant {{%\w+}} 2
- ; CHECK: [[modfstruct:%\w+]] = OpExtInst [[struct]] {{%\w+}} FrexpStruct [[float_0]]
- ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
- ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[int]] [[modfstruct]] 1
- ; CHECK: OpStore [[var]] [[ex1]] MakePointerAvailable|NonPrivatePointer [[wg_scope]]
- ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- %import = OpExtInstImport "GLSL.std.450"
- OpEntryPoint GLCompute %func "func"
- OpDecorate %wg_var Coherent
- %void = OpTypeVoid
- %float = OpTypeFloat 32
- %float_0 = OpConstant %float 0
- %int = OpTypeInt 32 0
- %ptr_wg_int = OpTypePointer Workgroup %int
- %wg_var = OpVariable %ptr_wg_int Workgroup
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %2 = OpExtInst %float %import Frexp %float_0 %wg_var
- %3 = OpFAdd %float %float_0 %2
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, UpgradeFrexpSSBOCoherent) {
- const std::string text = R"(
- ; CHECK: [[float:%\w+]] = OpTypeFloat 32
- ; CHECK: [[float_0:%\w+]] = OpConstant [[float]] 0
- ; CHECK: [[int:%\w+]] = OpTypeInt 32 0
- ; CHECK: [[ptr:%\w+]] = OpTypePointer StorageBuffer [[int]]
- ; CHECK: [[var:%\w+]] = OpVariable [[ptr]] StorageBuffer
- ; CHECK: [[struct:%\w+]] = OpTypeStruct [[float]] [[int]]
- ; CHECK: [[qf_scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: [[modfstruct:%\w+]] = OpExtInst [[struct]] {{%\w+}} FrexpStruct [[float_0]]
- ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
- ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[int]] [[modfstruct]] 1
- ; CHECK: OpStore [[var]] [[ex1]] MakePointerAvailable|NonPrivatePointer [[qf_scope]]
- ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- %import = OpExtInstImport "GLSL.std.450"
- OpEntryPoint GLCompute %func "func"
- OpDecorate %ssbo_var Coherent
- %void = OpTypeVoid
- %float = OpTypeFloat 32
- %float_0 = OpConstant %float 0
- %int = OpTypeInt 32 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %ssbo_var = OpVariable %ptr_ssbo_int StorageBuffer
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %2 = OpExtInst %float %import Frexp %float_0 %ssbo_var
- %3 = OpFAdd %float %float_0 %2
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, UpgradeFrexpSSBOVolatile) {
- const std::string text = R"(
- ; CHECK: [[float:%\w+]] = OpTypeFloat 32
- ; CHECK: [[float_0:%\w+]] = OpConstant [[float]] 0
- ; CHECK: [[int:%\w+]] = OpTypeInt 32 0
- ; CHECK: [[ptr:%\w+]] = OpTypePointer StorageBuffer [[int]]
- ; CHECK: [[var:%\w+]] = OpVariable [[ptr]] StorageBuffer
- ; CHECK: [[struct:%\w+]] = OpTypeStruct [[float]] [[int]]
- ; CHECK: [[modfstruct:%\w+]] = OpExtInst [[struct]] {{%\w+}} FrexpStruct [[float_0]]
- ; CHECK: [[ex0:%\w+]] = OpCompositeExtract [[float]] [[modfstruct]] 0
- ; CHECK: [[ex1:%\w+]] = OpCompositeExtract [[int]] [[modfstruct]] 1
- ; CHECK: OpStore [[var]] [[ex1]] Volatile
- ; CHECK: OpFAdd [[float]] [[float_0]] [[ex0]]
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- %import = OpExtInstImport "GLSL.std.450"
- OpEntryPoint GLCompute %func "func"
- OpDecorate %wg_var Volatile
- %void = OpTypeVoid
- %float = OpTypeFloat 32
- %float_0 = OpConstant %float 0
- %int = OpTypeInt 32 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %wg_var = OpVariable %ptr_ssbo_int StorageBuffer
- %func_ty = OpTypeFunction %void
- %func = OpFunction %void None %func_ty
- %1 = OpLabel
- %2 = OpExtInst %float %import Frexp %float_0 %wg_var
- %3 = OpFAdd %float %float_0 %2
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SPV14NormalizeCopyMemoryAddOperands) {
- const std::string text = R"(
- ; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} None None
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %func "func" %src %dst
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %src = OpVariable %ptr_ssbo_int StorageBuffer
- %dst = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- OpCopyMemory %dst %src
- OpReturn
- OpFunctionEnd
- )";
- SetTargetEnv(SPV_ENV_UNIVERSAL_1_4);
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SPV14NormalizeCopyMemoryDuplicateOperand) {
- const std::string text = R"(
- ; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Nontemporal Nontemporal
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %func "func" %src %dst
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %src = OpVariable %ptr_ssbo_int StorageBuffer
- %dst = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- OpCopyMemory %dst %src Nontemporal
- OpReturn
- OpFunctionEnd
- )";
- SetTargetEnv(SPV_ENV_UNIVERSAL_1_4);
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SPV14NormalizeCopyMemoryDuplicateOperands) {
- const std::string text = R"(
- ; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Aligned 4 Aligned 4
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %func "func" %src %dst
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %src = OpVariable %ptr_ssbo_int StorageBuffer
- %dst = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- OpCopyMemory %dst %src Aligned 4
- OpReturn
- OpFunctionEnd
- )";
- SetTargetEnv(SPV_ENV_UNIVERSAL_1_4);
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SPV14CopyMemoryDstCoherent) {
- const std::string text = R"(
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]] None
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %func "func" %src %dst
- OpDecorate %dst Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %src = OpVariable %ptr_ssbo_int StorageBuffer
- %dst = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- OpCopyMemory %dst %src
- OpReturn
- OpFunctionEnd
- )";
- SetTargetEnv(SPV_ENV_UNIVERSAL_1_4);
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SPV14CopyMemoryDstCoherentPreviousArgs) {
- const std::string text = R"(
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Aligned|MakePointerAvailable|NonPrivatePointer 4 [[scope]] Aligned 4
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %func "func" %src %dst
- OpDecorate %dst Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %src = OpVariable %ptr_ssbo_int StorageBuffer
- %dst = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- OpCopyMemory %dst %src Aligned 4
- OpReturn
- OpFunctionEnd
- )";
- SetTargetEnv(SPV_ENV_UNIVERSAL_1_4);
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SPV14CopyMemorySrcCoherent) {
- const std::string text = R"(
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} None MakePointerVisible|NonPrivatePointer [[scope]]
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %func "func" %src %dst
- OpDecorate %src Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %src = OpVariable %ptr_ssbo_int StorageBuffer
- %dst = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- OpCopyMemory %dst %src
- OpReturn
- OpFunctionEnd
- )";
- SetTargetEnv(SPV_ENV_UNIVERSAL_1_4);
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SPV14CopyMemorySrcCoherentPreviousArgs) {
- const std::string text = R"(
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Aligned 4 Aligned|MakePointerVisible|NonPrivatePointer 4 [[scope]]
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %func "func" %src %dst
- OpDecorate %src Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %src = OpVariable %ptr_ssbo_int StorageBuffer
- %dst = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- OpCopyMemory %dst %src Aligned 4
- OpReturn
- OpFunctionEnd
- )";
- SetTargetEnv(SPV_ENV_UNIVERSAL_1_4);
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SPV14CopyMemoryBothCoherent) {
- const std::string text = R"(
- ; CHECK-DAG: [[queue:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK-DAG: [[wg:%\w+]] = OpConstant {{%\w+}} 2
- ; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[wg]] MakePointerVisible|NonPrivatePointer [[queue]]
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %func "func" %src %dst
- OpDecorate %src Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %ptr_wg_int = OpTypePointer Workgroup %int
- %src = OpVariable %ptr_ssbo_int StorageBuffer
- %dst = OpVariable %ptr_wg_int Workgroup
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- OpCopyMemory %dst %src
- OpReturn
- OpFunctionEnd
- )";
- SetTargetEnv(SPV_ENV_UNIVERSAL_1_4);
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SPV14CopyMemoryBothCoherentPreviousArgs) {
- const std::string text = R"(
- ; CHECK-DAG: [[queue:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK-DAG: [[wg:%\w+]] = OpConstant {{%\w+}} 2
- ; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Aligned|MakePointerAvailable|NonPrivatePointer 4 [[queue]] Aligned|MakePointerVisible|NonPrivatePointer 4 [[wg]]
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %func "func" %src %dst
- OpDecorate %dst Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %ptr_wg_int = OpTypePointer Workgroup %int
- %src = OpVariable %ptr_wg_int Workgroup
- %dst = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- OpCopyMemory %dst %src Aligned 4
- OpReturn
- OpFunctionEnd
- )";
- SetTargetEnv(SPV_ENV_UNIVERSAL_1_4);
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SPV14CopyMemoryBothVolatile) {
- const std::string text = R"(
- ; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Volatile Volatile
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %func "func" %src %dst
- OpDecorate %src Volatile
- OpDecorate %dst Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %src = OpVariable %ptr_ssbo_int StorageBuffer
- %dst = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- OpCopyMemory %dst %src
- OpReturn
- OpFunctionEnd
- )";
- SetTargetEnv(SPV_ENV_UNIVERSAL_1_4);
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SPV14CopyMemoryBothVolatilePreviousArgs) {
- const std::string text = R"(
- ; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Volatile|Aligned 4 Volatile|Aligned 4
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %func "func" %src %dst
- OpDecorate %src Volatile
- OpDecorate %dst Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %src = OpVariable %ptr_ssbo_int StorageBuffer
- %dst = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- OpCopyMemory %dst %src Aligned 4
- OpReturn
- OpFunctionEnd
- )";
- SetTargetEnv(SPV_ENV_UNIVERSAL_1_4);
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, SPV14CopyMemoryDstCoherentTwoOperands) {
- const std::string text = R"(
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} MakePointerAvailable|NonPrivatePointer [[scope]] None
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %func "func" %src %dst
- OpDecorate %dst Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %src = OpVariable %ptr_ssbo_int StorageBuffer
- %dst = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- OpCopyMemory %dst %src None None
- OpReturn
- OpFunctionEnd
- )";
- SetTargetEnv(SPV_ENV_UNIVERSAL_1_4);
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest,
- SPV14CopyMemoryDstCoherentPreviousArgsTwoOperands) {
- const std::string text = R"(
- ; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5
- ; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Aligned|MakePointerAvailable|NonPrivatePointer 4 [[scope]] Aligned 8
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %func "func" %src %dst
- OpDecorate %dst Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %src = OpVariable %ptr_ssbo_int StorageBuffer
- %dst = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- OpCopyMemory %dst %src Aligned 4 Aligned 8
- OpReturn
- OpFunctionEnd
- )";
- SetTargetEnv(SPV_ENV_UNIVERSAL_1_4);
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, VolatileAtomicLoad) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate {{.*}} Volatile
- ; CHECK: [[volatile:%[a-zA-Z0-9_]+]] = OpConstant [[int:%[a-zA-Z0-9_]+]] 32768
- ; CHECK: OpAtomicLoad [[int]] {{.*}} {{.*}} [[volatile]]
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- OpDecorate %ssbo_var Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %device = OpConstant %int 1
- %relaxed = OpConstant %int 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %ssbo_var = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- %ld = OpAtomicLoad %int %ssbo_var %device %relaxed
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, VolatileAtomicLoadPreviousFlags) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate {{.*}} Volatile
- ; CHECK: [[volatile:%[a-zA-Z0-9_]+]] = OpConstant [[int:%[a-zA-Z0-9_]+]] 32834
- ; CHECK: OpAtomicLoad [[int]] {{.*}} {{.*}} [[volatile]]
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- OpDecorate %ssbo_var Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %device = OpConstant %int 1
- %acquire_ssbo = OpConstant %int 66
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %ssbo_var = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- %ld = OpAtomicLoad %int %ssbo_var %device %acquire_ssbo
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, VolatileAtomicStore) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate {{.*}} Volatile
- ; CHECK: [[volatile:%[a-zA-Z0-9_]+]] = OpConstant {{.*}} 32768
- ; CHECK: OpAtomicStore {{.*}} {{.*}} [[volatile]]
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- OpDecorate %ssbo_var Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %int_0 = OpConstant %int 0
- %device = OpConstant %int 1
- %relaxed = OpConstant %int 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %ssbo_var = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- OpAtomicStore %ssbo_var %device %relaxed %int_0
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, VolatileAtomicStorePreviousFlags) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate {{.*}} Volatile
- ; CHECK: [[volatile:%[a-zA-Z0-9_]+]] = OpConstant {{.*}} 32836
- ; CHECK: OpAtomicStore {{.*}} {{.*}} [[volatile]]
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- OpDecorate %ssbo_var Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %int_0 = OpConstant %int 0
- %device = OpConstant %int 1
- %release_ssbo = OpConstant %int 68
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %ssbo_var = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- OpAtomicStore %ssbo_var %device %release_ssbo %int_0
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, VolatileAtomicCompareExchange) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate {{.*}} Volatile
- ; CHECK: [[volatile:%[a-zA-Z0-9_]+]] = OpConstant [[int:%[a-zA-Z0-9_]+]] 32768
- ; CHECK: OpAtomicCompareExchange [[int]] {{.*}} {{.*}} [[volatile]] [[volatile]]
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- OpDecorate %ssbo_var Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %int_0 = OpConstant %int 0
- %int_1 = OpConstant %int 1
- %device = OpConstant %int 1
- %relaxed = OpConstant %int 0
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %ssbo_var = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- %ld = OpAtomicCompareExchange %int %ssbo_var %device %relaxed %relaxed %int_0 %int_1
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, VolatileAtomicCompareExchangePreviousFlags) {
- const std::string text = R"(
- ; CHECK-NOT: OpDecorate {{.*}} Volatile
- ; CHECK: [[volatile_acq_rel:%[a-zA-Z0-9_]+]] = OpConstant [[int:%[a-zA-Z0-9_]+]] 32840
- ; CHECK: [[volatile_acq:%[a-zA-Z0-9_]+]] = OpConstant [[int:%[a-zA-Z0-9_]+]] 32834
- ; CHECK: OpAtomicCompareExchange [[int]] {{.*}} {{.*}} [[volatile_acq_rel]] [[volatile_acq]]
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- OpDecorate %ssbo_var Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %int_0 = OpConstant %int 0
- %int_1 = OpConstant %int 1
- %device = OpConstant %int 1
- %acq_ssbo = OpConstant %int 66
- %acq_rel_ssbo = OpConstant %int 72
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %ssbo_var = OpVariable %ptr_ssbo_int StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- %ld = OpAtomicCompareExchange %int %ssbo_var %device %acq_rel_ssbo %acq_ssbo %int_0 %int_1
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, VolatileAtomicLoadMemberDecoration) {
- const std::string text = R"(
- ; CHECK-NOT: OpMemberDecorate {{.*}} {{.*}} Volatile
- ; CHECK: [[relaxed:%[a-zA-Z0-9_]+]] = OpConstant {{.*}} 0
- ; CHECK: [[volatile:%[a-zA-Z0-9_]+]] = OpConstant [[int:%[a-zA-Z0-9_]+]] 32768
- ; CHECK: OpAtomicLoad [[int]] {{.*}} {{.*}} [[relaxed]]
- ; CHECK: OpAtomicLoad [[int]] {{.*}} {{.*}} [[volatile]]
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- OpMemberDecorate %struct 1 Volatile
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %device = OpConstant %int 1
- %relaxed = OpConstant %int 0
- %int_0 = OpConstant %int 0
- %int_1 = OpConstant %int 1
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %struct = OpTypeStruct %int %int
- %ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
- %ssbo_var = OpVariable %ptr_ssbo_struct StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- %gep0 = OpAccessChain %ptr_ssbo_int %ssbo_var %int_0
- %ld0 = OpAtomicLoad %int %gep0 %device %relaxed
- %gep1 = OpAccessChain %ptr_ssbo_int %ssbo_var %int_1
- %ld1 = OpAtomicLoad %int %gep1 %device %relaxed
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- TEST_F(UpgradeMemoryModelTest, CoherentStructMemberInArray) {
- const std::string text = R"(
- ; CHECK-NOT: OpMemberDecorate
- ; CHECK: [[int:%[a-zA-Z0-9_]+]] = OpTypeInt 32 0
- ; CHECK: [[device:%[a-zA-Z0-9_]+]] = OpConstant [[int]] 1
- ; CHECK: OpLoad [[int]] {{.*}} MakePointerVisible|NonPrivatePointer
- OpCapability Shader
- OpCapability Linkage
- OpMemoryModel Logical GLSL450
- OpMemberDecorate %inner 1 Coherent
- %void = OpTypeVoid
- %int = OpTypeInt 32 0
- %int_0 = OpConstant %int 0
- %int_1 = OpConstant %int 1
- %int_4 = OpConstant %int 4
- %inner = OpTypeStruct %int %int
- %array = OpTypeArray %inner %int_4
- %struct = OpTypeStruct %array
- %ptr_ssbo_struct = OpTypePointer StorageBuffer %struct
- %ptr_ssbo_int = OpTypePointer StorageBuffer %int
- %ssbo_var = OpVariable %ptr_ssbo_struct StorageBuffer
- %void_fn = OpTypeFunction %void
- %func = OpFunction %void None %void_fn
- %entry = OpLabel
- %gep = OpAccessChain %ptr_ssbo_int %ssbo_var %int_0 %int_0 %int_1
- %ld = OpLoad %int %gep
- OpReturn
- OpFunctionEnd
- )";
- SinglePassRunAndMatch<opt::UpgradeMemoryModel>(text, true);
- }
- } // namespace
|