diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc index 4e94b2f742e..0e4fdcd2853 100644 --- a/gcc/config/i386/i386-features.cc +++ b/gcc/config/i386/i386-features.cc @@ -4083,7 +4083,9 @@ ix86_emit_tls_call (rtx tls_set, x86_cse_kind kind, basic_block bb, rtx link; for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) - if (REG_NOTE_KIND (link) == REG_DEAD + if ((REG_NOTE_KIND (link) == REG_DEAD + || (REG_NOTE_KIND (link) == REG_UNUSED + && REGNO (XEXP (link, 0)) == FLAGS_REG)) && REG_P (XEXP (link, 0))) { /* Mark the live caller-saved register as dead. */ diff --git a/gcc/testsuite/g++.dg/torture/pr124137.C b/gcc/testsuite/g++.dg/torture/pr124137.C new file mode 100644 index 00000000000..538433e958b --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr124137.C @@ -0,0 +1,41 @@ +// { dg-do compile } +// { dg-require-effective-target fpic } +// { dg-additional-options "-fPIC" } + +inline int &GetErrorRef() { + thread_local int err; + return err; +} +int SetError_err; +bool isREG___trans_tmp_4; +struct Operand { + int : 6; + int kind_ : 10; + int bit_ : 14; +protected: + int : 11; +public: + bool isREG(int bit) { + isREG___trans_tmp_4 = kind_ && bit_ & bit; + return isREG___trans_tmp_4; + } + int getBit() { return bit_; } +}; +struct Reg : Operand { +} index_, fp8_to_f16_upconvert_to_vnni_reg_data; +enum { i32e = 4 }; +struct RegExp { + RegExp(Reg &r) { + if (r.isREG(i32e)) + GetErrorRef() = SetError_err; + if (r.getBit()) + index_ = r; + } +}; +struct X { + void operator[](RegExp); +} ptr; +void jit_brgemm_amx_uker_base_tfp8_to_f16_upconvert_to_vnni(Reg reg_buf) { + RegExp __trans_tmp_3 = fp8_to_f16_upconvert_to_vnni_reg_data; + ptr[reg_buf]; +}