From 62079c534407abe300d24a6d759641779e48bc67 Mon Sep 17 00:00:00 2001 From: Yong He Date: Thu, 16 Jul 2020 13:09:17 -0700 Subject: Support associatedtype local variables and return values in dynamic dispatch code (#1444) * Refactor lower-generics pass into separate subpasses. * IR pass to generate witness table wrappers. * Support associatedtype local variables and return values in dynamic dispatch code. --- tests/compute/dynamic-dispatch-7.slang | 85 ++++++++++++++++++++++ .../compute/dynamic-dispatch-7.slang.expected.txt | 4 + 2 files changed, 89 insertions(+) create mode 100644 tests/compute/dynamic-dispatch-7.slang create mode 100644 tests/compute/dynamic-dispatch-7.slang.expected.txt (limited to 'tests') diff --git a/tests/compute/dynamic-dispatch-7.slang b/tests/compute/dynamic-dispatch-7.slang new file mode 100644 index 000000000..62ab94e48 --- /dev/null +++ b/tests/compute/dynamic-dispatch-7.slang @@ -0,0 +1,85 @@ +//TEST(compute):COMPARE_COMPUTE:-cpu -xslang -allow-dynamic-code +//DISABLE_TEST(compute):COMPARE_COMPUTE:-cuda -xslang -allow-dynamic-code + +// Test dynamic dispatch code gen for associated-typed return values +// and local variables. +// TODO: test arguments of associated type. + +interface IAssoc +{ + int Compute(); +} + +interface IInterface +{ + associatedtype TAssoc : IAssoc; + + [mutating] + void SetVal(int inVal); + + TAssoc GetAssoc(); +}; + +T.TAssoc CreateT_Assoc_Inner(int inVal) +{ + T obj; + obj.SetVal(inVal); + return obj.GetAssoc(); +} + +T.TAssoc CreateT_Assoc(int inVal) +{ + return CreateT_Assoc_Inner(inVal); +} + +T CreateT(int inVal) +{ + T obj; + obj.SetVal(inVal); + return obj; +} + +struct Impl : IInterface +{ + struct TAssoc : IAssoc + { + int base; + int Compute() + { + return base; + } + }; + + TAssoc assoc; + [mutating] + void SetVal(int inVal) + { + assoc.base = inVal; + } + + TAssoc GetAssoc() + { + return assoc; + } +}; + +int test() +{ + var obj = CreateT(2); + var obj2 = CreateT_Assoc(1); + // TODO: compiler crash if type parameter is missing. + // (hitting lowering logic of TypeEqualityWitness) + var obj3 = CreateT_Assoc_Inner(1); + return obj.GetAssoc().Compute() + obj2.Compute() + obj3.Compute(); +} + +//TEST_INPUT:ubuffer(data=[0 1 2 3], stride=4):out,name=outputBuffer +RWStructuredBuffer outputBuffer : register(u0); + +[numthreads(4, 1, 1)] +void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) +{ + uint tid = dispatchThreadID.x; + int outVal = test(); + outputBuffer[tid] = outVal; +} diff --git a/tests/compute/dynamic-dispatch-7.slang.expected.txt b/tests/compute/dynamic-dispatch-7.slang.expected.txt new file mode 100644 index 000000000..e785149d2 --- /dev/null +++ b/tests/compute/dynamic-dispatch-7.slang.expected.txt @@ -0,0 +1,4 @@ +4 +4 +4 +4 -- cgit v1.2.3