r300: don't try to use inline constants instead of constant swizzles
authorPavel Ondračka <pavel.ondracka@gmail.com>
Thu, 19 May 2022 10:38:01 +0000 (12:38 +0200)
committerMarge Bot <emma+marge@anholt.net>
Sun, 5 Jun 2022 21:38:36 +0000 (21:38 +0000)
It doesn't make sense and was not working anyway. This was spotted
by Filip Gawin in https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13978
however the fix there was IMO just papering over the problem.

I don't believe that this could manifest as a real issues, because
when all of the swizzles were constant the file would be set to
RC_FILE_NONE already. So in theory this could lead to an issue only
in the close to impossible circumstance that the out of bounds memory
read by constant->u.Immediate[swz] would end with the same exact value
as another inlineable constant in different channel. However in some
circumstances it would lead to following valgrind warnings:

 Conditional jump or move depends on uninitialised value(s)
    at 0x5D4E690: ieee_754_to_r300_float (radeon_inline_literals.c:61)
    by 0x5D4E690: rc_inline_literals (radeon_inline_literals.c:133)
    by 0x5D3877A: rc_run_compiler_passes (radeon_compiler.c:436)
    by 0x5D38821: rc_run_compiler (radeon_compiler.c:458)
    by 0x5D4AF63: r3xx_compile_fragment_program (r3xx_fragprog.c:139)
    by 0x5D48377: r300_translate_fragment_shader (r300_fs.c:499)
    by 0x5D491B0: r300_pick_fragment_shader (r300_fs.c:601)
    by 0x5D2BFEE: r300_create_fs_state (r300_state.c:1072)
    by 0x57DDC36: st_create_nir_shader (st_program.c:538)
    by 0x57DF10E: st_create_fp_variant (st_program.c:1056)
    by 0x57E057C: st_get_fp_variant (st_program.c:1102)
    by 0x57E0AB1: st_precompile_shader_variant (st_program.c:1287)
    by 0x57E0AB1: st_finalize_program (st_program.c:1333)
    by 0x57CB6F3: st_link_nir (st_glsl_to_nir.cpp:958)

Signed-off-by: Pavel Ondračka <pavel.ondracka@gmail.com>
Reviewed-by: Filip Gawin <filip@gawin.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16657>

src/gallium/drivers/r300/compiler/radeon_inline_literals.c

index c419f7c..d1f2c4b 100644 (file)
@@ -126,6 +126,11 @@ void rc_inline_literals(struct radeon_compiler *c, void *user)
                                if (swz == RC_SWIZZLE_UNUSED) {
                                        continue;
                                }
+                               /* Don't try to inline constant swizzle */
+                               if (swz >= RC_SWIZZLE_ZERO) {
+                                       use_literal = 0;
+                                       break;
+                               }
                                float_value = constant->u.Immediate[swz];
                                ret = ieee_754_to_r300_float(float_value,
                                                                &r300_float_tmp);