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}; +}