diff mbox

[4/5] Handle internal_fn in operand_equal_p

Message ID 54E9CFF3.6070908@mentor.com
State New
Headers show

Commit Message

Tom de Vries Feb. 22, 2015, 12:47 p.m. UTC
On 20-02-15 12:54, Richard Biener wrote:
> On Thu, 19 Feb 2015, Tom de Vries wrote:
>
>> On 19-02-15 14:07, Richard Biener wrote:
>>> On Thu, 19 Feb 2015, Jakub Jelinek wrote:
>>>
>>>> On Thu, Feb 19, 2015 at 01:44:46PM +0100, Richard Biener wrote:
>>>>> I'd call it a bug though, and we do have internal fns in
>>>>> generic already thus the issue is latent (with ubsan at least).
>>>>>
>>>>> Which means ok for trunk now.
>>>>
>>>> But the patch should better handle the internal calls right.
>>>> I.e. return 0 only if only one, not both CALL_EXPR_FNs are NULL,
>>>> or if both are NULL and CALL_EXPR_IFN is different, or if
>>>> call_expr_nargs is different.
>>>
>>> The question is whether generic call handling works (esp. call_expr_flags
>>> works correctly - the argument compare should work fine already).
>>>
>>> Tom - care to update the patch?
>>>
>>
>> I agree, the current patch is conservative and we can do betterns,
-
.
>> But I think it's wiser to do that as a stage1 follow-up, and commit this
>> conservative patch for stage4. Is that acceptable?
>
> Then just defer it for stage1 completely.  If a problem pops up with
> GCC 5 we can backport the proper patch together with a testcase.
>

Updated patch according to Jakub's comments, retested.

OK for stage1?

Thanks,
- Tom

Comments

Richard Biener Feb. 23, 2015, 9:03 a.m. UTC | #1
On Sun, 22 Feb 2015, Tom de Vries wrote:

> On 20-02-15 12:54, Richard Biener wrote:
> > On Thu, 19 Feb 2015, Tom de Vries wrote:
> > 
> > > On 19-02-15 14:07, Richard Biener wrote:
> > > > On Thu, 19 Feb 2015, Jakub Jelinek wrote:
> > > > 
> > > > > On Thu, Feb 19, 2015 at 01:44:46PM +0100, Richard Biener wrote:
> > > > > > I'd call it a bug though, and we do have internal fns in
> > > > > > generic already thus the issue is latent (with ubsan at least).
> > > > > > 
> > > > > > Which means ok for trunk now.
> > > > > 
> > > > > But the patch should better handle the internal calls right.
> > > > > I.e. return 0 only if only one, not both CALL_EXPR_FNs are NULL,
> > > > > or if both are NULL and CALL_EXPR_IFN is different, or if
> > > > > call_expr_nargs is different.
> > > > 
> > > > The question is whether generic call handling works (esp.
> > > > call_expr_flags
> > > > works correctly - the argument compare should work fine already).
> > > > 
> > > > Tom - care to update the patch?
> > > > 
> > > 
> > > I agree, the current patch is conservative and we can do betterns,
> -
> .
> > > But I think it's wiser to do that as a stage1 follow-up, and commit this
> > > conservative patch for stage4. Is that acceptable?
> > 
> > Then just defer it for stage1 completely.  If a problem pops up with
> > GCC 5 we can backport the proper patch together with a testcase.
> > 
> 
> Updated patch according to Jakub's comments, retested.
> 
> OK for stage1?

Ok.

Thanks,
Richard.
Tom de Vries Feb. 24, 2015, 12:21 p.m. UTC | #2
[ forwarding. for some reason, this email didn't make it to gcc-patches ml archive ]

-------- Forwarded Message --------
Subject: Re: [PATCH][4/5] Handle internal_fn in operand_equal_p
Date: Mon, 23 Feb 2015 10:03:34 +0100
From: Richard Biener <rguenther@suse.de>
To: Tom de Vries <Tom_deVries@mentor.com>
CC: Jakub Jelinek <jakub@redhat.com>, GCC Patches <gcc-patches@gcc.gnu.org>, 
Michael Matz <matz@suse.de>

On Sun, 22 Feb 2015, Tom de Vries wrote:

> On 20-02-15 12:54, Richard Biener wrote:
> > On Thu, 19 Feb 2015, Tom de Vries wrote:
> >
> > > On 19-02-15 14:07, Richard Biener wrote:
> > > > On Thu, 19 Feb 2015, Jakub Jelinek wrote:
> > > >
> > > > > On Thu, Feb 19, 2015 at 01:44:46PM +0100, Richard Biener wrote:
> > > > > > I'd call it a bug though, and we do have internal fns in
> > > > > > generic already thus the issue is latent (with ubsan at least).
> > > > > >
> > > > > > Which means ok for trunk now.
> > > > >
> > > > > But the patch should better handle the internal calls right.
> > > > > I.e. return 0 only if only one, not both CALL_EXPR_FNs are NULL,
> > > > > or if both are NULL and CALL_EXPR_IFN is different, or if
> > > > > call_expr_nargs is different.
> > > >
> > > > The question is whether generic call handling works (esp.
> > > > call_expr_flags
> > > > works correctly - the argument compare should work fine already).
> > > >
> > > > Tom - care to update the patch?
> > > >
> > >
> > > I agree, the current patch is conservative and we can do betterns,
> -
> .
> > > But I think it's wiser to do that as a stage1 follow-up, and commit this
> > > conservative patch for stage4. Is that acceptable?
> >
> > Then just defer it for stage1 completely.  If a problem pops up with
> > GCC 5 we can backport the proper patch together with a testcase.
> >
>
> Updated patch according to Jakub's comments, retested.
>
> OK for stage1?

Ok.

Thanks,
Richard.
diff mbox

Patch

2015-02-17  Tom de Vries  <tom@codesourcery.com>

	* fold-const.c (operand_equal_p): Handle INTERNAL_FNs.
	* calls.c (call_expr_flags): Same.
---
 gcc/calls.c      |  2 ++
 gcc/fold-const.c | 23 +++++++++++++++++++----
 2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/gcc/calls.c b/gcc/calls.c
index ec44624..2919464 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -847,6 +847,8 @@  call_expr_flags (const_tree t)
 
   if (decl)
     flags = flags_from_decl_or_type (decl);
+  else if (CALL_EXPR_FN (t) == NULL_TREE)
+    flags = internal_fn_flags (CALL_EXPR_IFN (t));
   else
     {
       t = TREE_TYPE (CALL_EXPR_FN (t));
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 8377120..3013adb 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -3032,11 +3032,26 @@  operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
       switch (TREE_CODE (arg0))
 	{
 	case CALL_EXPR:
-	  /* If the CALL_EXPRs call different functions, then they
-	     clearly can not be equal.  */
-	  if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
-				 flags))
+	  if ((CALL_EXPR_FN (arg0) == NULL_TREE)
+	      != (CALL_EXPR_FN (arg1) == NULL_TREE))
+	    /* If not both CALL_EXPRs are either internal or normal function
+	       functions, then they are not equal.  */
 	    return 0;
+	  else if (CALL_EXPR_FN (arg0) == NULL_TREE)
+	    {
+	      /* If the CALL_EXPRs call different internal functions, then they
+		 are not equal.  */
+	      if (CALL_EXPR_IFN (arg0) != CALL_EXPR_IFN (arg1))
+		return 0;
+	    }
+	  else
+	    {
+	      /* If the CALL_EXPRs call different functions, then they are not
+		 equal.  */
+	      if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
+				     flags))
+		return 0;
+	    }
 
 	  {
 	    unsigned int cef = call_expr_flags (arg0);
-- 
1.9.1