[PATCH] Fix scheduling undeterminism from sorting with DEBUG_INSNs
Richard Biener
rguenther@suse.de
Sat Jan 31 11:50:00 GMT 2015
On January 31, 2015 9:01:02 AM CET, Maxim Kuvyrkov <maxim.kuvyrkov@linaro.org> wrote:
>On Jan 31, 2015, at 7:33 AM, Jeff Law <law@redhat.com> wrote:
>
>> On 01/22/15 12:01, Maxim Kuvyrkov wrote:
>>> On Jan 22, 2015, at 8:11 PM, Jeff Law <law@redhat.com> wrote:
>>>
>>>> On 01/19/15 06:07, Maxim Kuvyrkov wrote:
>>>>>
>>>>> The underlying problem is that the order in which elements of
>>>>> ready_list are compared matters to the final result. This is
>>>>> because rank_for_schedule sorting heuristic establishes a partial
>>>>> order on the set of instructions, and it can happen that with 3
>>>>> instructions A, B and C: A>B, B>C, C>A. In this situation the
>>>>> order in which qsort compares the elements affects the final
>>>>> result, it can be either ABC or BCA or CAB.
>>>> So how precisely do we get A > B, B > C and C > A? Unless I'm
>>>> missing something, that seems to be an extremely bad result from
>>>> rank_for_schedule.
>>>
>>> This happens when all 3 instructions have (1) same priority, and (2)
>>> only two of the three instructions are comparable on a "selective"
>>> heuristic. "Selective" means that a heuristic only applies to a
>>> subset of instructions, e.g., comparing speculative instructions
>>> among themselves (ia64), or comparing memory operations among
>>> themselves (what ached auto-prefetcher model does).
>>>
>>> Let's say that A and B are memory instructions and A < B as decided
>>> by autoprefetcher heuristic. C is not a memory instruction, and its
>>> rank resolved by comparing number of forward dependencies to those
>of
>>> A and B. Specifically, B has less forward dependencies than C, so B
>>> < C, but A has more forward dependencies than C, so C < A.
>>>
>>> Code-quality-wise, this quirk of rank_for_schedule is harmless,
>since
>>> it occurs only for very similarly-ranked instructions. The problem
>>> appears only when length of ready_list changes (due to DEBUG_INSNs)
>>> as that can cause different pairs of instructions to be compared.
>> Again, thanks for taking the time to go into the gory details.
>>
>> ISTM the core issues are that we have heuristics in the comparison
>routine that apply to some insns and not others and we get a different
>pivot-point in the qsort because of the presence of debug insns.
>>
>> Your solution seems as reasonable as anything.
>>
>> Approved.
>
>Richard,
>
>Since this patches fixes a bootstrap miscompare on primary architecture
>(arm-linux-gnuebihf/-mcpu=cortex-a15) I think it qualifies for stage 4.
>Any objections to committing the patch? It will be
>re-bootstrapped/re-tested on fresh trunk for x86_64-linux-gnu and
>arm-linux-gnueabihf before commit.
It's fine to commit.
Richard.
>Thank you,
>
>--
>Maxim Kuvyrkov
>www.linaro.org
More information about the Gcc-patches
mailing list