From 34f8b5e722aede018e275324c43055cad9a9ca5a Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Thu, 21 Apr 2022 10:06:55 -0400 Subject: Example for compiler crash with recursive function calling (#2196) * #include an absolute path didn't work - because paths were taken to always be relative. * Add crash when lowering a recursive function. * Add simplified recursive crash example. * Fix typos/tabs. --- tests/current-bugs/mul-crash.slang | 27 ++++++++++++++++++++++++++ tests/current-bugs/recursive-call-crash.slang | 28 +++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 tests/current-bugs/mul-crash.slang create mode 100644 tests/current-bugs/recursive-call-crash.slang (limited to 'tests') diff --git a/tests/current-bugs/mul-crash.slang b/tests/current-bugs/mul-crash.slang new file mode 100644 index 000000000..a5ee7e62c --- /dev/null +++ b/tests/current-bugs/mul-crash.slang @@ -0,0 +1,27 @@ +//DISABLE_TEST:SIMPLE: -target hlsl -entry computeMain -stage compute + +// This test crashes when enabled, with a stack overrun. The crash happens when lowering into IR. +// NOTE! That the code has a bug in that the mul function calls itself - so would exhaust the stack *when run*. +// This exhausts the stack when compiling which shouldn't happen. + +RWStructuredBuffer outputBuffer; + +struct SomeType +{ + float2x2 v; +}; + +float mul(SomeType a, float2 v) { return mul(a, v).x; } + +[numthreads(4, 1, 1)] +void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) +{ + uint tid = dispatchThreadID.x; + + float inVal = float(tid); + + float2 v = float2(inVal, inVal + 2); + SomeType t = { inVal + 1, 0, 1, 0 }; + + outputBuffer[tid] = mul(t, v).x; +} \ No newline at end of file diff --git a/tests/current-bugs/recursive-call-crash.slang b/tests/current-bugs/recursive-call-crash.slang new file mode 100644 index 000000000..4641827a5 --- /dev/null +++ b/tests/current-bugs/recursive-call-crash.slang @@ -0,0 +1,28 @@ +//DISABLE_TEST:SIMPLE: -target hlsl -entry computeMain -stage compute + +// This is a simplified version of the mul-crash.slang test, that shows the underlying issue is recursion. +// This test crashes when enabled, with a stack overrun. The crash happens when lowering into IR. +// +// It appears recursion in GLSL/HLSL is not allowed (at least with earlier shader models), but the compiler +// shouldn't crash. Moreover the Slang language can support recursion today on non GPU targets. + +RWStructuredBuffer outputBuffer; + +int doRecursive(int a) +{ + if (a > 0) + { + return doRecursive(a - 1) + 2; + } + return 10; +} + +[numthreads(4, 1, 1)] +void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) +{ + uint tid = dispatchThreadID.x; + + let val = doRecursive(tid); + + outputBuffer[tid] = val; +} \ No newline at end of file -- cgit v1.2.3