[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