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