From d10ca980c3d84e4838272f2082e8e35f3a7e50c0 Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Tue, 30 Nov 2021 17:09:52 -0500 Subject: Fix issue around constant folding/bool (#2036) * #include an absolute path didn't work - because paths were taken to always be relative. * Fix bool handling in constant folding for generic parameters. --- source/slang/slang-check-expr.cpp | 7 +++ tests/bugs/generic-constant-fold.slang | 58 ++++++++++++++++++++++ .../bugs/generic-constant-fold.slang.expected.txt | 8 +++ 3 files changed, 73 insertions(+) create mode 100644 tests/bugs/generic-constant-fold.slang create mode 100644 tests/bugs/generic-constant-fold.slang.expected.txt diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp index 6b1ab13cc..e8384e0ab 100644 --- a/source/slang/slang-check-expr.cpp +++ b/source/slang/slang-check-expr.cpp @@ -871,6 +871,13 @@ namespace Slang return getIntVal(intLitExpr); } + if (auto boolLitExpr = expr.as()) + { + // If it's a boolean, we allow promotion to int. + const IntegerLiteralValue value = IntegerLiteralValue(boolLitExpr.getExpr()->value); + return m_astBuilder->create(value); + } + // it is possible that we are referring to a generic value param if (auto declRefExpr = expr.as()) { diff --git a/tests/bugs/generic-constant-fold.slang b/tests/bugs/generic-constant-fold.slang new file mode 100644 index 000000000..35aa2a042 --- /dev/null +++ b/tests/bugs/generic-constant-fold.slang @@ -0,0 +1,58 @@ +// constant-fold.slang + +//TEST(compute):COMPARE_COMPUTE: -shaderobj +//DISABLE_TEST(compute):COMPARE_COMPUTE:-cpu -shaderobj + +struct AnotherStruct +{ + __init() + { + value = SomeValue; + } + int value; +}; + +struct SomeStruct +{ + __init() + { + value = SomeValue; + } + bool value; +}; + +//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer outputBuffer; + +[numthreads(8, 1, 1)] +void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) +{ + SomeStruct a; + SomeStruct b; + SomeStruct<1> c; + SomeStruct<0> d; + + AnotherStruct e; + AnotherStruct f; + AnotherStruct<2> g; + AnotherStruct<-2> h; + + + uint tid = dispatchThreadID.x; + + int outVal; + switch (tid) + { + default: + case 0: outVal = a.value; break; + case 1: outVal = b.value; break; + case 2: outVal = c.value; break; + case 3: outVal = d.value; break; + case 4: outVal = e.value; break; + case 5: outVal = f.value; break; + case 6: outVal = g.value; break; + case 7: outVal = h.value; break; + } + + outputBuffer[tid] = outVal; +} diff --git a/tests/bugs/generic-constant-fold.slang.expected.txt b/tests/bugs/generic-constant-fold.slang.expected.txt new file mode 100644 index 000000000..cdbc7949e --- /dev/null +++ b/tests/bugs/generic-constant-fold.slang.expected.txt @@ -0,0 +1,8 @@ +1 +0 +1 +0 +1 +0 +2 +FFFFFFFE -- cgit v1.2.3