yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

ArielG-NVInitial copy elision pass (#8042)063cbeaae

master
3.2 KiB141 linesraw
1//TEST:COMPARE_COMPUTE(filecheck-buffer=BUF): -cuda -compute
2//TEST:SIMPLE(filecheck=CUDA): -stage compute -entry computeMain -target cuda -O3
3
4struct Data
5{
6    int val;
7
8
9    __init(int val)
10    {
11        this.val = val;
12    }
13};
14
15struct DataWrapped
16{
17    Data field;
18    Data element[2];
19
20    __init(int val)
21    {
22        field.val = val;
23        element[0].val = val;
24        element[1].val = val;
25    }
26}
27
28//TEST_INPUT:uniform(data=[1]):name=globalData
29uniform Data globalData;
30
31//TEST_INPUT: set input = ubuffer(data=[1 2 3 4], stride=4)
32RWStructuredBuffer<int> input;
33
34//TEST_INPUT: set output = out ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0], stride=4)
35RWStructuredBuffer<int> output;
36
37// CUDA: addCopyElision{{.*}}Data{{.*}}*{{.*}}data
38int addCopyElision(Data data, int val)
39{
40    // ensure we do not introduce a temporary
41    // CUDA-NOT: Data{{.*}};
42    return data.val + val;
43}
44
45// CUDA: nested{{.*}}Data{{.*}}*{{.*}}data
46int nested(Data data, int val)
47{
48
49    return addCopyElision(data, val);
50}
51
52// CUDA: addCopyElision{{.*}}FixedArray{{.*}}*{{.*}}data
53int addCopyElision(int data[10], int val)
54{
55// ensure we do not introduce a temporary
56// CUDA-NOT: {{.*}}FixedArray{{.*}};
57    return data[1] + val;
58}
59
60// CUDA: nested{{.*}}Array{{.*}}*{{.*}}data
61int nested(int data[10], int val)
62{
63    return addCopyElision(data, val);
64}
65
66void modify(inout int data[10])
67{
68    data[1] = input[0];
69}
70// CUDA: notDirectlyUsingParam{{.*}}Array{{.*}}*{{.*}}data
71int notDirectlyUsingParam(int data[10], int val)
72{
73// ensure we create a temporary for the array
74// CUDA: FixedArray{{.*}};
75    modify(data);
76    return data[1] + val;
77}
78
79
80// CUDA:computeMain
81[shader("compute")]
82[numthreads(1, 1, 1)]
83void computeMain()
84{
85
86    // struct
87    Data data = Data(input[0]);
88    int structVal = addCopyElision(data, input[1]);
89
90    // struct which is globalParam
91    int globalParamStructVal = addCopyElision(globalData, input[1]);
92
93    // passing nested struct
94    int nestedStructVal = nested(data, input[1]);
95
96    // field
97    DataWrapped dataWrapped = DataWrapped(input[0]);
98    int fieldVal = addCopyElision(dataWrapped.field, input[1]);
99
100    // element
101    int elementVal = addCopyElision(dataWrapped.element[0], input[1]);
102
103    // A non-variable
104    int nonVariableVal = addCopyElision(Data(input[0]), input[1]);
105
106    // array
107    int val[10];
108    val[1] = input[0];
109    int arrayVal = addCopyElision(val, input[1]);
110
111    // passing nested array
112    int nestedArrayVal = nested(val, input[1]);
113
114    // not directly using param
115    int notDirectlyUsingParamVal = notDirectlyUsingParam(val, input[1]);
116
117    output[0] = 
118        structVal == 3 &&
119        globalParamStructVal == 3 &&
120        nestedStructVal == 3 &&
121        fieldVal == 3 &&
122        elementVal == 3 &&
123        nonVariableVal == 3 &&
124        arrayVal == 3 &&
125        nestedArrayVal == 3 &&
126        notDirectlyUsingParamVal == 3
127        ? 1 : 0;
128
129    // For debugging
130    //output[1] = structVal;
131    //output[2] = globalParamStructVal;
132    //output[3] = nestedStructVal;
133    //output[4] = fieldVal;
134    //output[5] = elementVal;
135    //output[6] = nonVariableVal;
136    //output[7] = arrayVal;
137    //output[8] = nestedArrayVal;
138    //output[9] = notDirectlyUsingParamVal;
139}
140
141//BUF: 1