Commit 7afd1a8e by Walter Lee Committed by Walter Lee

Fix a bug in tilegx_fixup_pcrel_references...

Fix a bug in tilegx_fixup_pcrel_references, to properly match and
fixup the second instruction of the instruction sequence to generate a
pc relative address.

	* config/tilegx/tilegx.c (match_pcrel_step2): Fix instruction
	pattern.
	(replace_mov_pcrel_step2): Ditto.

From-SVN: r184582
parent f6d2bbba
2012-02-26 Walter Lee <walt@tilera.com>
* config/tilegx/tilegx.c (match_pcrel_step2): Fix instruction
pattern.
(replace_mov_pcrel_step2): Ditto.
2012-02-25 Alexandre Oliva <aoliva@redhat.com> 2012-02-25 Alexandre Oliva <aoliva@redhat.com>
PR debug/52001 PR debug/52001
......
...@@ -4420,7 +4420,9 @@ replace_mov_pcrel_step1 (rtx insn) ...@@ -4420,7 +4420,9 @@ replace_mov_pcrel_step1 (rtx insn)
static bool static bool
match_pcrel_step2 (rtx insn) match_pcrel_step2 (rtx insn)
{ {
rtx src; rtx unspec;
rtx addr;
if (TARGET_32BIT) if (TARGET_32BIT)
{ {
if (recog_memoized (insn) != CODE_FOR_insn_addr_shl16insli_32bit) if (recog_memoized (insn) != CODE_FOR_insn_addr_shl16insli_32bit)
...@@ -4432,11 +4434,12 @@ match_pcrel_step2 (rtx insn) ...@@ -4432,11 +4434,12 @@ match_pcrel_step2 (rtx insn)
return false; return false;
} }
src = SET_SRC (PATTERN (insn)); unspec = SET_SRC (PATTERN (insn));
addr = XVECEXP (unspec, 0, 1);
return (GET_CODE (src) == CONST return (GET_CODE (addr) == CONST
&& GET_CODE (XEXP (src, 0)) == UNSPEC && GET_CODE (XEXP (addr, 0)) == UNSPEC
&& XINT (XEXP (src, 0), 1) == UNSPEC_HW0_PCREL); && XINT (XEXP (addr, 0), 1) == UNSPEC_HW0_PCREL);
} }
...@@ -4446,6 +4449,7 @@ replace_mov_pcrel_step2 (rtx insn) ...@@ -4446,6 +4449,7 @@ replace_mov_pcrel_step2 (rtx insn)
{ {
rtx pattern = PATTERN (insn); rtx pattern = PATTERN (insn);
rtx unspec; rtx unspec;
rtx addr;
rtx opnds[3]; rtx opnds[3];
rtx new_insns; rtx new_insns;
rtx got_rtx = tilegx_got_rtx (); rtx got_rtx = tilegx_got_rtx ();
...@@ -4453,10 +4457,18 @@ replace_mov_pcrel_step2 (rtx insn) ...@@ -4453,10 +4457,18 @@ replace_mov_pcrel_step2 (rtx insn)
gcc_assert (GET_CODE (pattern) == SET); gcc_assert (GET_CODE (pattern) == SET);
opnds[0] = SET_DEST (pattern); opnds[0] = SET_DEST (pattern);
unspec = XEXP (SET_SRC (pattern), 0); unspec = SET_SRC (pattern);
gcc_assert (GET_CODE (unspec) == UNSPEC);
gcc_assert (XINT (unspec, 1) == UNSPEC_INSN_ADDR_SHL16INSLI);
opnds[1] = XVECEXP (unspec, 0, 0);
addr = XVECEXP (unspec, 0, 1);
gcc_assert (GET_CODE (addr) == CONST);
unspec = XEXP (addr, 0);
gcc_assert (GET_CODE (unspec) == UNSPEC); gcc_assert (GET_CODE (unspec) == UNSPEC);
gcc_assert (XINT (unspec, 1) == UNSPEC_HW0_PCREL); gcc_assert (XINT (unspec, 1) == UNSPEC_HW0_PCREL);
opnds[1] = XEXP (XEXP (SET_SRC (pattern), 0), 0);
opnds[2] = XVECEXP (unspec, 0, 0); opnds[2] = XVECEXP (unspec, 0, 0);
/* We only need to replace SYMBOL_REFs, not LABEL_REFs. */ /* We only need to replace SYMBOL_REFs, not LABEL_REFs. */
......
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