[Bug tree-optimization/87314] pointless comparison of malloc result to a string not eliminated

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Thu Jan 10 09:26:00 GMT 2019


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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot gnu.org

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
Created attachment 45399
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=45399&action=edit
patch for the string cases

OK, these special cases could be handled easily.  They should already
be covered by

/* When the addresses are not directly of decls compare base and offset.
   This implements some remaining parts of fold_comparison address
   comparisons but still no complete part of it.  Still it is good
   enough to make fold_stmt not regress when not dispatching to fold_binary. 
*/
(for cmp (simple_comparison)
 (simplify
  (cmp (convert1?@2 addr@0) (convert2? addr@1))
  (with

but we fall into

      (if (equal == 0
           && DECL_P (base0) && DECL_P (base1)
           /* If we compare this as integers require equal offset.  */
           && (!INTEGRAL_TYPE_P (TREE_TYPE (@2))
               || known_eq (off0, off1)))
       (switch
        (if (cmp == EQ_EXPR)
         { constant_boolean_node (false, type); })
        (if (cmp == NE_EXPR)
         { constant_boolean_node (true, type); })))))))))

which only handles decl vs. decl.

I'm not sure how to handle "foo" ==/!= "foo" though, dependent on string
merging they could be either equal or not equal.  I guess similar
for "foobar"+3 and "bar"?

So sth like the attached which is conservative about string-merging (delaying
to runtime).


More information about the Gcc-bugs mailing list