arc: Fix for loop end detection

Programming / Compilers / GCC - aburgess [138bc75d-0d04-0410-961f-82ee72b054a4] - 14 April 2017 17:14 EDT

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.

6ec406c arc: Fix for loop end detection
gcc/ChangeLog | 6 +++++
gcc/config/arc/arc.c | 5 ++--
gcc/testsuite/ChangeLog | 4 ++++
gcc/testsuite/gcc.target/arc/loop-1.c | 45 +++++++++++++++++++++++++++++++++++
4 files changed, 58 insertions(+), 2 deletions(-)

Upstream: gcc.gnu.org


  • Share