2022-03-08 Marek Polacek PR rtl-optimization/104777 * rtl.cc (classify_insn): For ASM_OPERANDS, return JUMP_INSN only if ASM_OPERANDS_LABEL_VEC has at least one element. * gcc.dg/torture/tls/pr104777.c: New test. --- gcc/rtl.cc +++ gcc/rtl.cc @@ -765,7 +765,7 @@ classify_insn (rtx x) return CALL_INSN; if (ANY_RETURN_P (x)) return JUMP_INSN; - if (GET_CODE (x) == ASM_OPERANDS && ASM_OPERANDS_LABEL_VEC (x)) + if (GET_CODE (x) == ASM_OPERANDS && ASM_OPERANDS_LABEL_LENGTH (x)) return JUMP_INSN; if (GET_CODE (x) == SET) { @@ -794,7 +794,7 @@ classify_insn (rtx x) if (has_return_p) return JUMP_INSN; if (GET_CODE (XVECEXP (x, 0, 0)) == ASM_OPERANDS - && ASM_OPERANDS_LABEL_VEC (XVECEXP (x, 0, 0))) + && ASM_OPERANDS_LABEL_LENGTH (XVECEXP (x, 0, 0))) return JUMP_INSN; } #ifdef GENERATOR_FILE --- gcc/testsuite/gcc.dg/torture/tls/pr104777.c +++ gcc/testsuite/gcc.dg/torture/tls/pr104777.c @@ -0,0 +1,30 @@ +/* PR rtl-optimization/104777 */ +/* { dg-do compile } */ +/* { dg-require-effective-target tls } */ + +int savestate_r; +int savestate_ssb; +extern void abort(); +__thread int loop; +void f (void) +{ + int savestate_r0_5; + int savestate_r1_6; + + __asm__("" : "=m" (savestate_ssb), "=r" (savestate_r)); + savestate_r0_5 = savestate_r; + if (savestate_r0_5 == 0) + { + __asm__ __volatile__("" : : "m" (loop)); + abort (); + } + + __asm__("" : "=m" (savestate_ssb), "=r" (savestate_r)); + savestate_r1_6 = savestate_r; + if (savestate_r1_6 != 0) + return; + + __asm__ __volatile__("" : : "m" (loop)); + abort (); + +}