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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2020-01-14
     Ever confirmed|0                           |1

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Global CTORs are not gimplified at all, we have to work hard in
canonicalize_constructor_val to make it "valid".  Like

  /* In CONSTRUCTORs we may see unfolded constants like (int (*) ()) 0.  */
  if (TREE_CODE (cval) == INTEGER_CST)
    {
      if (TREE_OVERFLOW_P (cval))
        cval = drop_tree_overflow (cval);
      if (!useless_type_conversion_p (TREE_TYPE (orig_cval), TREE_TYPE (cval)))
        cval = fold_convert (TREE_TYPE (orig_cval), cval);
      return cval;
    }

(const char *) "" + 6; looks like it should be handled by

  if (TREE_CODE (cval) == POINTER_PLUS_EXPR
      && TREE_CODE (TREE_OPERAND (cval, 1)) == INTEGER_CST)
    {
      tree ptr = TREE_OPERAND (cval, 0);
      if (is_gimple_min_invariant (ptr))
        cval = build1_loc (EXPR_LOCATION (cval),
                           ADDR_EXPR, TREE_TYPE (ptr),
                           fold_build2 (MEM_REF, TREE_TYPE (TREE_TYPE (ptr)),
                                        ptr,
                                        fold_convert (ptr_type_node,
                                                      TREE_OPERAND (cval,
1))));
    }

but we need another STRIP_NOPS before the is_gimple_min_invariant (ptr) check
on ptr I guess?

Btw, on trunk I see it optimized, maybe some recent CTOR "fixing" fixed it
again?  Can you double-check?

If it's fixed again I suggest to add the testcase (ck should be elided
in the assembly?)

Reply via email to