[Issue 5845] New: [CTFE] "stack overflow" with ref ulong argument + CTFE benchmark

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Apr 14 18:17:44 PDT 2011


http://d.puremagic.com/issues/show_bug.cgi?id=5845

           Summary: [CTFE] "stack overflow" with ref ulong argument + CTFE
                    benchmark
           Product: D
           Version: D2
          Platform: x86
        OS/Version: Windows
            Status: NEW
          Keywords: rejects-valid
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody at puremagic.com
        ReportedBy: bearophile_hugs at eml.cc


--- Comment #0 from bearophile_hugs at eml.cc 2011-04-14 18:14:14 PDT ---
This program generates a "stack overflow" with DMD2 2.052, but it compiles and
runs correctly with DMD1 v1.026.

The problem appears to be here:
uint solve(int niv, int dx, ref ulong diag45, ref ulong diag135, ref ulong
cols) {
Removing the ref avoids the problem:
uint solve(int niv, int dx, ulong diag45, ulong diag135, ulong cols) {

Additionally: this program (with enum result=nqueen(10);) can also be used as
one benchmark for CTFE speed (if run at runtime it allocates no heap memory).



import std.c.stdio: printf;

bool test(int k, int j, ulong diag45, ulong diag135, ulong cols) {
    return ((cols    & (1UL << j)) +
            (diag135 & (1UL << (j + k))) +
            (diag45  & (1UL << (32 + j - k))) ) == 0;
}

void mark(int k, int j, ref ulong diag45, ref ulong diag135, ref ulong cols) {
    cols    ^= (1UL << j);
    diag135 ^= (1UL << (j + k));
    diag45  ^= (1UL << (32 + j - k));
}

//uint solve(int niv, int dx, ulong diag45, ulong diag135, ulong cols) { // OK
uint solve(int niv, int dx, ref ulong diag45, ref ulong diag135, ref ulong
cols) { // stack overflow
    uint solutions_found;

    if (niv) {
        for (int i = 0; i < dx; i++)
            if (test(niv, i, diag45, diag135, cols)) {
                mark(niv, i, diag45, diag135, cols);
                solutions_found += solve(niv - 1, dx, diag45, diag135, cols);
                mark(niv, i, diag45, diag135, cols);
            }
    } else {
        for (int i = 0; i < dx; i++)
            solutions_found += test(0, i, diag45, diag135, cols);
    }

    return solutions_found;
}

ulong nqueen(int n) {
    ulong diag45  = 0; // / diagonal bitboard
    ulong diag135 = 0; // \ diagonal bitboard
    ulong cols    = 0; // column bitboard

    return solve(n - 1, n, diag45, diag135, cols);
}

const ulong result = nqueen(8);

void main() {
    // NQUEENS: 1, 0, 0, 2, 10, 4, 40, 92, 352, 724,
    //          2_680, 14_200, 73_712, 365_596
    printf("%lld\n", result);
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list