[gcc r16-9384] [PATCH] combine: Check against CLOBBER in make_compound_operation_int [PR125209]

Richard Biener via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:8b146837cefcee5955687879a60fb6aa8accc11d

commit r16-9384-g8b146837cefcee5955687879a60fb6aa8accc11d
Author: Boudewijn van der Heide <[email protected]>
Date:   Sun May 10 21:46:48 2026 -0600

    [PATCH] combine: Check against CLOBBER in make_compound_operation_int [PR125209]
    
    In combine_simplify_rtx, CLOBBER can be returned, which is propagated to
    make_compound_operation.  When make_compound_operation_int then calls
    simplify_subreg, it triggers a gcc_assert, because the mode is neither inner,
    nor void. This results in an ICE.
    
    We fix this by checking if we got CLOBBER before calling simplify_subreg from
    make_compound_operation and bail out; we return NULL_RTX.
    
    Testcase from the bug report by Zhendong Su.
    
    Bootstrapped and tested on x86_64-linux-gnu.
    
            PR rtl-optimization/125209
    
    gcc/
            * combine.cc (make_compound_operation_int): Return NULL_RTX if we got CLOBBER.
    
    gcc/testsuite/
            * gcc.dg/pr125209.c: New test.
    
    Signed-off-by: Boudewijn van der Heide <[email protected]>
    (cherry picked from commit a33f80c6ed06037bd1d31680ae3152e362931f51)

Diff:
---
 gcc/combine.cc                  |  6 ++++++
 gcc/testsuite/gcc.dg/pr125209.c | 13 +++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/gcc/combine.cc b/gcc/combine.cc
index e0dab3d88280..081b13fa4e43 100644
--- a/gcc/combine.cc
+++ b/gcc/combine.cc
@@ -8437,6 +8437,12 @@ make_compound_operation_int (scalar_int_mode mode, rtx *x_ptr,
 
 	tem = make_compound_operation (inner, subreg_code);
 
+	/* TEM's code might be CLOBBER if combine_simplify_rtx
+	   could not transform a subexpression, e.g. a volatile MEM.
+	   simplify_subreg cannot be called with clobber, so bail out.  */
+	if (GET_CODE (tem) == CLOBBER)
+	  return NULL_RTX;
+
 	simplified
 	  = simplify_subreg (mode, tem, GET_MODE (inner), SUBREG_BYTE (x));
 	if (simplified)
diff --git a/gcc/testsuite/gcc.dg/pr125209.c b/gcc/testsuite/gcc.dg/pr125209.c
new file mode 100644
index 000000000000..8fb81cc820e9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr125209.c
@@ -0,0 +1,13 @@
+/* PR rtl-optimization/125209 */
+/* { dg-do compile } */
+/* { dg-options "-O1 -fno-tree-sink" } */
+
+int a, b;
+volatile unsigned c;
+extern void d(unsigned short);
+int e(long f) { return a ? f : 0; }
+int main() {
+  int g = e(c ^ !b);
+  d(g);
+  return 0;
+}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.