https://gcc.gnu.org/g:ecb6eba763e671490384e70df26a85051012e2d1

commit r16-9096-gecb6eba763e671490384e70df26a85051012e2d1
Author: Richard Biener <[email protected]>
Date:   Tue Jun 2 14:56:12 2026 +0200

    tree-optimization/125545 - reassoc insering after asm goto
    
    There's one case we can handle just fine which is when the asm goto
    has a single successor (it's fallthru edge, possibly shared with
    an asm goto label).  As we're using dominance based insertion
    point discovery we have to handle this case.
    
            PR tree-optimization/125545
            * tree-ssa-reassoc.cc (insert_stmt_after): Allow asm goto
            with a single successor.
    
            * gcc.dg/torture/pr125545.c: New testcase.
    
    (cherry picked from commit 31c818a7ff8f090e58379c52c7589f2e6e35de20)

Diff:
---
 gcc/testsuite/gcc.dg/torture/pr125545.c | 9 +++++++++
 gcc/tree-ssa-reassoc.cc                 | 3 ++-
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/gcc/testsuite/gcc.dg/torture/pr125545.c 
b/gcc/testsuite/gcc.dg/torture/pr125545.c
new file mode 100644
index 000000000000..084ce567851a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr125545.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+
+int b(int c)
+{
+  int a;
+  __asm__ goto("" : "=r"(a) : : : d);
+d:
+  return c && a != 42 && a >= 42;
+}
diff --git a/gcc/tree-ssa-reassoc.cc b/gcc/tree-ssa-reassoc.cc
index 7abbf195520b..e0fc80974929 100644
--- a/gcc/tree-ssa-reassoc.cc
+++ b/gcc/tree-ssa-reassoc.cc
@@ -1521,7 +1521,8 @@ insert_stmt_after (gimple *stmt, gimple *insert_point)
       return;
     }
   else if (gimple_code (insert_point) == GIMPLE_ASM
-          && gimple_asm_nlabels (as_a <gasm *> (insert_point)) != 0)
+          && gimple_asm_nlabels (as_a <gasm *> (insert_point)) != 0
+          && !single_succ_p (gimple_bb (insert_point)))
     /* We have no idea where to insert - it depends on where the
        uses will be placed.  */
     gcc_unreachable ();

Reply via email to