[Mesa-dev] [PATCH] glsl_to_tgsi: Skip useless comparison instructions.

2015-12-01 Thread Matt Turner
---
 src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 16 ++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp 
b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 7f58b44..89ad6cd 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -1655,7 +1655,13 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
 st_dst_reg temp_dst = st_dst_reg(temp);
 st_src_reg temp1 = st_src_reg(temp), temp2 = st_src_reg(temp);
 
-emit_asm(ir, TGSI_OPCODE_SEQ, st_dst_reg(temp), op[0], op[1]);
+if (ir->operands[0]->type->is_boolean() &&
+ir->operands[1]->as_constant() &&
+ir->operands[1]->as_constant()->is_one()) {
+   emit_asm(ir, TGSI_OPCODE_MOV, st_dst_reg(temp), op[0]);
+} else {
+   emit_asm(ir, TGSI_OPCODE_SEQ, st_dst_reg(temp), op[0], op[1]);
+}
 
 /* Emit 1-3 AND operations to combine the SEQ results. */
 switch (ir->operands[0]->type->vector_elements) {
@@ -1708,7 +1714,13 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
  st_src_reg temp = get_temp(native_integers ?
 glsl_type::uvec4_type :
 glsl_type::vec4_type);
- emit_asm(ir, TGSI_OPCODE_SNE, st_dst_reg(temp), op[0], op[1]);
+ if (ir->operands[0]->type->is_boolean() &&
+ ir->operands[1]->as_constant() &&
+ ir->operands[1]->as_constant()->is_zero()) {
+emit_asm(ir, TGSI_OPCODE_MOV, st_dst_reg(temp), op[0]);
+ } else {
+emit_asm(ir, TGSI_OPCODE_SNE, st_dst_reg(temp), op[0], op[1]);
+ }
 
  if (native_integers) {
 st_dst_reg temp_dst = st_dst_reg(temp);
-- 
2.4.9

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] glsl_to_tgsi: Skip useless comparison instructions.

2015-12-01 Thread Ilia Mirkin
On Tue, Dec 1, 2015 at 8:12 PM, Matt Turner  wrote:
> ---
>  src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 16 ++--
>  1 file changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp 
> b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index 7f58b44..89ad6cd 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -1655,7 +1655,13 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
>  st_dst_reg temp_dst = st_dst_reg(temp);
>  st_src_reg temp1 = st_src_reg(temp), temp2 = st_src_reg(temp);
>
> -emit_asm(ir, TGSI_OPCODE_SEQ, st_dst_reg(temp), op[0], op[1]);
> +if (ir->operands[0]->type->is_boolean() &&
> +ir->operands[1]->as_constant() &&
> +ir->operands[1]->as_constant()->is_one()) {
> +   emit_asm(ir, TGSI_OPCODE_MOV, st_dst_reg(temp), op[0]);
> +} else {
> +   emit_asm(ir, TGSI_OPCODE_SEQ, st_dst_reg(temp), op[0], op[1]);
> +}
>
>  /* Emit 1-3 AND operations to combine the SEQ results. */
>  switch (ir->operands[0]->type->vector_elements) {
> @@ -1708,7 +1714,13 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
>   st_src_reg temp = get_temp(native_integers ?
>  glsl_type::uvec4_type :
>  glsl_type::vec4_type);
> - emit_asm(ir, TGSI_OPCODE_SNE, st_dst_reg(temp), op[0], op[1]);
> + if (ir->operands[0]->type->is_boolean() &&
> + ir->operands[1]->as_constant() &&
> + ir->operands[1]->as_constant()->is_zero()) {
> +emit_asm(ir, TGSI_OPCODE_MOV, st_dst_reg(temp), op[0]);
> + } else {
> +emit_asm(ir, TGSI_OPCODE_SNE, st_dst_reg(temp), op[0], op[1]);
> + }
>
>   if (native_integers) {
>  st_dst_reg temp_dst = st_dst_reg(temp);

Reviewed-by: Ilia Mirkin 

I'd feel a little better if you double-checked that a shader_test that
hits this continues to pass with llvmpipe or softpipe.

Thanks,

  -ilia
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] glsl_to_tgsi: Skip useless comparison instructions.

2015-12-01 Thread Matt Turner
On Tue, Dec 1, 2015 at 5:17 PM, Ilia Mirkin  wrote:
> On Tue, Dec 1, 2015 at 8:12 PM, Matt Turner  wrote:
>> ---
>>  src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 16 ++--
>>  1 file changed, 14 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp 
>> b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>> index 7f58b44..89ad6cd 100644
>> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>> @@ -1655,7 +1655,13 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
>>  st_dst_reg temp_dst = st_dst_reg(temp);
>>  st_src_reg temp1 = st_src_reg(temp), temp2 = st_src_reg(temp);
>>
>> -emit_asm(ir, TGSI_OPCODE_SEQ, st_dst_reg(temp), op[0], op[1]);
>> +if (ir->operands[0]->type->is_boolean() &&
>> +ir->operands[1]->as_constant() &&
>> +ir->operands[1]->as_constant()->is_one()) {
>> +   emit_asm(ir, TGSI_OPCODE_MOV, st_dst_reg(temp), op[0]);
>> +} else {
>> +   emit_asm(ir, TGSI_OPCODE_SEQ, st_dst_reg(temp), op[0], 
>> op[1]);
>> +}
>>
>>  /* Emit 1-3 AND operations to combine the SEQ results. */
>>  switch (ir->operands[0]->type->vector_elements) {
>> @@ -1708,7 +1714,13 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
>>   st_src_reg temp = get_temp(native_integers ?
>>  glsl_type::uvec4_type :
>>  glsl_type::vec4_type);
>> - emit_asm(ir, TGSI_OPCODE_SNE, st_dst_reg(temp), op[0], op[1]);
>> + if (ir->operands[0]->type->is_boolean() &&
>> + ir->operands[1]->as_constant() &&
>> + ir->operands[1]->as_constant()->is_zero()) {
>> +emit_asm(ir, TGSI_OPCODE_MOV, st_dst_reg(temp), op[0]);
>> + } else {
>> +emit_asm(ir, TGSI_OPCODE_SNE, st_dst_reg(temp), op[0], op[1]);
>> + }
>>
>>   if (native_integers) {
>>  st_dst_reg temp_dst = st_dst_reg(temp);
>
> Reviewed-by: Ilia Mirkin 
>
> I'd feel a little better if you double-checked that a shader_test that
> hits this continues to pass with llvmpipe or softpipe.

I tested vs-all-bvec4-using-if.shader_test and
vs-any-bvec4-using-if.shader_test on llvmpipe. They both pass and drop
an instruction.
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev