diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2021-11-30 17:09:52 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-11-30 17:09:52 -0500 |
| commit | d10ca980c3d84e4838272f2082e8e35f3a7e50c0 (patch) | |
| tree | 626da0eef8e81487630bf3e3e190374d9b0ae77d | |
| parent | ce12e1d64d6b0b62609f061d3773a7e8b35849c3 (diff) | |
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.
| -rw-r--r-- | source/slang/slang-check-expr.cpp | 7 | ||||
| -rw-r--r-- | tests/bugs/generic-constant-fold.slang | 58 | ||||
| -rw-r--r-- | tests/bugs/generic-constant-fold.slang.expected.txt | 8 |
3 files changed, 73 insertions, 0 deletions
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<BoolLiteralExpr>()) + { + // If it's a boolean, we allow promotion to int. + const IntegerLiteralValue value = IntegerLiteralValue(boolLitExpr.getExpr()->value); + return m_astBuilder->create<ConstantIntVal>(value); + } + // it is possible that we are referring to a generic value param if (auto declRefExpr = expr.as<DeclRefExpr>()) { 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<let SomeValue : int> +{ + __init() + { + value = SomeValue; + } + int value; +}; + +struct SomeStruct<let SomeValue : bool> +{ + __init() + { + value = SomeValue; + } + bool value; +}; + +//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer +RWStructuredBuffer<int> outputBuffer; + +[numthreads(8, 1, 1)] +void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) +{ + SomeStruct<true> a; + SomeStruct<false> b; + SomeStruct<1> c; + SomeStruct<0> d; + + AnotherStruct<true> e; + AnotherStruct<false> 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 |
