Commit 97eb24c4 by Jakub Jelinek Committed by Jakub Jelinek

re PR rtl-optimization/70460 (Miscompilation of glibc on i686-linux starting with r234101)

	PR rtl-optimization/70460
	* ira.c (indirect_jump_optimize): Don't substitute LABEL_REF
	with operand from REG_LABEL_OPERAND, instead substitute
	SET_SRC or REG_EQUAL note content if it is a LABEL_REF.
	Don't do anything for REG_NON_LOCAL_GOTO jumps.

	* gcc.c-torture/execute/pr70460.c: New test.

From-SVN: r234614
parent d4aff57b
2016-03-31 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/70460
* ira.c (indirect_jump_optimize): Don't substitute LABEL_REF
with operand from REG_LABEL_OPERAND, instead substitute
SET_SRC or REG_EQUAL note content if it is a LABEL_REF.
Don't do anything for REG_NON_LOCAL_GOTO jumps.
2016-03-31 Martin Liska <mliska@suse.cz> 2016-03-31 Martin Liska <mliska@suse.cz>
* passes.c (execute_one_pass): Do not call * passes.c (execute_one_pass): Do not call
......
...@@ -3870,7 +3870,8 @@ indirect_jump_optimize (void) ...@@ -3870,7 +3870,8 @@ indirect_jump_optimize (void)
FOR_EACH_BB_REVERSE_FN (bb, cfun) FOR_EACH_BB_REVERSE_FN (bb, cfun)
{ {
rtx_insn *insn = BB_END (bb); rtx_insn *insn = BB_END (bb);
if (!JUMP_P (insn)) if (!JUMP_P (insn)
|| find_reg_note (insn, REG_NON_LOCAL_GOTO, NULL_RTX))
continue; continue;
rtx x = pc_set (insn); rtx x = pc_set (insn);
...@@ -3884,19 +3885,18 @@ indirect_jump_optimize (void) ...@@ -3884,19 +3885,18 @@ indirect_jump_optimize (void)
if (!DF_REF_IS_ARTIFICIAL (def)) if (!DF_REF_IS_ARTIFICIAL (def))
{ {
rtx_insn *def_insn = DF_REF_INSN (def); rtx_insn *def_insn = DF_REF_INSN (def);
rtx note = find_reg_note (def_insn, REG_LABEL_OPERAND, NULL_RTX); rtx lab = NULL_RTX;
rtx set = single_set (def_insn);
if (note) if (set && GET_CODE (SET_SRC (set)) == LABEL_REF)
lab = SET_SRC (set);
else
{ {
/* Substitute a LABEL_REF to the label given by the rtx eqnote = find_reg_note (def_insn, REG_EQUAL, NULL_RTX);
note rather than using SET_SRC of DEF_INSN. if (eqnote && GET_CODE (XEXP (eqnote, 0)) == LABEL_REF)
DEF_INSN might be loading the label constant from lab = XEXP (eqnote, 0);
a constant pool, which isn't what we want in a
direct branch. */
rtx lab = gen_rtx_LABEL_REF (Pmode, XEXP (note, 0));
if (validate_replace_rtx (SET_SRC (x), lab, insn))
rebuild_p = true;
} }
if (lab && validate_replace_rtx (SET_SRC (x), lab, insn))
rebuild_p = true;
} }
} }
} }
......
2016-03-31 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/70460
* gcc.c-torture/execute/pr70460.c: New test.
2016-03-31 Richard Biener <rguenther@suse.de> 2016-03-31 Richard Biener <rguenther@suse.de>
PR c++/70430 PR c++/70430
......
/* PR rtl-optimization/70460 */
int c;
__attribute__((noinline, noclone)) void
foo (int x)
{
static int b[] = { &&lab1 - &&lab0, &&lab2 - &&lab0 };
void *a = &&lab0 + b[x];
goto *a;
lab1:
c += 2;
lab2:
c++;
lab0:
;
}
int
main ()
{
foo (0);
if (c != 3)
__builtin_abort ();
foo (1);
if (c != 4)
__builtin_abort ();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment