diff --git a/src/amd/compiler/tests/test_d3d11_derivs.cpp b/src/amd/compiler/tests/test_d3d11_derivs.cpp index ca2ec72ebbc..d48bc55a5d3 100644 --- a/src/amd/compiler/tests/test_d3d11_derivs.cpp +++ b/src/amd/compiler/tests/test_d3d11_derivs.cpp @@ -460,10 +460,10 @@ BEGIN_TEST(d3d11_derivs.cube_array) PipelineBuilder pbld(get_vk_device(GFX10_3)); pbld.add_vsfs(vs, fs); - //>> v1: %layer = v_rndne_f32 (kill)%_ //>> v1: %face = v_cubeid_f32 (kill)%_, (kill)%_, (kill)%_ //>> v1: %x = v_fmaak_f32 (kill)%_, %_, 0x3fc00000 //>> v1: %y = v_fmaak_f32 (kill)%_, (kill)%_, 0x3fc00000 + //>> v1: %layer = v_rndne_f32 (kill)%_ //>> v1: %face_layer = v_fmamk_f32 (kill)%layer, (kill)%face, 0x41000000 //>> lv3: %wqm = p_start_linear_vgpr (kill)%x, (kill)%y, (kill)%face_layer //>> BB1 @@ -473,14 +473,15 @@ BEGIN_TEST(d3d11_derivs.cube_array) //>> p_end_linear_vgpr (latekill)(kill)%wqm pbld.print_ir(VK_SHADER_STAGE_FRAGMENT_BIT, "ACO IR"); - //>> v_rndne_f32_e32 v#rl, v#_ ; $_ //>> v_cubeid_f32 v#rf, v#_, v#_, v#_ ; $_ $_ - //>> v_fmamk_f32 v#rlf_tmp, v#rl, 0x41000000, v#rf ; $_ $_ + //>> v_fmaak_f32 v#rx_tmp, v#_, v#_, 0x3fc00000 ; $_ $_ //>> v_fmaak_f32 v#ry_tmp, v#_, v#_, 0x3fc00000 ; $_ $_ //>> v_mov_b32_e32 v#ry, v#ry_tmp ; $_ - //>> v_mov_b32_e32 v#rlf, v#rlf_tmp ; $_ + //>> v_fmamk_f32 v#rlf_tmp, v#rl, 0x41000000, v#rf ; $_ $_ //>> v_mov_b32_e32 v#rx, v#rx_tmp ; $_ + //>> v_mov_b32_e32 v#rlf, v#rlf_tmp ; $_ + //>> BB1: //; success = rx+1 == ry and rx+2 == rlf //>> image_sample v[#_:#_], v[#rx:#rlf], s[#_:#_], s[#_:#_] dmask:0xf dim:SQ_RSRC_IMG_CUBE ; $_ $_ diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 5e841089385..076a627ceb4 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -722,9 +722,14 @@ radv_postprocess_nir(struct radv_device *device, const struct radv_graphics_stat sink_opts |= nir_move_comparisons | nir_move_load_ubo | nir_move_load_ssbo | nir_move_alu; NIR_PASS(_, stage->nir, nir_opt_sink, sink_opts); - nir_move_options move_opts = - nir_move_const_undef | nir_move_load_ubo | nir_move_load_input | nir_move_comparisons | nir_move_copies; + nir_move_options move_opts = nir_move_const_undef | nir_move_load_ubo | nir_move_load_input | + nir_move_comparisons | nir_move_copies | nir_move_alu; NIR_PASS(_, stage->nir, nir_opt_move, move_opts); + + /* Run nir_opt_move again to make sure that comparision are as close as possible to the first use to prevent SCC + * spilling. + */ + NIR_PASS(_, stage->nir, nir_opt_move, nir_move_comparisons); } }