aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/config/i386/i386-features.cc9
-rw-r--r--gcc/testsuite/g++.target/i386/pr109676.C46
2 files changed, 51 insertions, 4 deletions
diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
index c09abf8..a0a7348 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 0000000..555a568
--- /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};
+}