public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-6858] go: Fix up go.test/test/fixedbugs/bug207.go failure [PR109258]
@ 2023-03-24 22:02 Jakub Jelinek
  0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2023-03-24 22:02 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:0849a188d539d78101a32deea63db4cb39fb55ac

commit r13-6858-g0849a188d539d78101a32deea63db4cb39fb55ac
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Fri Mar 24 23:02:08 2023 +0100

    go: Fix up go.test/test/fixedbugs/bug207.go failure [PR109258]
    
    The PR109086 r13-6690 inline_string_cmp change to
          if (diff != result)
            emit_move_insn (result, diff);
    regressed
    FAIL: go.test/test/fixedbugs/bug207.go,  -O2 -g  (internal compiler error: in emit_move_insn, at expr.cc:4224)
    The problem is the Go FE doesn't mark __builtin_memcmp as pure as other FEs,
    so we ended up with
      __builtin_memcmp (whatever, whateverelse, somesize);
    in the IL before expansion and the expansion ICEd on it.
    As the builtin calls a library function which is pure or is inline expanded
    as such, not marking it pure is an unnecessary pessimization from the FE
    side, keeping such dead calls in the IL if they aren't needed will not help
    anything.
    
    The following patch fixes that.  Initially I've added just DECL_PURE_P to
    it, but that unfortunately broke bootstrap, for __builtin_memcmp there is
    also __builtin_memcmp_eq registered by the middle-end code if not registered
    earlier and that one is registered with the usual flags (pure, nothrow,
    leaf), so if __builtin_memcmp from FE was just pure, it would appear in the
    IL as that it can raise exceptions and when folded into __builtin_memcmp_eq
    all of sudden it couldn't and we'd ICE in verification.
    
    I think tons of functions should have builtin_nothrow as well, but changing
    that wasn't necessary for this fix.
    
    2023-03-24  Jakub Jelinek  <jakub@redhat.com>
    
            PR middle-end/109258
            * go-gcc.cc (Gcc_backend): Add new static data members builtin_pure
            and builtin_nothrow.
            (Gcc_backend::Gcc_backend): Pass builtin_pure | builtin_nothrow for
            BUILT_IN_MEMCMP.
            (Gcc_backend::define_builtin): Handle builtin_pure and builtin_nothrow
            in flags.

Diff:
---
 gcc/go/go-gcc.cc | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/gcc/go/go-gcc.cc b/gcc/go/go-gcc.cc
index 07c34a58241..41ae9f83731 100644
--- a/gcc/go/go-gcc.cc
+++ b/gcc/go/go-gcc.cc
@@ -543,6 +543,8 @@ private:
   static const int builtin_const = 1 << 0;
   static const int builtin_noreturn = 1 << 1;
   static const int builtin_novops = 1 << 2;
+  static const int builtin_pure = 1 << 3;
+  static const int builtin_nothrow = 1 << 4;
 
   void
   define_builtin(built_in_function bcode, const char* name, const char* libname,
@@ -601,7 +603,7 @@ Gcc_backend::Gcc_backend()
 						const_ptr_type_node,
 						size_type_node,
 						NULL_TREE),
-		       0);
+		       builtin_pure | builtin_nothrow);
 
   // We use __builtin_memmove for copying data.
   this->define_builtin(BUILT_IN_MEMMOVE, "__builtin_memmove", "memmove",
@@ -3596,6 +3598,10 @@ Gcc_backend::define_builtin(built_in_function bcode, const char* name,
 				   libname, NULL_TREE);
   if ((flags & builtin_const) != 0)
     TREE_READONLY(decl) = 1;
+  if ((flags & builtin_pure) != 0)
+    DECL_PURE_P(decl) = 1;
+  if ((flags & builtin_nothrow) != 0)
+    TREE_NOTHROW (decl) = 1;
   if ((flags & builtin_noreturn) != 0)
     TREE_THIS_VOLATILE(decl) = 1;
   if ((flags & builtin_novops) != 0)
@@ -3608,6 +3614,10 @@ Gcc_backend::define_builtin(built_in_function bcode, const char* name,
 				  NULL, NULL_TREE);
       if ((flags & builtin_const) != 0)
 	TREE_READONLY(decl) = 1;
+      if ((flags & builtin_pure) != 0)
+	DECL_PURE_P(decl) = 1;
+      if ((flags & builtin_nothrow) != 0)
+	TREE_NOTHROW (decl) = 1;
       if ((flags & builtin_noreturn) != 0)
 	TREE_THIS_VOLATILE(decl) = 1;
       if ((flags & builtin_novops) != 0)

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-03-24 22:02 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-24 22:02 [gcc r13-6858] go: Fix up go.test/test/fixedbugs/bug207.go failure [PR109258] Jakub Jelinek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).