* [PATCH] Fix ICE with builtin folding (PR tree-optimization/69156)
@ 2016-01-13 17:53 Jakub Jelinek
2016-01-13 18:58 ` Richard Biener
0 siblings, 1 reply; 2+ messages in thread
From: Jakub Jelinek @ 2016-01-13 17:53 UTC (permalink / raw)
To: Richard Biener; +Cc: gcc-patches
Hi!
As discussed in the PR and on IRC, some places in gimple-fold.c/match.pd
rely on the fact that if gimple_builtin_call_types_compatible_p
succeeds, then it should be ok to pass arguments and read lhs without
type conversions. But, currently this function uses validate_type, which is
a very weak type compatibility check.
This patch instead requires standard middle-end type compatibility.
Bootstrap/regtest of the gimple.c portion of the patch revealed a bug in
value-prof.c, which has been passing constant last argument to various
stringop functions in incompatible type to what the builtin wants, so I've
fixed that too.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2016-01-13 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/69156
* gimple.c (validate_type): Removed.
(gimple_builtin_call_types_compatible_p): Use
useless_type_conversion_p instead of validate_type.
* value-prof.c (gimple_stringop_fixed_value): Fold
icall_size to correct type.
* gcc.dg/pr69156.c: New test.
--- gcc/gimple.c.jj 2016-01-04 14:55:53.000000000 +0100
+++ gcc/gimple.c 2016-01-13 13:15:07.194943810 +0100
@@ -2445,24 +2445,6 @@ gimple_ior_addresses_taken (bitmap addre
}
-/* Return true if TYPE1 and TYPE2 are compatible enough for builtin
- processing. */
-
-static bool
-validate_type (tree type1, tree type2)
-{
- if (INTEGRAL_TYPE_P (type1)
- && INTEGRAL_TYPE_P (type2))
- ;
- else if (POINTER_TYPE_P (type1)
- && POINTER_TYPE_P (type2))
- ;
- else if (TREE_CODE (type1)
- != TREE_CODE (type2))
- return false;
- return true;
-}
-
/* Return true when STMTs arguments and return value match those of FNDECL,
a decl of a builtin function. */
@@ -2473,7 +2455,8 @@ gimple_builtin_call_types_compatible_p (
tree ret = gimple_call_lhs (stmt);
if (ret
- && !validate_type (TREE_TYPE (ret), TREE_TYPE (TREE_TYPE (fndecl))))
+ && !useless_type_conversion_p (TREE_TYPE (ret),
+ TREE_TYPE (TREE_TYPE (fndecl))))
return false;
tree targs = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
@@ -2484,7 +2467,7 @@ gimple_builtin_call_types_compatible_p (
if (!targs)
return true;
tree arg = gimple_call_arg (stmt, i);
- if (!validate_type (TREE_TYPE (arg), TREE_VALUE (targs)))
+ if (!useless_type_conversion_p (TREE_VALUE (targs), TREE_TYPE (arg)))
return false;
targs = TREE_CHAIN (targs);
}
--- gcc/value-prof.c.jj 2016-01-04 14:55:53.000000000 +0100
+++ gcc/value-prof.c 2016-01-13 13:14:56.139094912 +0100
@@ -1697,7 +1697,8 @@ gimple_stringop_fixed_value (gcall *vcal
gimple_set_vuse (vcall_stmt, NULL);
update_stmt (vcall_stmt);
icall_stmt = as_a <gcall *> (gimple_copy (vcall_stmt));
- gimple_call_set_arg (icall_stmt, size_arg, icall_size);
+ gimple_call_set_arg (icall_stmt, size_arg,
+ fold_convert (optype, icall_size));
gsi_insert_before (&gsi, icall_stmt, GSI_SAME_STMT);
/* Fix CFG. */
--- gcc/testsuite/gcc.dg/pr69156.c.jj 2016-01-13 10:42:50.465247811 +0100
+++ gcc/testsuite/gcc.dg/pr69156.c 2016-01-13 10:42:50.465247811 +0100
@@ -0,0 +1,10 @@
+/* PR tree-optimization/69156 */
+/* { dg-do compile } */
+/* { dg-options "-O1 -fno-tree-ccp" } */
+
+_Bool
+foo ()
+{
+ _Bool (*f) () = __builtin_abs; /* { dg-warning "initialization from incompatible pointer type" } */
+ return f (0);
+}
Jakub
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] Fix ICE with builtin folding (PR tree-optimization/69156)
2016-01-13 17:53 [PATCH] Fix ICE with builtin folding (PR tree-optimization/69156) Jakub Jelinek
@ 2016-01-13 18:58 ` Richard Biener
0 siblings, 0 replies; 2+ messages in thread
From: Richard Biener @ 2016-01-13 18:58 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: gcc-patches
On January 13, 2016 6:53:42 PM GMT+01:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>As discussed in the PR and on IRC, some places in
>gimple-fold.c/match.pd
>rely on the fact that if gimple_builtin_call_types_compatible_p
>succeeds, then it should be ok to pass arguments and read lhs without
>type conversions. But, currently this function uses validate_type,
>which is
>a very weak type compatibility check.
>
>This patch instead requires standard middle-end type compatibility.
>Bootstrap/regtest of the gimple.c portion of the patch revealed a bug
>in
>value-prof.c, which has been passing constant last argument to various
>stringop functions in incompatible type to what the builtin wants, so
>I've
>fixed that too.
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK.
Richard.
>2016-01-13 Jakub Jelinek <jakub@redhat.com>
>
> PR tree-optimization/69156
> * gimple.c (validate_type): Removed.
> (gimple_builtin_call_types_compatible_p): Use
> useless_type_conversion_p instead of validate_type.
> * value-prof.c (gimple_stringop_fixed_value): Fold
> icall_size to correct type.
>
> * gcc.dg/pr69156.c: New test.
>
>--- gcc/gimple.c.jj 2016-01-04 14:55:53.000000000 +0100
>+++ gcc/gimple.c 2016-01-13 13:15:07.194943810 +0100
>@@ -2445,24 +2445,6 @@ gimple_ior_addresses_taken (bitmap addre
> }
>
>
>-/* Return true if TYPE1 and TYPE2 are compatible enough for builtin
>- processing. */
>-
>-static bool
>-validate_type (tree type1, tree type2)
>-{
>- if (INTEGRAL_TYPE_P (type1)
>- && INTEGRAL_TYPE_P (type2))
>- ;
>- else if (POINTER_TYPE_P (type1)
>- && POINTER_TYPE_P (type2))
>- ;
>- else if (TREE_CODE (type1)
>- != TREE_CODE (type2))
>- return false;
>- return true;
>-}
>-
>/* Return true when STMTs arguments and return value match those of
>FNDECL,
> a decl of a builtin function. */
>
>@@ -2473,7 +2455,8 @@ gimple_builtin_call_types_compatible_p (
>
> tree ret = gimple_call_lhs (stmt);
> if (ret
>- && !validate_type (TREE_TYPE (ret), TREE_TYPE (TREE_TYPE
>(fndecl))))
>+ && !useless_type_conversion_p (TREE_TYPE (ret),
>+ TREE_TYPE (TREE_TYPE (fndecl))))
> return false;
>
> tree targs = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
>@@ -2484,7 +2467,7 @@ gimple_builtin_call_types_compatible_p (
> if (!targs)
> return true;
> tree arg = gimple_call_arg (stmt, i);
>- if (!validate_type (TREE_TYPE (arg), TREE_VALUE (targs)))
>+ if (!useless_type_conversion_p (TREE_VALUE (targs), TREE_TYPE
>(arg)))
> return false;
> targs = TREE_CHAIN (targs);
> }
>--- gcc/value-prof.c.jj 2016-01-04 14:55:53.000000000 +0100
>+++ gcc/value-prof.c 2016-01-13 13:14:56.139094912 +0100
>@@ -1697,7 +1697,8 @@ gimple_stringop_fixed_value (gcall *vcal
> gimple_set_vuse (vcall_stmt, NULL);
> update_stmt (vcall_stmt);
> icall_stmt = as_a <gcall *> (gimple_copy (vcall_stmt));
>- gimple_call_set_arg (icall_stmt, size_arg, icall_size);
>+ gimple_call_set_arg (icall_stmt, size_arg,
>+ fold_convert (optype, icall_size));
> gsi_insert_before (&gsi, icall_stmt, GSI_SAME_STMT);
>
> /* Fix CFG. */
>--- gcc/testsuite/gcc.dg/pr69156.c.jj 2016-01-13 10:42:50.465247811
>+0100
>+++ gcc/testsuite/gcc.dg/pr69156.c 2016-01-13 10:42:50.465247811 +0100
>@@ -0,0 +1,10 @@
>+/* PR tree-optimization/69156 */
>+/* { dg-do compile } */
>+/* { dg-options "-O1 -fno-tree-ccp" } */
>+
>+_Bool
>+foo ()
>+{
>+ _Bool (*f) () = __builtin_abs; /* { dg-warning "initialization from
>incompatible pointer type" } */
>+ return f (0);
>+}
>
> Jakub
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2016-01-13 18:58 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-01-13 17:53 [PATCH] Fix ICE with builtin folding (PR tree-optimization/69156) Jakub Jelinek
2016-01-13 18:58 ` Richard Biener
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).