st_glsl_to_tgsi: check for the tail sentinel in merge_two_dsts
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 17 Nov 2017 19:01:50 +0000 (20:01 +0100)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Tue, 28 Nov 2017 08:31:33 +0000 (09:31 +0100)
This fixes yet another case where DFRACEXP has only one destination. Found
by address sanitizer.

Fixes tests/spec/arb_gpu_shader_fp64/execution/built-in-functions/fs-frexp-dvec4-only-mantissa.shader_test

Fixes: 3b666aa74795 ("st/glsl_to_tgsi: fix DFRACEXP with only one destination")
Acked-by: Marek Olšák <marek.olsak@amd.com>
src/mesa/state_tracker/st_glsl_to_tgsi.cpp

index 0772b736275461b5a08cee7d4b915728bf57e2b1..fa51fef343be7bb41e64b7a299cd18d65c6f3954 100644 (file)
@@ -5252,7 +5252,7 @@ glsl_to_tgsi_visitor::merge_two_dsts(void)
          defined = 0;
 
       inst2 = (glsl_to_tgsi_instruction *) inst->next;
-      do {
+      while (!inst2->is_tail_sentinel()) {
          if (inst->op == inst2->op &&
              inst2->dst[defined].file == PROGRAM_UNDEFINED &&
              inst->src[0].file == inst2->src[0].file &&
@@ -5261,9 +5261,9 @@ glsl_to_tgsi_visitor::merge_two_dsts(void)
              inst->src[0].swizzle == inst2->src[0].swizzle)
             break;
          inst2 = (glsl_to_tgsi_instruction *) inst2->next;
-      } while (inst2);
+      }
 
-      if (!inst2) {
+      if (inst2->is_tail_sentinel()) {
          /* Undefined destinations are not allowed, substitute with an unused
           * temporary register.
           */