Don't mark clobbered FLAGS_REG as live in

(parallel [(set (reg:SI 119)
                (lshiftrt:SI (reg:SI 121)
                    (const_int 16 [0x10])))
           (clobber (reg:CC 17 flags))])

gcc/

PR target/124136
* config/i386/i386-features.cc (ix86_check_flags_reg): Don't
mark clobbered FLAGS_REG as live.

gcc/testsuite/

PR target/124136
* g++.target/i386/pr124136.C: New file.


-- 
H.J.
From 1da458fe8a15af4b7a34a714b35576b7816c6764 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <[email protected]>
Date: Tue, 17 Feb 2026 13:45:09 +0800
Subject: [PATCH] x86: Don't mark clobbered FLAGS_REG as live

Don't mark clobbered FLAGS_REG as live in

(parallel [(set (reg:SI 119)
                (lshiftrt:SI (reg:SI 121)
                    (const_int 16 [0x10])))
           (clobber (reg:CC 17 flags))])

gcc/

	PR target/124136
	* config/i386/i386-features.cc (ix86_check_flags_reg): Don't
	mark clobbered FLAGS_REG as live.

gcc/testsuite/

	PR target/124136
	* g++.target/i386/pr124136.C: New file.

Signed-off-by: H.J. Lu <[email protected]>
---
 gcc/config/i386/i386-features.cc         |  5 +++-
 gcc/testsuite/g++.target/i386/pr124136.C | 29 ++++++++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.target/i386/pr124136.C

diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
index d5435f009cb..4e94b2f742e 100644
--- a/gcc/config/i386/i386-features.cc
+++ b/gcc/config/i386/i386-features.cc
@@ -3903,8 +3903,11 @@ ix86_get_dominator_for_reg (unsigned int regno, basic_block bb)
    registers, if DEST is FLAGS register.  */
 
 static void
-ix86_check_flags_reg (rtx dest, const_rtx, void *data)
+ix86_check_flags_reg (rtx dest, const_rtx x, void *data)
 {
+  if (GET_CODE (x) == CLOBBER)
+    return;
+
   auto_bitmap *live_caller_saved_regs = (auto_bitmap *) data;
   if (REG_P (dest) && REGNO (dest) == FLAGS_REG)
     bitmap_set_bit (*live_caller_saved_regs, FLAGS_REG);
diff --git a/gcc/testsuite/g++.target/i386/pr124136.C b/gcc/testsuite/g++.target/i386/pr124136.C
new file mode 100644
index 00000000000..331ff46bb66
--- /dev/null
+++ b/gcc/testsuite/g++.target/i386/pr124136.C
@@ -0,0 +1,29 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O1 -fPIC -fvisibility=internal -mtls-dialect=gnu" } */
+
+__thread int err;
+bool m;
+struct Operand {
+  int : 6;
+  int kind_ : 10;
+  int bit_ : 4;
+  Operand(){};
+};
+struct Reg32e : Operand {};
+Operand mm;
+void f1();
+void f(Reg32e B) {
+  for (;;)
+  {
+    Operand &r = B;
+    m = r.kind_ && r.bit_ & 1;
+    if (err)
+      err = 1;
+    int t = r.bit_;
+    if (t)
+      mm = r;
+    f1();
+  }
+}
+
+/* { dg-final { scan-assembler-times "call\[ \t\]__tls_get_addr@PLT" 1 { target { ! ia32 } } } } */
-- 
2.53.0

Reply via email to