diff mbox series

Fix prepare_cmp_insn BLKmode handling (PR target/89186)

Message ID 20190205084823.GQ2135@tucnak
State New
Headers show
Series Fix prepare_cmp_insn BLKmode handling (PR target/89186) | expand

Commit Message

Jakub Jelinek Feb. 5, 2019, 8:48 a.m. UTC
Hi!

Like the other emit_*_via_libcall functions, emit_block_comp_via_libcall
expects to be called with the MEM rtxes, not their addresses.
E.g. emit_block_op_via_libcall does:
  dst_addr = copy_addr_to_reg (XEXP (dst, 0));
  dst_addr = convert_memory_address (ptr_mode, dst_addr);
  dst_tree = make_tree (ptr_type_node, dst_addr);
  
  src_addr = copy_addr_to_reg (XEXP (src, 0));
  src_addr = convert_memory_address (ptr_mode, src_addr);
  src_tree = make_tree (ptr_type_node, src_addr);
prepare_cmp_insn doesn't call it with the MEMs, but their addresses, so it
is either a wrong-code issue before (e.g. it was passing (plus (reg virtual...)
(const_int N)) and (plus (reg virtual...) (const_int M)) on the following
testcase, so it took (reg virtual...) in both cases as the address to
compare, or with the recent additions to emit_block_op_via_libcall an ICE.

Unfortunately on the following testcase where it ICEs, the BLKmode
comparison is there in dead code and so the return value doesn't matter, so
all I can show is that it doesn't ICE anymore and that it calls memcmp with
different addresses where previously it called them with the same addresses.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 

2019-02-05  Jakub Jelinek  <jakub@redhat.com>

	PR target/89186
	* optabs.c (prepare_cmp_insn): Pass x and y to
	emit_block_comp_via_libcall rather than XEXP (x, 0) and XEXP (y, 0).

	* g++.dg/ext/vector36.C: New test.


	Jakub

Comments

Richard Biener Feb. 5, 2019, 9:03 a.m. UTC | #1
On Tue, 5 Feb 2019, Jakub Jelinek wrote:

> Hi!
> 
> Like the other emit_*_via_libcall functions, emit_block_comp_via_libcall
> expects to be called with the MEM rtxes, not their addresses.
> E.g. emit_block_op_via_libcall does:
>   dst_addr = copy_addr_to_reg (XEXP (dst, 0));
>   dst_addr = convert_memory_address (ptr_mode, dst_addr);
>   dst_tree = make_tree (ptr_type_node, dst_addr);
>   
>   src_addr = copy_addr_to_reg (XEXP (src, 0));
>   src_addr = convert_memory_address (ptr_mode, src_addr);
>   src_tree = make_tree (ptr_type_node, src_addr);
> prepare_cmp_insn doesn't call it with the MEMs, but their addresses, so it
> is either a wrong-code issue before (e.g. it was passing (plus (reg virtual...)
> (const_int N)) and (plus (reg virtual...) (const_int M)) on the following
> testcase, so it took (reg virtual...) in both cases as the address to
> compare, or with the recent additions to emit_block_op_via_libcall an ICE.
> 
> Unfortunately on the following testcase where it ICEs, the BLKmode
> comparison is there in dead code and so the return value doesn't matter, so
> all I can show is that it doesn't ICE anymore and that it calls memcmp with
> different addresses where previously it called them with the same addresses.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 

OK.

Richard.

> 2019-02-05  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR target/89186
> 	* optabs.c (prepare_cmp_insn): Pass x and y to
> 	emit_block_comp_via_libcall rather than XEXP (x, 0) and XEXP (y, 0).
> 
> 	* g++.dg/ext/vector36.C: New test.
> 
> --- gcc/optabs.c.jj	2019-01-22 10:11:00.960386744 +0100
> +++ gcc/optabs.c	2019-02-04 12:40:45.881211716 +0100
> @@ -3917,7 +3917,7 @@ prepare_cmp_insn (rtx x, rtx y, enum rtx
>  	goto fail;
>  
>        /* Otherwise call a library function.  */
> -      result = emit_block_comp_via_libcall (XEXP (x, 0), XEXP (y, 0), size);
> +      result = emit_block_comp_via_libcall (x, y, size);
>  
>        x = result;
>        y = const0_rtx;
> --- gcc/testsuite/g++.dg/ext/vector36.C.jj	2019-02-04 13:25:15.724616481 +0100
> +++ gcc/testsuite/g++.dg/ext/vector36.C	2019-02-04 13:26:13.099655912 +0100
> @@ -0,0 +1,6 @@
> +// PR target/89186
> +// { dg-do compile }
> +// { dg-options "-fnon-call-exceptions" }
> +// { dg-additional-options "-mno-sse" { target i?86-*-* x86_64-*-* } }
> +
> +#include "vector27.C"
> 
> 	Jakub
> 
>
diff mbox series

Patch

--- gcc/optabs.c.jj	2019-01-22 10:11:00.960386744 +0100
+++ gcc/optabs.c	2019-02-04 12:40:45.881211716 +0100
@@ -3917,7 +3917,7 @@  prepare_cmp_insn (rtx x, rtx y, enum rtx
 	goto fail;
 
       /* Otherwise call a library function.  */
-      result = emit_block_comp_via_libcall (XEXP (x, 0), XEXP (y, 0), size);
+      result = emit_block_comp_via_libcall (x, y, size);
 
       x = result;
       y = const0_rtx;
--- gcc/testsuite/g++.dg/ext/vector36.C.jj	2019-02-04 13:25:15.724616481 +0100
+++ gcc/testsuite/g++.dg/ext/vector36.C	2019-02-04 13:26:13.099655912 +0100
@@ -0,0 +1,6 @@ 
+// PR target/89186
+// { dg-do compile }
+// { dg-options "-fnon-call-exceptions" }
+// { dg-additional-options "-mno-sse" { target i?86-*-* x86_64-*-* } }
+
+#include "vector27.C"