From 579ec9c311eb5176054b624f39c5c024605b58d6 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Sun, 26 Nov 2017 23:36:39 +0000 Subject: [PATCH] r600/sb: handle jump after target to end of program. (v2) This fixes hangs on cayman with tests/spec/arb_tessellation_shader/execution/trivial-tess-gs_no-gs-inputs.shader_test This has a single if/else in it, and when this peephole activated, it would set the jump target to NULL if there was no instruction after the final POP. This adds a NOP if we get a jump in this case, and seems to fix the hangs, so we have a valid target for the ELSE instruction to go to, instead of 0 (which causes infinite loops). v2: update last_cf correctly. (I had some other patches hide this) Cc: Signed-off-by: Dave Airlie --- src/gallium/drivers/r600/sb/sb_bc_finalize.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp b/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp index 82826a9..7f1dd0a 100644 --- a/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp +++ b/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp @@ -933,6 +933,11 @@ void bc_finalizer::cf_peephole() { cf_node *c = static_cast(*I); if (c->jump_after_target) { + if (c->jump_target->next == NULL) { + c->jump_target->insert_after(sh.create_cf(CF_OP_NOP)); + if (last_cf == c->jump_target) + last_cf = static_cast(c->jump_target->next); + } c->jump_target = static_cast(c->jump_target->next); c->jump_after_target = false; } -- 2.7.4