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

--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
So, do we want something like
--- gcc/gimple-fold.cc.jj       2023-11-02 12:15:12.205998817 +0100
+++ gcc/gimple-fold.cc  2023-11-30 20:24:01.092095623 +0100
@@ -5083,12 +5083,16 @@ gimple_fold_builtin (gimple_stmt_iterato
       return gimple_fold_builtin_bzero (gsi);

     case BUILT_IN_MEMSET:
+      if (!optimize)
+       return false;
       return gimple_fold_builtin_memset (gsi,
                                         gimple_call_arg (stmt, 1),
                                         gimple_call_arg (stmt, 2));
     case BUILT_IN_MEMCPY:
     case BUILT_IN_MEMPCPY:
     case BUILT_IN_MEMMOVE:
+      if (!optimize)
+       return false;
       return gimple_fold_builtin_memory_op (gsi, gimple_call_arg (stmt, 0),
                                            gimple_call_arg (stmt, 1), fcode);
     case BUILT_IN_SPRINTF_CHK:
(and repeat for many other builtins)?
I'm afraid we can't do if (!optimize) return false; for all builtins in
gimple_fold_builtin, because some builtins by design must be always folded and
never expand.  E.g. __builtin_clear_padding,
__builtin_{clz,ctz,clrsb,ffs,popcount,parity}g,
__builtin_{add,sub,mul}_overflow{,_p} and many others.

expand_builtin has
  /* When not optimizing, generate calls to library functions for a certain
     set of builtins.  */
  if (!optimize
      && !called_as_built_in (fndecl)
      && fcode != BUILT_IN_FORK
      && fcode != BUILT_IN_EXECL
      && fcode != BUILT_IN_EXECV
      && fcode != BUILT_IN_EXECLP
      && fcode != BUILT_IN_EXECLE
      && fcode != BUILT_IN_EXECVP
      && fcode != BUILT_IN_EXECVE
      && fcode != BUILT_IN_CLEAR_CACHE
      && !ALLOCA_FUNCTION_CODE_P (fcode)
      && fcode != BUILT_IN_FREE
      && (fcode != BUILT_IN_MEMSET
          || !(flag_inline_stringops & ILSOP_MEMSET))
      && (fcode != BUILT_IN_MEMCPY
          || !(flag_inline_stringops & ILSOP_MEMCPY))
      && (fcode != BUILT_IN_MEMMOVE
          || !(flag_inline_stringops & ILSOP_MEMMOVE))
      && (fcode != BUILT_IN_MEMCMP
          || !(flag_inline_stringops & ILSOP_MEMCMP)))
    return expand_call (exp, target, ignore);
Perhaps just a general
  if (!optimize && !called_as_built_in (fndecl))
    return false;
at the start of gimple_fold_builtin?  Or do we want to let some exceptions?
Do we also apply GIMPLE match.pd simplification at -O0?

Reply via email to