https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87188

--- Comment #21 from dave.anglin at bell dot net ---
On 2018-09-09 2:46 PM, rguenther at suse dot de wrote:
> In the last patch you replace arg0 || arg1 with arg0 & & arg1, that looks
> wrong. Otherwise the patch looks OK.
It was intentional.  See the comment in dojump.c:

   /* If function pointers need to be "canonicalized" before they can
      be reliably compared, then canonicalize them.
      Only do this if *both* sides of the comparison are function pointers.
      If one side isn't, we want a noncanonicalized comparison.  See PR
      middle-end/17564.  */
   if (targetm.have_canonicalize_funcptr_for_compare ()
       && POINTER_TYPE_P (TREE_TYPE (treeop0))
       && POINTER_TYPE_P (TREE_TYPE (treeop1))
       && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (treeop0)))
       && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (treeop1))))

Based on this, I thought that we could allow do_store_flag to output a 
"scc" instruction
when both sides weren't function or method pointers.

I just looked at the testcase for middle-end/17564.  I think we also 
have to handle
pointers to void types.  Looks like fix for 17564 was wrong...

I also missed updating a similar bit of code in match.pd with 
POINTER_TYPE_P and
FUNC_OR_METHOD_TYPE_P.

I'm not 100% certain about the need for the code in fold-const.c and 
match.pd.

Dave

Reply via email to