diff --git a/lib/HLSL/DxilPreparePasses.cpp b/lib/HLSL/DxilPreparePasses.cpp index 4b45394c7..c56a192aa 100644 --- a/lib/HLSL/DxilPreparePasses.cpp +++ b/lib/HLSL/DxilPreparePasses.cpp @@ -388,8 +388,8 @@ public: if (!F) continue; Type *Ty = OP::GetOverloadType(fromOpcode, F); - for (auto uit = F->user_begin(); uit != F->user_end(); uit++) { - CallInst *CI = cast(*uit); + for (auto uit = F->user_begin(), E = F->user_end(); uit != E;) { + CallInst *CI = cast(*(uit++)); IRBuilder<> Builder(CI); std::vector args; args.emplace_back(hlslOp->GetU32Const((unsigned)toOpcode)); diff --git a/tools/clang/test/HLSLFileCheck/hlsl/objects/Texture/gatherOffset2.hlsl b/tools/clang/test/HLSLFileCheck/hlsl/objects/Texture/gatherOffset2.hlsl new file mode 100644 index 000000000..29d5c780e --- /dev/null +++ b/tools/clang/test/HLSLFileCheck/hlsl/objects/Texture/gatherOffset2.hlsl @@ -0,0 +1,15 @@ +// RUN: %dxc -T ps_6_0 %s | FileCheck %s + +// Test for access violation that previously occured with these gathers + +// CHECK: @main + +Texture2D shadowMap; +SamplerComparisonState BilinearClampCmpSampler; +SamplerState BilinearClampSampler; + +float4 main(float3 uv_depth: TEXCOORD0): SV_Target +{ + return shadowMap.GatherCmp(BilinearClampCmpSampler, uv_depth.xy, uv_depth.z, int2(0, 0)) + + shadowMap.GatherRed(BilinearClampSampler, uv_depth.xy, int2(0, 0)); +}