arc: Fix for loop end detection
We use a negative ID number to link together the doloop_begin and doloop_end instructions. This negative ID number is setup within doloop_begin, at this point the ID is stored into the loop end instruction (doloop_end_i) and placed into the doloop_begin_i instruction. In arc.c (arc_reorg) we extract the ID from the doloop_end_i instruction in order to find the matching doloop_begin_i instruction, though the ID is only used in some cases. Currently in arc_reorg when we extract the ID we negate it. This negation is invalid. The ID stored in both doloop_end_i and doloop_begin_i is already negative, the negation in arc_reorg means that if we need to use the ID to find the doloop_begin_i then we will never find it (as the IDs will never match). This commit removes the unneeded negation, moves the extraction of the ID into a more appropriately scoped block and adds a new test for this issue. gcc/ChangeLog: * config/arc/arc.c (arc_reorg): Move loop_end_id into a more local block, and do not negate it, the stored id is already negative. gcc/testsuite/ChangeLog: * gcc.target/arc/loop-1.c: New file. Co-Authored-By: Guy Benyei <guybe@mellanox.com> From-SVN: r246933
This commit is contained in:
parent
8c1d6b64e3
commit
dd3d6a42fc
|
@ -1,3 +1,9 @@
|
|||
2017-04-14 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
Guy Benyei <guybe@mellanox.com>
|
||||
|
||||
* config/arc/arc.c (arc_reorg): Move loop_end_id into a more local
|
||||
block, and do not negate it, the stored id is already negative.
|
||||
|
||||
2017-04-14 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
* config/arc/arc.md (doloop_begin_i): Use @pcl assembler syntax.
|
||||
|
|
|
@ -6569,8 +6569,6 @@ arc_reorg (void)
|
|||
rtx_insn *lp_simple = NULL;
|
||||
rtx_insn *next = NULL;
|
||||
rtx op0 = XEXP (XVECEXP (PATTERN (insn), 0, 1), 0);
|
||||
HOST_WIDE_INT loop_end_id
|
||||
= -INTVAL (XEXP (XVECEXP (PATTERN (insn), 0, 4), 0));
|
||||
int seen_label = 0;
|
||||
|
||||
for (lp = prev;
|
||||
|
@ -6581,6 +6579,9 @@ arc_reorg (void)
|
|||
if (!lp || !NONJUMP_INSN_P (lp)
|
||||
|| dead_or_set_regno_p (lp, LP_COUNT))
|
||||
{
|
||||
HOST_WIDE_INT loop_end_id
|
||||
= INTVAL (XEXP (XVECEXP (PATTERN (insn), 0, 4), 0));
|
||||
|
||||
for (prev = next = insn, lp = NULL ; prev || next;)
|
||||
{
|
||||
if (prev)
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2017-04-14 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
* gcc.target/arc/loop-1.c: New file.
|
||||
|
||||
2017-04-14 Michael Meissner <meissner@linux.vnet.ibm.com>
|
||||
|
||||
PR target/80098
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2" } */
|
||||
|
||||
/* This case would fail to make use of the zero-overhead loop
|
||||
instruction at one time due to a bug. */
|
||||
|
||||
extern char a[];
|
||||
|
||||
struct some_t
|
||||
{
|
||||
struct
|
||||
{
|
||||
int aaa;
|
||||
short bbb;
|
||||
char ccc;
|
||||
char ddd;
|
||||
} ppp[8];
|
||||
|
||||
int www[1];
|
||||
};
|
||||
|
||||
int b;
|
||||
|
||||
void
|
||||
some_function ()
|
||||
{
|
||||
struct some_t *tmp = (struct some_t *) a;
|
||||
|
||||
while ((*tmp).ppp[b].ccc)
|
||||
while(0);
|
||||
|
||||
for (; b; b++)
|
||||
{
|
||||
if (tmp->ppp[b].ccc)
|
||||
{
|
||||
int c = tmp->ppp[b].bbb;
|
||||
int d = tmp->ppp[b].aaa;
|
||||
int e = d - tmp->www[c];
|
||||
if (e)
|
||||
tmp->ppp[b].ddd = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler "\[^\n\]+lp \\.L__GCC__" } } */
|
Loading…
Reference in New Issue