[ir] Allow bitcast to be inlined
Bitcast does not have side-effects, so do not flag it in ValueToLet as
having load/store effects. This allows bitcast expressions to be
inlined more aggressively in the textual backends, which greatly
improves the output of the following patch for signed integer
arithmetic in MSL.
Change-Id: I49afa8c9aef819f59ccbdfeeb281cf58bcf526e8
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/205234
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/tint/lang/core/ir/transform/value_to_let.cc b/src/tint/lang/core/ir/transform/value_to_let.cc
index 9537cef..63c9f37 100644
--- a/src/tint/lang/core/ir/transform/value_to_let.cc
+++ b/src/tint/lang/core/ir/transform/value_to_let.cc
@@ -51,6 +51,9 @@
[&](const ir::Store*) { return Access::kStore; }, //
[&](const ir::StoreVectorElement*) { return Access::kStore; }, //
[&](const ir::Call*) {
+ if (inst->IsAnyOf<core::ir::Bitcast>()) {
+ return Accesses{};
+ }
return Accesses{Access::kLoad, Access::kStore};
},
[&](Default) { return Accesses{}; });
diff --git a/src/tint/lang/core/ir/transform/value_to_let_test.cc b/src/tint/lang/core/ir/transform/value_to_let_test.cc
index 47c0e2f..033677b 100644
--- a/src/tint/lang/core/ir/transform/value_to_let_test.cc
+++ b/src/tint/lang/core/ir/transform/value_to_let_test.cc
@@ -97,6 +97,33 @@
EXPECT_EQ(str(), expect);
}
+
+TEST_F(IR_ValueToLetTest, NoModify_Bitcast) {
+ auto* fn = b.Function("F", ty.u32());
+ b.Append(fn->Block(), [&] {
+ auto* x = b.Let("x", 1_i);
+ auto* y = b.Bitcast<u32>(x);
+ b.Return(fn, y);
+ });
+
+ auto* src = R"(
+%F = func():u32 {
+ $B1: {
+ %x:i32 = let 1i
+ %3:u32 = bitcast %x
+ ret %3
+ }
+}
+)";
+ EXPECT_EQ(str(), src);
+
+ auto* expect = src;
+
+ Run(ValueToLet);
+
+ EXPECT_EQ(str(), expect);
+}
+
TEST_F(IR_ValueToLetTest, NoModify_SequencedValueUsedWithNonSequenced) {
auto* i = b.Var<private_, i32>("i");
b.ir.root_block->Append(i);
diff --git a/test/tint/builtins/gen/var/dot4I8Packed/881e62.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/dot4I8Packed/881e62.wgsl.expected.ir.msl
index 4966a50..a3c751f 100644
--- a/test/tint/builtins/gen/var/dot4I8Packed/881e62.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/dot4I8Packed/881e62.wgsl.expected.ir.msl
@@ -16,9 +16,7 @@
};
int tint_packed_8bit_dot(uint lhs, uint rhs) {
- char4 const v = as_type<char4>(lhs);
- char4 const v_1 = as_type<char4>(rhs);
- return int(((((v[0u] * v_1[0u]) + (v[1u] * v_1[1u])) + (v[2u] * v_1[2u])) + (v[3u] * v_1[3u])));
+ return int(((((as_type<char4>(lhs)[0u] * as_type<char4>(rhs)[0u]) + (as_type<char4>(lhs)[1u] * as_type<char4>(rhs)[1u])) + (as_type<char4>(lhs)[2u] * as_type<char4>(rhs)[2u])) + (as_type<char4>(lhs)[3u] * as_type<char4>(rhs)[3u])));
}
int dot4I8Packed_881e62() {
@@ -46,9 +44,9 @@
}
vertex vertex_main_outputs vertex_main() {
- VertexOutput const v_2 = vertex_main_inner();
+ VertexOutput const v = vertex_main_inner();
vertex_main_outputs tint_wrapper_result = {};
- tint_wrapper_result.VertexOutput_pos = v_2.pos;
- tint_wrapper_result.VertexOutput_prevent_dce = v_2.prevent_dce;
+ tint_wrapper_result.VertexOutput_pos = v.pos;
+ tint_wrapper_result.VertexOutput_prevent_dce = v.prevent_dce;
return tint_wrapper_result;
}
diff --git a/test/tint/builtins/gen/var/dot4U8Packed/fbed7b.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/dot4U8Packed/fbed7b.wgsl.expected.ir.msl
index b29b437..9b457cd 100644
--- a/test/tint/builtins/gen/var/dot4U8Packed/fbed7b.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/dot4U8Packed/fbed7b.wgsl.expected.ir.msl
@@ -16,9 +16,7 @@
};
uint tint_packed_8bit_dot(uint lhs, uint rhs) {
- uchar4 const v = as_type<uchar4>(lhs);
- uchar4 const v_1 = as_type<uchar4>(rhs);
- return uint(((((v[0u] * v_1[0u]) + (v[1u] * v_1[1u])) + (v[2u] * v_1[2u])) + (v[3u] * v_1[3u])));
+ return uint(((((as_type<uchar4>(lhs)[0u] * as_type<uchar4>(rhs)[0u]) + (as_type<uchar4>(lhs)[1u] * as_type<uchar4>(rhs)[1u])) + (as_type<uchar4>(lhs)[2u] * as_type<uchar4>(rhs)[2u])) + (as_type<uchar4>(lhs)[3u] * as_type<uchar4>(rhs)[3u])));
}
uint dot4U8Packed_fbed7b() {
@@ -46,9 +44,9 @@
}
vertex vertex_main_outputs vertex_main() {
- VertexOutput const v_2 = vertex_main_inner();
+ VertexOutput const v = vertex_main_inner();
vertex_main_outputs tint_wrapper_result = {};
- tint_wrapper_result.VertexOutput_pos = v_2.pos;
- tint_wrapper_result.VertexOutput_prevent_dce = v_2.prevent_dce;
+ tint_wrapper_result.VertexOutput_pos = v.pos;
+ tint_wrapper_result.VertexOutput_prevent_dce = v.prevent_dce;
return tint_wrapper_result;
}
diff --git a/test/tint/builtins/gen/var/pack4xI8/bfce01.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/pack4xI8/bfce01.wgsl.expected.ir.msl
index c75048e..56d7e20 100644
--- a/test/tint/builtins/gen/var/pack4xI8/bfce01.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/pack4xI8/bfce01.wgsl.expected.ir.msl
@@ -23,9 +23,8 @@
int4 arg_0 = int4(1);
int4 const v = arg_0;
uint4 const v_1 = uint4(0u, 8u, 16u, 24u);
- uint4 const v_2 = as_type<uint4>(v);
- uint4 const v_3 = ((v_2 & uint4(255u)) << v_1);
- uint res = tint_dot(v_3, uint4(1u));
+ uint4 const v_2 = ((as_type<uint4>(v) & uint4(255u)) << v_1);
+ uint res = tint_dot(v_2, uint4(1u));
return res;
}
@@ -47,9 +46,9 @@
}
vertex vertex_main_outputs vertex_main() {
- VertexOutput const v_4 = vertex_main_inner();
+ VertexOutput const v_3 = vertex_main_inner();
vertex_main_outputs tint_wrapper_result = {};
- tint_wrapper_result.VertexOutput_pos = v_4.pos;
- tint_wrapper_result.VertexOutput_prevent_dce = v_4.prevent_dce;
+ tint_wrapper_result.VertexOutput_pos = v_3.pos;
+ tint_wrapper_result.VertexOutput_prevent_dce = v_3.prevent_dce;
return tint_wrapper_result;
}