diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
index c09abf8fc2070396bde8ad7e0abf915fe012ec61..a0a73486d369cd17c0b16ddb72ad0bc963d15f9b 100644
--- a/gcc/config/i386/i386-features.cc
+++ b/gcc/config/i386/i386-features.cc
@@ -1635,10 +1635,11 @@ timode_scalar_chain::convert_insn (rtx_insn *insn)
   switch (GET_CODE (src))
     {
     case REG:
-      PUT_MODE (src, V1TImode);
-      /* Call fix_debug_reg_uses only if SRC is never defined.  */
-      if (!DF_REG_DEF_CHAIN (REGNO (src)))
-	fix_debug_reg_uses (src);
+      if (GET_MODE (src) == TImode)
+	{
+	  PUT_MODE (src, V1TImode);
+	  fix_debug_reg_uses (src);
+	}
       break;
 
     case MEM:
diff --git a/gcc/testsuite/g++.target/i386/pr109676.C b/gcc/testsuite/g++.target/i386/pr109676.C
new file mode 100644
index 0000000000000000000000000000000000000000..555a5688fa6ca3a69fe6c8950c72281e0d88a323
--- /dev/null
+++ b/gcc/testsuite/g++.target/i386/pr109676.C
@@ -0,0 +1,46 @@
+// PR debug/109676
+// { dg-do compile { target c++11 } }
+// { dg-options "-O2 -g -march=alderlake" }
+
+template <class T>
+struct A {
+  T a;
+  char b;
+  template <typename U>
+  A (U x, int) : a{x} {}
+  A (...);
+  T foo () { return a; }
+};
+bool bar ();
+struct B { int c, d; unsigned char e[8]; };
+bool baz ();
+struct C { C () : f () {} B &boo () { return f; } B f; };
+
+A<B>
+qux ()
+{
+  {
+    A<B> p;
+    bool t = true;
+    for (; bar ();)
+      if (baz ())
+	{
+	  t = false;
+	  break;
+	}
+    if (t)
+      p.b = false;
+    return p;
+  }
+}
+
+A<C>
+garply ()
+{
+  C g;
+  A<B> h = qux ();
+  if (!h.b)
+    return 0;
+  g.boo () = h.foo ();
+  return A<C>{g, 0};
+}