[ir][msl] Emit ir::UserCall
Add support for the ir user call instruction in the MSL printer.
Bug: tint:1967
Change-Id: Ibf91da5ef541d12a293440ab88727de2b29bbe7b
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/162300
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/lang/msl/writer/printer/printer.cc b/src/tint/lang/msl/writer/printer/printer.cc
index 0b4aa8c..436e88f 100644
--- a/src/tint/lang/msl/writer/printer/printer.cc
+++ b/src/tint/lang/msl/writer/printer/printer.cc
@@ -49,6 +49,7 @@
#include "src/tint/lang/core/ir/multi_in_block.h"
#include "src/tint/lang/core/ir/return.h"
#include "src/tint/lang/core/ir/unreachable.h"
+#include "src/tint/lang/core/ir/user_call.h"
#include "src/tint/lang/core/ir/validator.h"
#include "src/tint/lang/core/ir/var.h"
#include "src/tint/lang/core/type/array.h"
@@ -261,6 +262,7 @@
[&](core::ir::Load*) { MaybeEmitInstruction(inst); }, //
[&](core::ir::Construct*) { MaybeEmitInstruction(inst); }, //
[&](core::ir::Access*) { MaybeEmitInstruction(inst); }, //
+ [&](core::ir::UserCall*) { MaybeEmitInstruction(inst); }, //
TINT_ICE_ON_NO_MATCH);
}
}
@@ -299,6 +301,7 @@
[&](const core::ir::Var* var) { EmitVarName(out, var); }, //
[&](const core::ir::Bitcast* b) { EmitBitcast(out, b); }, //
[&](const core::ir::Access* a) { EmitAccess(out, a); }, //
+ [&](const core::ir::UserCall* c) { EmitUserCall(out, c); }, //
TINT_ICE_ON_NO_MATCH);
}, //
TINT_ICE_ON_NO_MATCH);
@@ -520,6 +523,21 @@
}
}
+ /// Emits a user call instruction
+ void EmitUserCall(StringStream& out, const core::ir::UserCall* c) {
+ out << ir_.NameOf(c->Target()).Name() << "(";
+ size_t i = 0;
+ for (const auto* arg : c->Args()) {
+ if (i > 0) {
+ out << ", ";
+ }
+ ++i;
+
+ EmitValue(out, arg);
+ }
+ out << ")";
+ }
+
/// Emit a constructor
void EmitConstruct(StringStream& out, const core::ir::Construct* c) {
Switch(
diff --git a/test/tint/expressions/splat/call/bool.wgsl.expected.ir.msl b/test/tint/expressions/splat/call/bool.wgsl.expected.ir.msl
index 792ab03..e328b8c 100644
--- a/test/tint/expressions/splat/call/bool.wgsl.expected.ir.msl
+++ b/test/tint/expressions/splat/call/bool.wgsl.expected.ir.msl
@@ -1,9 +1,11 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::UserCall
-********************************************************************
-* The tint shader compiler has encountered an unexpected error. *
-* *
-* Please help us fix this issue by submitting a bug report at *
-* crbug.com/tint with the source program that triggered the bug. *
-********************************************************************
+bool get_bool() {
+ return true;
+}
+void f() {
+ bool2 v2 = bool2(get_bool());
+ bool3 v3 = bool3(get_bool());
+ bool4 v4 = bool4(get_bool());
+}
diff --git a/test/tint/expressions/splat/call/f16.wgsl.expected.ir.msl b/test/tint/expressions/splat/call/f16.wgsl.expected.ir.msl
index 792ab03..6525595 100644
--- a/test/tint/expressions/splat/call/f16.wgsl.expected.ir.msl
+++ b/test/tint/expressions/splat/call/f16.wgsl.expected.ir.msl
@@ -1,9 +1,11 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::UserCall
-********************************************************************
-* The tint shader compiler has encountered an unexpected error. *
-* *
-* Please help us fix this issue by submitting a bug report at *
-* crbug.com/tint with the source program that triggered the bug. *
-********************************************************************
+half get_f16() {
+ return 1.0h;
+}
+void f() {
+ half2 v2 = half2(get_f16());
+ half3 v3 = half3(get_f16());
+ half4 v4 = half4(get_f16());
+}
diff --git a/test/tint/expressions/splat/call/f32.wgsl.expected.ir.msl b/test/tint/expressions/splat/call/f32.wgsl.expected.ir.msl
index 792ab03..67f1153 100644
--- a/test/tint/expressions/splat/call/f32.wgsl.expected.ir.msl
+++ b/test/tint/expressions/splat/call/f32.wgsl.expected.ir.msl
@@ -1,9 +1,11 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::UserCall
-********************************************************************
-* The tint shader compiler has encountered an unexpected error. *
-* *
-* Please help us fix this issue by submitting a bug report at *
-* crbug.com/tint with the source program that triggered the bug. *
-********************************************************************
+float get_f32() {
+ return 1.0f;
+}
+void f() {
+ float2 v2 = float2(get_f32());
+ float3 v3 = float3(get_f32());
+ float4 v4 = float4(get_f32());
+}
diff --git a/test/tint/expressions/splat/call/i32.wgsl.expected.ir.msl b/test/tint/expressions/splat/call/i32.wgsl.expected.ir.msl
index 792ab03..2d30e4e 100644
--- a/test/tint/expressions/splat/call/i32.wgsl.expected.ir.msl
+++ b/test/tint/expressions/splat/call/i32.wgsl.expected.ir.msl
@@ -1,9 +1,11 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::UserCall
-********************************************************************
-* The tint shader compiler has encountered an unexpected error. *
-* *
-* Please help us fix this issue by submitting a bug report at *
-* crbug.com/tint with the source program that triggered the bug. *
-********************************************************************
+int get_i32() {
+ return 1;
+}
+void f() {
+ int2 v2 = int2(get_i32());
+ int3 v3 = int3(get_i32());
+ int4 v4 = int4(get_i32());
+}
diff --git a/test/tint/expressions/splat/call/u32.wgsl.expected.ir.msl b/test/tint/expressions/splat/call/u32.wgsl.expected.ir.msl
index 792ab03..4bab740 100644
--- a/test/tint/expressions/splat/call/u32.wgsl.expected.ir.msl
+++ b/test/tint/expressions/splat/call/u32.wgsl.expected.ir.msl
@@ -1,9 +1,11 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::UserCall
-********************************************************************
-* The tint shader compiler has encountered an unexpected error. *
-* *
-* Please help us fix this issue by submitting a bug report at *
-* crbug.com/tint with the source program that triggered the bug. *
-********************************************************************
+uint get_u32() {
+ return 1u;
+}
+void f() {
+ uint2 v2 = uint2(get_u32());
+ uint3 v3 = uint3(get_u32());
+ uint4 v4 = uint4(get_u32());
+}