From: Nicolai Hähnle <nicolai.haeh...@amd.com>

A constant value of float type is not necessarily a ConstantFP: it could also
be a constant expression that for some reason hasn't been folded.

This fixes a regression in 
GL45-CTS.arrays_of_arrays_gl.InteractionFunctionCalls2
that was introduced by commit 3ec9975555d1cc5365413ad9062f412904f944a3.
---
 src/gallium/drivers/radeonsi/si_shader.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index 3a84253..5eebf29 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -6528,37 +6528,36 @@ static bool si_eliminate_const_output(struct 
si_shader_context *ctx,
                                      LLVMValueRef inst, unsigned offset)
 {
        struct si_shader *shader = ctx->shader;
        unsigned num_outputs = shader->selector->info.num_outputs;
        unsigned i, default_val; /* SPI_PS_INPUT_CNTL_i.DEFAULT_VAL */
        bool is_zero[4] = {}, is_one[4] = {};
 
        for (i = 0; i < 4; i++) {
                LLVMBool loses_info;
                LLVMValueRef p = LLVMGetOperand(inst, 5 + i);
-               if (!LLVMIsConstant(p))
-                       return false;
 
                /* It's a constant expression. Undef outputs are eliminated 
too. */
                if (LLVMIsUndef(p)) {
                        is_zero[i] = true;
                        is_one[i] = true;
-               } else {
+               } else if (LLVMIsAConstantFP(p)) {
                        double a = LLVMConstRealGetDouble(p, &loses_info);
 
                        if (a == 0)
                                is_zero[i] = true;
                        else if (a == 1)
                                is_one[i] = true;
                        else
                                return false; /* other constant */
-               }
+               } else
+                       return false;
        }
 
        /* Only certain combinations of 0 and 1 can be eliminated. */
        if (is_zero[0] && is_zero[1] && is_zero[2])
                default_val = is_zero[3] ? 0 : 1;
        else if (is_one[0] && is_one[1] && is_one[2])
                default_val = is_zero[3] ? 2 : 3;
        else
                return false;
 
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to