summaryrefslogtreecommitdiff
path: root/tests/bugs/gh-8121.slang
blob: 777e75b9e31c2cc904e80f9351a062f1b1daaa95 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-cuda -compute -shaderobj

//TEST_INPUT:ubuffer(data=[1 1 1 1], stride=4),name=inputBuffer
RWStructuredBuffer<int[2]> inputBuffer;

//TEST_INPUT:ubuffer(data=[0 0 0 0 0], stride=4):out,name=outputBuffer
RWStructuredBuffer<int> outputBuffer;

void math(int data[2])
{
    // This test is to ensure that we do not break our optimization-pass which optimizes the IR of
    // `getElement(load(getElementPtr(...)), ...)` into `load(getElementPtr(getElementPtr(...), ...))`.
    //
    // This test triggers the bug given the IR: `store(outputBuffer[0], getElement(Array<>, load(getElementPtr(data,0))))`.
    // `Array<int,2>(5,6)` is not created as a local variable intentionally. We do this because we want to test the case
    // where `Array<>` must be accessed as a value (`getElement`), not a pointer (`getElementPtr`).
    //
    // If this code fails, outputBuffer[0] will contain the value `1`. We expect `6` if the bug is fixed.
    outputBuffer[0] = Array<int,2>(5,6)[data[0]];
}

[shader("compute")]
[numthreads(1, 1, 1)]
void computeMain(int3 id: SV_DispatchThreadID)
{
    math(inputBuffer[0]);
}

//CHECK: 6
//CHECK-NEXT: 0