[HLSL] Sort vars when updating buffer accesses.
When updating the buffer accesses for UBO and SSBO, sort the var usages
before replacing them. This makes the subsequent polyfills for F16 be
more consistent in their naming as we create the polyfills in the same
order.
Bug: 356631361
Change-Id: I63cf75ec000244e9ffae1268314a75e698e7582a
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/201574
Commit-Queue: Ryan Harrison <rharrison@chromium.org>
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Auto-Submit: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/hlsl/writer/raise/decompose_storage_access.cc b/src/tint/lang/hlsl/writer/raise/decompose_storage_access.cc
index 77c41d6..be0d2a7 100644
--- a/src/tint/lang/hlsl/writer/raise/decompose_storage_access.cc
+++ b/src/tint/lang/hlsl/writer/raise/decompose_storage_access.cc
@@ -87,9 +87,9 @@
// Find all the usages of the `var` which is loading or storing.
Vector<core::ir::Instruction*, 4> usage_worklist;
- for (auto& usage : result->UsagesUnsorted()) {
+ for (auto& usage : result->UsagesSorted()) {
Switch(
- usage->instruction,
+ usage.instruction,
[&](core::ir::LoadVectorElement* lve) { usage_worklist.Push(lve); },
[&](core::ir::StoreVectorElement* sve) { usage_worklist.Push(sve); },
[&](core::ir::Store* st) { usage_worklist.Push(st); },
diff --git a/src/tint/lang/hlsl/writer/raise/decompose_uniform_access.cc b/src/tint/lang/hlsl/writer/raise/decompose_uniform_access.cc
index af8628b..0c9460a 100644
--- a/src/tint/lang/hlsl/writer/raise/decompose_uniform_access.cc
+++ b/src/tint/lang/hlsl/writer/raise/decompose_uniform_access.cc
@@ -87,7 +87,7 @@
for (auto* var : var_worklist) {
auto* result = var->Result(0);
- auto usage_worklist = result->UsagesUnsorted().Vector();
+ auto usage_worklist = result->UsagesSorted();
auto* var_ty = result->Type()->As<core::type::Pointer>();
while (!usage_worklist.IsEmpty()) {
auto usage = usage_worklist.Pop();
diff --git a/test/tint/buffer/uniform/dynamic_index/read_f16.wgsl.expected.ir.dxc.hlsl b/test/tint/buffer/uniform/dynamic_index/read_f16.wgsl.expected.ir.dxc.hlsl
index b9c1ee4..051cc19 100644
--- a/test/tint/buffer/uniform/dynamic_index/read_f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/buffer/uniform/dynamic_index/read_f16.wgsl.expected.ir.dxc.hlsl
@@ -15,7 +15,7 @@
return (((value <= 2147483520.0f)) ? ((((value >= -2147483648.0f)) ? (int(value)) : (-2147483648))) : (2147483647));
}
-vector<float16_t, 2> tint_bitcast_to_f16_1(uint src) {
+vector<float16_t, 2> tint_bitcast_to_f16(uint src) {
uint v = src;
float t_low = f16tof32((v & 65535u));
float t_high = f16tof32(((v >> 16u) & 65535u));
@@ -25,13 +25,13 @@
matrix<float16_t, 4, 2> v_2(uint start_byte_offset) {
uint4 v_3 = ub[(start_byte_offset / 16u)];
- vector<float16_t, 2> v_4 = tint_bitcast_to_f16_1((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
+ vector<float16_t, 2> v_4 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_3.z) : (v_3.x)));
uint4 v_5 = ub[((4u + start_byte_offset) / 16u)];
- vector<float16_t, 2> v_6 = tint_bitcast_to_f16_1(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
+ vector<float16_t, 2> v_6 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_5.z) : (v_5.x)));
uint4 v_7 = ub[((8u + start_byte_offset) / 16u)];
- vector<float16_t, 2> v_8 = tint_bitcast_to_f16_1(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
+ vector<float16_t, 2> v_8 = tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_7.z) : (v_7.x)));
uint4 v_9 = ub[((12u + start_byte_offset) / 16u)];
- return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16_1(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
+ return matrix<float16_t, 4, 2>(v_4, v_6, v_8, tint_bitcast_to_f16(((((((12u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_9.z) : (v_9.x))));
}
typedef matrix<float16_t, 4, 2> ary_ret[2];
@@ -78,7 +78,7 @@
return v_17;
}
-vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
+vector<float16_t, 4> tint_bitcast_to_f16_1(uint4 src) {
uint4 v = src;
uint4 mask = (65535u).xxxx;
uint4 shift = (16u).xxxx;
@@ -91,55 +91,55 @@
}
matrix<float16_t, 4, 4> v_21(uint start_byte_offset) {
- vector<float16_t, 4> v_22 = tint_bitcast_to_f16(ub[(start_byte_offset / 16u)]);
- vector<float16_t, 4> v_23 = tint_bitcast_to_f16(ub[((8u + start_byte_offset) / 16u)]);
- vector<float16_t, 4> v_24 = tint_bitcast_to_f16(ub[((16u + start_byte_offset) / 16u)]);
- return matrix<float16_t, 4, 4>(v_22, v_23, v_24, tint_bitcast_to_f16(ub[((24u + start_byte_offset) / 16u)]));
+ vector<float16_t, 4> v_22 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]);
+ vector<float16_t, 4> v_23 = tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]);
+ vector<float16_t, 4> v_24 = tint_bitcast_to_f16_1(ub[((16u + start_byte_offset) / 16u)]);
+ return matrix<float16_t, 4, 4>(v_22, v_23, v_24, tint_bitcast_to_f16_1(ub[((24u + start_byte_offset) / 16u)]));
}
matrix<float16_t, 4, 3> v_25(uint start_byte_offset) {
- vector<float16_t, 3> v_26 = tint_bitcast_to_f16(ub[(start_byte_offset / 16u)]).xyz;
- vector<float16_t, 3> v_27 = tint_bitcast_to_f16(ub[((8u + start_byte_offset) / 16u)]).xyz;
- vector<float16_t, 3> v_28 = tint_bitcast_to_f16(ub[((16u + start_byte_offset) / 16u)]).xyz;
- return matrix<float16_t, 4, 3>(v_26, v_27, v_28, tint_bitcast_to_f16(ub[((24u + start_byte_offset) / 16u)]).xyz);
+ vector<float16_t, 3> v_26 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]).xyz;
+ vector<float16_t, 3> v_27 = tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]).xyz;
+ vector<float16_t, 3> v_28 = tint_bitcast_to_f16_1(ub[((16u + start_byte_offset) / 16u)]).xyz;
+ return matrix<float16_t, 4, 3>(v_26, v_27, v_28, tint_bitcast_to_f16_1(ub[((24u + start_byte_offset) / 16u)]).xyz);
}
matrix<float16_t, 3, 4> v_29(uint start_byte_offset) {
- vector<float16_t, 4> v_30 = tint_bitcast_to_f16(ub[(start_byte_offset / 16u)]);
- vector<float16_t, 4> v_31 = tint_bitcast_to_f16(ub[((8u + start_byte_offset) / 16u)]);
- return matrix<float16_t, 3, 4>(v_30, v_31, tint_bitcast_to_f16(ub[((16u + start_byte_offset) / 16u)]));
+ vector<float16_t, 4> v_30 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]);
+ vector<float16_t, 4> v_31 = tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]);
+ return matrix<float16_t, 3, 4>(v_30, v_31, tint_bitcast_to_f16_1(ub[((16u + start_byte_offset) / 16u)]));
}
matrix<float16_t, 3, 3> v_32(uint start_byte_offset) {
- vector<float16_t, 3> v_33 = tint_bitcast_to_f16(ub[(start_byte_offset / 16u)]).xyz;
- vector<float16_t, 3> v_34 = tint_bitcast_to_f16(ub[((8u + start_byte_offset) / 16u)]).xyz;
- return matrix<float16_t, 3, 3>(v_33, v_34, tint_bitcast_to_f16(ub[((16u + start_byte_offset) / 16u)]).xyz);
+ vector<float16_t, 3> v_33 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]).xyz;
+ vector<float16_t, 3> v_34 = tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]).xyz;
+ return matrix<float16_t, 3, 3>(v_33, v_34, tint_bitcast_to_f16_1(ub[((16u + start_byte_offset) / 16u)]).xyz);
}
matrix<float16_t, 3, 2> v_35(uint start_byte_offset) {
uint4 v_36 = ub[(start_byte_offset / 16u)];
- vector<float16_t, 2> v_37 = tint_bitcast_to_f16_1((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_36.z) : (v_36.x)));
+ vector<float16_t, 2> v_37 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_36.z) : (v_36.x)));
uint4 v_38 = ub[((4u + start_byte_offset) / 16u)];
- vector<float16_t, 2> v_39 = tint_bitcast_to_f16_1(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_38.z) : (v_38.x)));
+ vector<float16_t, 2> v_39 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_38.z) : (v_38.x)));
uint4 v_40 = ub[((8u + start_byte_offset) / 16u)];
- return matrix<float16_t, 3, 2>(v_37, v_39, tint_bitcast_to_f16_1(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_40.z) : (v_40.x))));
+ return matrix<float16_t, 3, 2>(v_37, v_39, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_40.z) : (v_40.x))));
}
matrix<float16_t, 2, 4> v_41(uint start_byte_offset) {
- vector<float16_t, 4> v_42 = tint_bitcast_to_f16(ub[(start_byte_offset / 16u)]);
- return matrix<float16_t, 2, 4>(v_42, tint_bitcast_to_f16(ub[((8u + start_byte_offset) / 16u)]));
+ vector<float16_t, 4> v_42 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]);
+ return matrix<float16_t, 2, 4>(v_42, tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]));
}
matrix<float16_t, 2, 3> v_43(uint start_byte_offset) {
- vector<float16_t, 3> v_44 = tint_bitcast_to_f16(ub[(start_byte_offset / 16u)]).xyz;
- return matrix<float16_t, 2, 3>(v_44, tint_bitcast_to_f16(ub[((8u + start_byte_offset) / 16u)]).xyz);
+ vector<float16_t, 3> v_44 = tint_bitcast_to_f16_1(ub[(start_byte_offset / 16u)]).xyz;
+ return matrix<float16_t, 2, 3>(v_44, tint_bitcast_to_f16_1(ub[((8u + start_byte_offset) / 16u)]).xyz);
}
matrix<float16_t, 2, 2> v_45(uint start_byte_offset) {
uint4 v_46 = ub[(start_byte_offset / 16u)];
- vector<float16_t, 2> v_47 = tint_bitcast_to_f16_1((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_46.z) : (v_46.x)));
+ vector<float16_t, 2> v_47 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_46.z) : (v_46.x)));
uint4 v_48 = ub[((4u + start_byte_offset) / 16u)];
- return matrix<float16_t, 2, 2>(v_47, tint_bitcast_to_f16_1(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_48.z) : (v_48.x))));
+ return matrix<float16_t, 2, 2>(v_47, tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_48.z) : (v_48.x))));
}
float4x4 v_49(uint start_byte_offset) {
@@ -226,15 +226,15 @@
uint2 vec2_u32 = (((((v_94 % 16u) / 4u) == 2u)) ? (v_95.zw) : (v_95.xy));
uint v_96 = (40u + (800u * uint(idx)));
uint4 v_97 = ub[(v_96 / 16u)];
- vector<float16_t, 2> vec2_f16 = tint_bitcast_to_f16_1((((((v_96 % 16u) / 4u) == 2u)) ? (v_97.z) : (v_97.x)));
+ vector<float16_t, 2> vec2_f16 = tint_bitcast_to_f16((((((v_96 % 16u) / 4u) == 2u)) ? (v_97.z) : (v_97.x)));
float3 vec3_f32 = asfloat(ub[((48u + (800u * uint(idx))) / 16u)].xyz);
int3 vec3_i32 = asint(ub[((64u + (800u * uint(idx))) / 16u)].xyz);
uint3 vec3_u32 = ub[((80u + (800u * uint(idx))) / 16u)].xyz;
- vector<float16_t, 3> vec3_f16 = tint_bitcast_to_f16(ub[((96u + (800u * uint(idx))) / 16u)]).xyz;
+ vector<float16_t, 3> vec3_f16 = tint_bitcast_to_f16_1(ub[((96u + (800u * uint(idx))) / 16u)]).xyz;
float4 vec4_f32 = asfloat(ub[((112u + (800u * uint(idx))) / 16u)]);
int4 vec4_i32 = asint(ub[((128u + (800u * uint(idx))) / 16u)]);
uint4 vec4_u32 = ub[((144u + (800u * uint(idx))) / 16u)];
- vector<float16_t, 4> vec4_f16 = tint_bitcast_to_f16(ub[((160u + (800u * uint(idx))) / 16u)]);
+ vector<float16_t, 4> vec4_f16 = tint_bitcast_to_f16_1(ub[((160u + (800u * uint(idx))) / 16u)]);
float2x2 mat2x2_f32 = v_81((168u + (800u * uint(idx))));
float2x3 mat2x3_f32 = v_79((192u + (800u * uint(idx))));
float2x4 mat2x4_f32 = v_77((224u + (800u * uint(idx))));
diff --git a/test/tint/expressions/binary/mul/mat3x2-vec3/f16.wgsl.expected.ir.dxc.hlsl b/test/tint/expressions/binary/mul/mat3x2-vec3/f16.wgsl.expected.ir.dxc.hlsl
index 361510b..3fe0ad3 100644
--- a/test/tint/expressions/binary/mul/mat3x2-vec3/f16.wgsl.expected.ir.dxc.hlsl
+++ b/test/tint/expressions/binary/mul/mat3x2-vec3/f16.wgsl.expected.ir.dxc.hlsl
@@ -2,7 +2,7 @@
cbuffer cbuffer_data : register(b0) {
uint4 data[2];
};
-vector<float16_t, 4> tint_bitcast_to_f16_1(uint4 src) {
+vector<float16_t, 4> tint_bitcast_to_f16(uint4 src) {
uint4 v = src;
uint4 mask = (65535u).xxxx;
uint4 shift = (16u).xxxx;
@@ -14,7 +14,7 @@
return vector<float16_t, 4>(v_1, v_2, v_3, float16_t(t_high.y));
}
-vector<float16_t, 2> tint_bitcast_to_f16(uint src) {
+vector<float16_t, 2> tint_bitcast_to_f16_1(uint src) {
uint v = src;
float t_low = f16tof32((v & 65535u));
float t_high = f16tof32(((v >> 16u) & 65535u));
@@ -24,15 +24,15 @@
matrix<float16_t, 3, 2> v_5(uint start_byte_offset) {
uint4 v_6 = data[(start_byte_offset / 16u)];
- vector<float16_t, 2> v_7 = tint_bitcast_to_f16((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.z) : (v_6.x)));
+ vector<float16_t, 2> v_7 = tint_bitcast_to_f16_1((((((start_byte_offset % 16u) / 4u) == 2u)) ? (v_6.z) : (v_6.x)));
uint4 v_8 = data[((4u + start_byte_offset) / 16u)];
- vector<float16_t, 2> v_9 = tint_bitcast_to_f16(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.z) : (v_8.x)));
+ vector<float16_t, 2> v_9 = tint_bitcast_to_f16_1(((((((4u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_8.z) : (v_8.x)));
uint4 v_10 = data[((8u + start_byte_offset) / 16u)];
- return matrix<float16_t, 3, 2>(v_7, v_9, tint_bitcast_to_f16(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.z) : (v_10.x))));
+ return matrix<float16_t, 3, 2>(v_7, v_9, tint_bitcast_to_f16_1(((((((8u + start_byte_offset) % 16u) / 4u) == 2u)) ? (v_10.z) : (v_10.x))));
}
void main() {
matrix<float16_t, 3, 2> v_11 = v_5(0u);
- vector<float16_t, 2> x = mul(tint_bitcast_to_f16_1(data[1u]).xyz, v_11);
+ vector<float16_t, 2> x = mul(tint_bitcast_to_f16(data[1u]).xyz, v_11);
}