public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r10-10670] optabs: Don't create pseudos in prepare_cmp_insn when not allowed [PR102478]
@ 2022-05-10  8:23 Jakub Jelinek
  0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2022-05-10  8:23 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:42d66df40b5a12e1b7e77f0901ee8a6710cabd5f

commit r10-10670-g42d66df40b5a12e1b7e77f0901ee8a6710cabd5f
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Fri Jan 21 11:16:50 2022 +0100

    optabs: Don't create pseudos in prepare_cmp_insn when not allowed [PR102478]
    
    cond traps can be created during ce3 after reload (and e.g. PR103028
    recently fixed some ce3 cond trap related bug, so I think often that
    works fine and we shouldn't disable cond traps after RA altogether),
    but it calls prepare_cmp_insn.  This function can fail, so I don't
    see why we couldn't make it work after RA (in most cases it already
    just works).  The first hunk is just an optimization which doesn't
    make sense after RA, so I've guarded it with can_create_pseudo_p.
    The second hunk is just a theoretical case, I don't have a testcase for it.
    prepare_cmp_insn has some other spots that can create pseudos, like when
    both operands have VOIDmode, or when it is BLKmode comparison, or
    not OPTAB_DIRECT, but I think none of that applies to ce3, we punt on
    BLKmode earlier, use OPTAB_DIRECT and shouldn't be comparing two
    VOIDmode CONST_INTs.
    
    2022-01-21  Jakub Jelinek  <jakub@redhat.com>
    
            PR rtl-optimization/102478
            * optabs.c (prepare_cmp_insn): If !can_create_pseudo_p (), don't
            force_reg constants and for -fnon-call-exceptions fail if copy_to_reg
            would be needed.
    
            * gcc.dg/pr102478.c: New test.
    
    (cherry picked from commit c2d9159717b474f9c06dde4d32b48b87164deb50)

Diff:
---
 gcc/optabs.c                    |  8 ++++++--
 gcc/testsuite/gcc.dg/pr102478.c | 29 +++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/gcc/optabs.c b/gcc/optabs.c
index 049a18ceb7c..64f23d2c293 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -3891,12 +3891,14 @@ prepare_cmp_insn (rtx x, rtx y, enum rtx_code comparison, rtx size,
   /* If we are optimizing, force expensive constants into a register.  */
   if (CONSTANT_P (x) && optimize
       && (rtx_cost (x, mode, COMPARE, 0, optimize_insn_for_speed_p ())
-          > COSTS_N_INSNS (1)))
+          > COSTS_N_INSNS (1))
+      && can_create_pseudo_p ())
     x = force_reg (mode, x);
 
   if (CONSTANT_P (y) && optimize
       && (rtx_cost (y, mode, COMPARE, 1, optimize_insn_for_speed_p ())
-          > COSTS_N_INSNS (1)))
+          > COSTS_N_INSNS (1))
+      && can_create_pseudo_p ())
     y = force_reg (mode, y);
 
 #if HAVE_cc0
@@ -3972,6 +3974,8 @@ prepare_cmp_insn (rtx x, rtx y, enum rtx_code comparison, rtx size,
      compare and branch in different basic blocks.  */
   if (cfun->can_throw_non_call_exceptions)
     {
+      if (!can_create_pseudo_p () && (may_trap_p (x) || may_trap_p (y)))
+	goto fail;
       if (may_trap_p (x))
 	x = copy_to_reg (x);
       if (may_trap_p (y))
diff --git a/gcc/testsuite/gcc.dg/pr102478.c b/gcc/testsuite/gcc.dg/pr102478.c
new file mode 100644
index 00000000000..43bc49b584d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr102478.c
@@ -0,0 +1,29 @@
+/* PR rtl-optimization/102478 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-if-conversion -Wno-div-by-zero" } */
+
+unsigned a, b, c;
+
+void
+foo (void)
+{
+  c |= __builtin_expect (65535 / a, 0) && 0 / 0;
+  b = 0;
+}
+
+void
+bar (void)
+{
+  if (a <= 65535)
+    __builtin_trap ();
+  b = 0;
+}
+
+void
+baz (void)
+{
+  if (a > 65535)
+    b = 0;
+  else
+    __builtin_trap ();
+}


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

only message in thread, other threads:[~2022-05-10  8:23 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-10  8:23 [gcc r10-10670] optabs: Don't create pseudos in prepare_cmp_insn when not allowed [PR102478] 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).