diff mbox

Fix ICE with -fcheck-pointer-bounds -mmpx (PR target/79633)

Message ID 20170221163757.GR1849@tucnak
State New
Headers show

Commit Message

Jakub Jelinek Feb. 21, 2017, 4:37 p.m. UTC
Hi!

This function accesses arguments of builtin call without checking
the right arguments are actually provided.  Fixed thusly,
bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

The is_gimple_call in there is meant as a performance thing, we could
call gimple_call_builtin_p first and then only check
gimple_call_with_bounds_p, but that would unnecessarily test compatibility
of arguments even for calls without bounds.

2017-02-21  Jakub Jelinek  <jakub@redhat.com>

	PR target/79633
	* tree-chkp-opt.c (chkp_optimize_string_function_calls): Use
	is_gimple_call instead of comparing gimple_code with GIMPLE_CALL.
	Use gimple_call_builtin_p.

	* gcc.target/i386/mpx/pr79633.c: New test.


	Jakub

Comments

Jeff Law Feb. 21, 2017, 5:41 p.m. UTC | #1
On 02/21/2017 09:37 AM, Jakub Jelinek wrote:
> Hi!
>
> This function accesses arguments of builtin call without checking
> the right arguments are actually provided.  Fixed thusly,
> bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> The is_gimple_call in there is meant as a performance thing, we could
> call gimple_call_builtin_p first and then only check
> gimple_call_with_bounds_p, but that would unnecessarily test compatibility
> of arguments even for calls without bounds.
>
> 2017-02-21  Jakub Jelinek  <jakub@redhat.com>
>
> 	PR target/79633
> 	* tree-chkp-opt.c (chkp_optimize_string_function_calls): Use
> 	is_gimple_call instead of comparing gimple_code with GIMPLE_CALL.
> 	Use gimple_call_builtin_p.
>
> 	* gcc.target/i386/mpx/pr79633.c: New test.
OK.
jeff
diff mbox

Patch

--- gcc/tree-chkp-opt.c.jj	2017-01-01 12:45:37.000000000 +0100
+++ gcc/tree-chkp-opt.c	2017-02-21 12:06:44.163025698 +0100
@@ -964,15 +964,12 @@  chkp_optimize_string_function_calls (voi
 	  gimple *stmt = gsi_stmt (i);
 	  tree fndecl;
 
-	  if (gimple_code (stmt) != GIMPLE_CALL
-	      || !gimple_call_with_bounds_p (stmt))
+	  if (!is_gimple_call (stmt)
+	      || !gimple_call_with_bounds_p (stmt)
+	      || !gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
 	    continue;
 
 	  fndecl = gimple_call_fndecl (stmt);
-
-	  if (!fndecl || DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_NORMAL)
-	    continue;
-
 	  if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MEMCPY_CHKP
 	      || DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MEMPCPY_CHKP
 	      || DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MEMMOVE_CHKP
--- gcc/testsuite/gcc.target/i386/mpx/pr79633.c.jj	2017-02-21 12:09:54.034537817 +0100
+++ gcc/testsuite/gcc.target/i386/mpx/pr79633.c	2017-02-21 12:09:29.000000000 +0100
@@ -0,0 +1,11 @@ 
+/* PR target/79633 */
+/* { dg-do compile } */
+/* { dg-options "-fcheck-pointer-bounds -mmpx -w -O2" } */
+
+extern void *memcpy ();
+
+void
+foo ()
+{
+  memcpy ();
+}